Udostępnij za pośrednictwem


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 jakiej zmiany występują w kontenerze usługi Azure Cosmos DB, procesor zacznie się opóźniać.

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 procesor 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 ostatnim 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 pomiar jest wykonywany, 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 tego procesora będzie używany GetChangeFeedEstimatorBuilder w następujący sposób:

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

Gdzie 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 do odczytania przez procesor, oraz przedział czasu, w którym ma zostać podjęta ta miara.

Przykładem delegata, który otrzymuje oszacowanie, 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.

Jako szczegółowe szacowanie na żądanie

W przeciwieństwie do modelu wypychania istnieje alternatywa umożliwiająca uzyskanie oszacowania 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 oszacowanie:

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 ChangeFeedProcessorState z nich 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 minut 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: