Korzystanie z narzędzia do szacowania zestawienia zmian

DOTYCZY: NoSQL

W tym artykule opisano, jak można monitorować postęp wystąpień procesora zestawienia zmian podczas odczytywania zestawienia zmian.

Dlaczego postęp monitorowania jest ważny?

Procesor zestawienia zmian działa jako wskaźnik, który przechodzi do przodu w kanale zmian i dostarcza zmiany do implementacji delegata.

Wdrożenie procesora zestawienia zmian może przetwarzać zmiany w określonej szybkości na podstawie dostępnych zasobów, takich jak procesor CPU, pamięć, sieć itd.

Jeśli ta szybkość jest niższa niż szybkość, w której zmiany zostaną wprowadzone w kontenerze usługi Azure Cosmos DB, procesor zacznie opóźnić.

Zidentyfikowanie tego scenariusza pomaga zrozumieć, czy musimy skalować wdrożenie procesora zestawienia zmian.

Implementowanie narzędzia do szacowania zestawienia zmian

Jako model wypychania dla powiadomień automatycznych

Podobnie jak w przypadku procesora zestawienia zmian, narzędzie do szacowania zestawienia zmian może działać jako model wypychania. Narzędzie do szacowania będzie mierzyć różnicę między ostatnio przetworzonym elementem (zdefiniowanym przez stan kontenera dzierżaw) i najnowszą zmianą w kontenerze, a następnie wypchnie tę wartość do delegata. Interwał, w którym jest wykonywany pomiar, można również dostosować z wartością domyślną wynoszącą 5 sekund.

Jeśli na przykład procesor zestawienia zmian jest zdefiniowany w następujący sposób:

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();

Prawidłowy sposób inicjowania narzędzia do szacowania w celu mierzenia, którego procesor będzie używał GetChangeFeedEstimatorBuilder w następujący sposób:

ChangeFeedProcessor changeFeedEstimator = monitoredContainer
    .GetChangeFeedEstimatorBuilder("changeFeedEstimator", Program.HandleEstimationAsync, TimeSpan.FromMilliseconds(1000))
    .WithLeaseContainer(leaseContainer)
    .Build();

W przypadku, gdy procesor i narzędzie do szacowania mają taką samą leaseContainer i taką samą nazwę.

Pozostałe dwa parametry to delegat, który otrzyma liczbę, która reprezentuje liczbę oczekujących zmian, które mają zostać odczytane przez procesor, oraz przedział czasu, w którym ma zostać podjęta ta miara.

Przykładem delegata, który otrzymuje szacowanie, jest:

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);
}

Możesz wysłać to oszacowanie do rozwiązania do monitorowania i użyć go, aby zrozumieć, jak postęp działa w czasie.

Szczegółowe szacowanie na żądanie

W przeciwieństwie do modelu wypychania istnieje alternatywa umożliwiająca uzyskanie szacowania na żądanie. Ten model zawiera również bardziej szczegółowe informacje:

  • Szacowane opóźnienie na dzierżawę.
  • Wystąpienie jest właścicielem i przetwarzaniem każdej dzierżawy, aby określić, czy występuje problem w wystąpieniu.

Jeśli procesor zestawienia zmian jest zdefiniowany w następujący sposób:

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();

Narzędzie do szacowania można utworzyć przy użyciu tej samej konfiguracji dzierżawy:

ChangeFeedEstimator changeFeedEstimator = monitoredContainer
    .GetChangeFeedEstimator("changeFeedEstimator", leaseContainer);

I za każdym razem, gdy chcesz, z wymaganą częstotliwością, możesz uzyskać szczegółowe szacowanie:

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.");
    }
}

Każda z nich ChangeFeedProcessorState będzie zawierać informacje o dzierżawie i opóźnieniu, a także o tym, kto jest jego właścicielem.

Wdrażanie narzędzia do szacowania

Narzędzie do szacowania zestawienia zmian nie musi być wdrażane jako część procesora zestawienia zmian ani być częścią tego samego projektu. Zalecamy wdrożenie narzędzia do szacowania na niezależnym i zupełnie innym wystąpieniu niż procesory. Pojedyncze wystąpienie narzędzia do szacowania może śledzić postęp wszystkich dzierżaw i wystąpień we wdrożeniu procesora zestawienia zmian.

Każde oszacowanie będzie zużywać jednostki żądań z monitorowanych kontenerów i dzierżaw. Częstotliwość 1 minuty między jest dobrym punktem wyjścia, im niższa częstotliwość, tym wyższa liczba jednostek żądania zużywanych.

Dodatkowe zasoby

Następne kroki

Teraz możesz dowiedzieć się więcej o procesorze zestawienia zmian w następujących artykułach: