Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este artigo descreve como pode monitorizar o progresso das instâncias do seu processador de feed de alterações à medida que leem o feed de alterações.
Porque é importante monitorizar o progresso?
O processador de feed de alterações atua como um ponteiro que avança através do seu feed de alterações e entrega as alterações a uma implementação de delegado.
A implementação do processador de fluxo de alterações pode processar alterações a uma determinada taxa com base nos recursos disponíveis como CPU, memória, rede, e assim por diante.
Se esta taxa for mais lenta do que a velocidade com que as alterações ocorrem no teu contentor Azure Cosmos DB, o teu processador começa a ficar para trás.
Identificar este cenário ajuda-nos a compreender se precisamos de dimensionar a implementação do nosso processador de feed de mudanças.
Implementar o estimador de alimentação de alterações
Como modelo push para notificações automáticas
Tal como o processador de feed de alterações, o estimador de alterações pode funcionar como um modelo push. O estimador mede a diferença entre o último item processado (definido pelo estado do contentor do arrendamento) e a última alteração no contentor, e envia esse valor para um delegado. O intervalo em que a medição é feita também pode ser personalizado com um valor padrão de 5 segundos.
Por exemplo, se o seu processador de feed de alterações estiver a usar o modo de última versão e estiver definido assim:
Container leaseContainer = client.GetContainer(databaseId, Program.leasesContainer);
Container monitoredContainer = client.GetContainer(databaseId, Program.monitoredContainer);
ChangeFeedProcessor changeFeedProcessor = monitoredContainer
.GetChangeFeedProcessorBuilder<ToDoItem>("changeFeedEstimator", Program.HandleChangesAsync)
.WithInstanceName("consoleHost")
.WithLeaseContainer(leaseContainer)
.Build();
A forma correta de inicializar um estimador para medir esse processador seria usando GetChangeFeedEstimatorBuilder a seguinte:
ChangeFeedProcessor changeFeedEstimator = monitoredContainer
.GetChangeFeedEstimatorBuilder("changeFeedEstimator", Program.HandleEstimationAsync, TimeSpan.FromMilliseconds(1000))
.WithLeaseContainer(leaseContainer)
.Build();
Onde tanto o processador quanto o estimador partilham o mesmo leaseContainer e o mesmo nome.
Os outros dois parâmetros são o delegado, que recebe um número que representa quantas alterações estão pendentes de serem lidas pelo processador, e o intervalo de tempo em que se pretende que esta medição seja feita.
Um exemplo de delegado que recebe a estimativa é:
static async Task HandleEstimationAsync(long estimation, CancellationToken cancellationToken)
{
if (estimation > 0)
{
Console.WriteLine($"\tEstimator detected {estimation} items pending to be read by the Processor.");
}
await Task.Delay(0);
}
Pode enviar esta estimativa para a sua solução de monitorização e usá-la para perceber como o seu progresso está a evoluir ao longo do tempo.
Como uma estimativa detalhada sob demanda
Ao contrário do modelo push, existe uma alternativa que permite obter o orçamento sob demanda. Este modelo também fornece informações mais detalhadas:
- O atraso estimado por concessão.
- A instância que detém e processa cada arrendamento, para que possas identificar se há algum problema numa instância.
Se o seu processador de alimentação de alterações estiver definido assim:
Container leaseContainer = client.GetContainer(databaseId, Program.leasesContainer);
Container monitoredContainer = client.GetContainer(databaseId, Program.monitoredContainer);
ChangeFeedProcessor changeFeedProcessor = monitoredContainer
.GetChangeFeedProcessorBuilder<ToDoItem>("changeFeedEstimator", Program.HandleChangesAsync)
.WithInstanceName("consoleHost")
.WithLeaseContainer(leaseContainer)
.Build();
Pode criar o estimador com a mesma configuração de leasing:
ChangeFeedEstimator changeFeedEstimator = monitoredContainer
.GetChangeFeedEstimator("changeFeedEstimator", leaseContainer);
E sempre que quiser, com a frequência que precisa, pode obter a estimativa detalhada:
Console.WriteLine("Checking estimation...");
using FeedIterator<ChangeFeedProcessorState> estimatorIterator = changeFeedEstimator.GetCurrentStateIterator();
while (estimatorIterator.HasMoreResults)
{
FeedResponse<ChangeFeedProcessorState> states = await estimatorIterator.ReadNextAsync();
foreach (ChangeFeedProcessorState leaseState in states)
{
string host = leaseState.InstanceName == null ? $"not owned by any host currently" : $"owned by host {leaseState.InstanceName}";
Console.WriteLine($"Lease [{leaseState.LeaseToken}] {host} reports {leaseState.EstimatedLag} as estimated lag.");
}
}
Cada ChangeFeedProcessorState contém a informação do arrendamento e do atraso, bem como quem é a instância atual que o detém.
Implantação do estimador
O estimador de feed de alterações não precisa de ser implementado como parte do seu processador de feed de alterações, nem de fazer parte do mesmo projeto. Recomendamos que implemente o estimador numa instância independente dos seus processadores. Uma única instância de estimador pode acompanhar o progresso de todas as locações e instâncias na implementação do seu processador de feed de alterações.
Cada estimativa consome unidades de pedido de cada um dos seus contentores monitorizados e de arrendamento. Uma frequência de 1 minuto de intervalo é um bom ponto de partida; quanto menor a frequência, maiores são as unidades de pedido consumidas.
Modos de feed de alterações suportados
O estimador de alterações pode ser usado tanto para o modo de última versão como para todas as versões e modos de eliminação. Em ambos os modos, a estimativa fornecida não garante que seja uma contagem exata das alterações pendentes no processo.
Recursos adicionais
- Azure Cosmos DB SDK
- Exemplos de utilização no GitHub (versão mais recente do .NET)
- Exemplos de utilização no GitHub (.NET todas as versões e eliminações)
- Exemplos de utilização no GitHub (Java)
- Exemplos adicionais no GitHub
Próximos passos
Agora pode saber mais sobre o processador de feed de alterações no artigo a seguir: