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 mierzy różnicę między ostatnim przetworzonym elementem (zdefiniowanym przez stan kontenera dzierżaw) i najnowszą zmianą w kontenerze i wypycha 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 korzysta z najnowszego trybu wersji i 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 otrzymuje liczbę, która reprezentuje liczbę oczekujących zmian do odczytania przez procesor, oraz interwał 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żdy ChangeFeedProcessorState
z nich 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 wystąpieniu z procesorów. 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 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.
Obsługiwane tryby zestawienia zmian
Narzędzie do szacowania zestawienia zmian może być używane zarówno w trybie najnowszej wersji, jak i we wszystkich wersjach oraz w trybie usuwania. W obu trybach podane oszacowanie nie gwarantuje dokładnej liczby zaległych zmian w procesie.
Dodatkowe zasoby
- Azure Cosmos DB SDK
- Przykłady użycia w witrynie GitHub (najnowsza wersja platformy .NET)
- Przykłady użycia w witrynie GitHub (wszystkie wersje i usunięcia platformy .NET)
- Przykłady użycia w witrynie GitHub (Java)
- Dodatkowe przykłady w witrynie GitHub
Następne kroki
Teraz możesz dowiedzieć się więcej o procesorze zestawienia zmian w następującym artykule: