Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
APLICA-SE A: NoSQL
Este artigo descreve como pode monitorizar o progresso das suas instâncias de processador de feed de alterações à medida que elas leem o feed de alterações.
Por que razão é importante acompanhar os progressos?
O processador de feed de mudanças atua como um ponteiro que avança no feed de mudanças e entrega as alterações a uma implementação delegada.
A implementação do processador de fluxo de alterações pode processar mudanças a uma determinada taxa, com base nos seus recursos disponíveis, como CPU, memória, rede e assim por diante.
Se essa taxa for mais lenta do que a taxa na qual as alterações acontecem no contêiner do Azure Cosmos DB, o processador começará a ficar para trás.
Identificar esta situação ajuda a entender se precisamos dimensionar a implementação do nosso processador de feed de alterações.
Implementar o estimador de fluxo de alterações
Como um modelo push para notificações automáticas
Como o processador de alimentação de alterações, o estimador de alimentação de alterações pode funcionar como um modelo push. O estimador mede a diferença entre o último item processado (definido pelo estado do contêiner de concessão) e a última alteração no contêiner 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 processador de alimentação de alterações estiver usando o modo de versão mais recente 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 maneira correta de inicializar um estimador para medir esse processador estaria usando GetChangeFeedEstimatorBuilder assim:
ChangeFeedProcessor changeFeedEstimator = monitoredContainer
.GetChangeFeedEstimatorBuilder("changeFeedEstimator", Program.HandleEstimationAsync, TimeSpan.FromMilliseconds(1000))
.WithLeaseContainer(leaseContainer)
.Build();
Onde o processador e o estimador compartilham 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 para serem lidas pelo processador, e o intervalo de tempo no qual você deseja que essa medição seja feita.
Um exemplo de um 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);
}
Você pode enviar essa estimativa para sua solução de monitoramento e usá-la para entender como seu progresso está se comportando ao longo do tempo.
Como uma estimativa detalhada a pedido
Em contraste com o modelo push, há uma alternativa que permite obter a estimativa sob demanda. Este modelo também fornece informações mais detalhadas:
- A defasagem estimada por locação.
- A instância responsável por possuir e processar cada locação, permitindo que possas identificar se há um problema em uma instância.
Se o processador de feed de alterações estiver configurado desta forma:
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();
Você pode criar o estimador com a mesma configuração de concessão:
ChangeFeedEstimator changeFeedEstimator = monitoredContainer
.GetChangeFeedEstimator("changeFeedEstimator", leaseContainer);
E sempre que quiser, com a frequência que necessitar, poderá 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 um contém as informações de concessão e atraso e também quem é a instância atual proprietária dele.
Implantação do estimador
O estimador de fluxo de alterações não precisa ser implementado como parte do processador de fluxo de alterações, nem precisa fazer parte do mesmo projeto. Recomendamos implantar o estimador em uma instância independente de seus processadores. Uma única instância do estimador pode acompanhar o progresso de todas as concessões e instâncias na implantação do processador de feed de alterações.
Cada estimativa consome unidades de solicitação dos seus contêineres monitorados e com arrendamento. Uma frequência de 1 minuto no intervalo é um bom ponto de partida, quanto menor a frequência, maior a quantidade de unidades de solicitação consumidas.
Modos de feed de alterações suportados
O estimador de feed de alterações pode ser usado tanto para o modo de versão mais recente quanto para o modo de todas as versões e exclusões. Em ambos os modos, não é garantido que a estimativa fornecida seja uma contagem exata das alterações pendentes no processo.
Recursos adicionais
- Azure Cosmos DB SDK
- Exemplos de uso no GitHub (versão mais recente do .NET)
- Exemplos de uso no GitHub (todas as versões do .NET e eliminações)
- Exemplos de uso no GitHub (Java)
- Exemplos adicionais no GitHub
Próximos passos
Agora você pode continuar para saber mais sobre o processador de alimentação de alterações no seguinte artigo: