Použití estimátoru kanálu změn
PLATÍ PRO: NoSQL
Tento článek popisuje, jak můžete sledovat průběh instancí procesoru kanálu změn při čtení kanálu změn.
Proč je monitorování průběhu důležité?
Procesor kanálu změn funguje jako ukazatel, který se posune vpřed v kanálu změn a doručí změny implementaci delegáta.
Nasazení procesoru kanálu změn může zpracovávat změny určitým tempem na základě dostupných prostředků, jako je procesor, paměť, síť atd.
Pokud je tato rychlost pomalejší než rychlost, s jakou se vaše změny v kontejneru Azure Cosmos DB provádí, procesor se začne zaostávat.
Identifikace tohoto scénáře pomáhá pochopit, jestli potřebujeme škálovat nasazení procesoru kanálu změn.
Implementace estimátoru kanálu změn
Jako model nabízených oznámení pro automatická oznámení
Podobně jako procesor kanálu změn může estimátor kanálu změn fungovat jako model nabízených oznámení. Estimátor měří rozdíl mezi poslední zpracovávanou položkou (definovanou stavem kontejneru zapůjčení) a poslední změnou v kontejneru a odešle tuto hodnotu delegátu. Interval, ve kterém je měření pořízeno, lze také přizpůsobit výchozí hodnotou 5 sekund.
Pokud například procesor kanálu změn používá nejnovější režim verze a definuje se takto:
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();
Správný způsob inicializace odhadce pro měření procesoru by vypadal GetChangeFeedEstimatorBuilder
takto:
ChangeFeedProcessor changeFeedEstimator = monitoredContainer
.GetChangeFeedEstimatorBuilder("changeFeedEstimator", Program.HandleEstimationAsync, TimeSpan.FromMilliseconds(1000))
.WithLeaseContainer(leaseContainer)
.Build();
Kde procesor i odhadce sdílejí stejný leaseContainer
a stejný název.
Další dva parametry jsou delegát, který obdrží číslo, které představuje , kolik změn čeká na čtení procesorem, a časový interval, ve kterém chcete toto měření vzít.
Příkladem delegáta, který obdrží odhad, je:
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);
}
Tento odhad můžete odeslat do svého monitorovacího řešení a použít ho k pochopení toho, jak se váš pokrok v průběhu času chová.
Podrobný odhad na vyžádání
Na rozdíl od modelu nabízení existuje alternativa, která umožňuje získat odhad na vyžádání. Tento model také poskytuje podrobnější informace:
- Odhadovaná prodleva na zapůjčení
- Instance, která vlastní a zpracovává každé zapůjčení, takže můžete zjistit, jestli u instance došlo k problému.
Pokud je procesor kanálu změn definovaný takto:
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();
Odhadce můžete vytvořit se stejnou konfigurací zapůjčení:
ChangeFeedEstimator changeFeedEstimator = monitoredContainer
.GetChangeFeedEstimator("changeFeedEstimator", leaseContainer);
A kdykoli to budete chtít, s požadovanou frekvencí, můžete získat podrobný odhad:
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ždý ChangeFeedProcessorState
obsahuje informace o zapůjčení a prodlevě a také o tom, kdo je aktuální instancí, která ji vlastní.
Nasazení estimátoru
Estimátor kanálu změn nemusí být nasazený jako součást procesoru kanálu změn ani nemusí být součástí stejného projektu. Doporučujeme nasadit estimátor na nezávislou instanci z procesorů. Jedna instance estimátoru může sledovat průběh všech zapůjčení a instancí v nasazení procesoru kanálu změn.
Každý odhad využívá jednotky žádostí z monitorovaných kontejnerů a kontejnerů zapůjčení. Frekvence mezi 1 minutou je dobrým výchozím bodem, čím nižší je frekvence, tím vyšší spotřebované jednotky žádostí.
Podporované režimy kanálu změn
Nástroj pro odhad kanálu změn se dá použít pro nejnovější režim verze i pro všechny verze a režim odstranění. V obourežimch
Další materiály
- Azure Cosmos DB SDK
- Ukázky využití na GitHubu (nejnovější verze .NET)
- Ukázky využití na GitHubu (všechny verze a odstranění .NET)
- Ukázky využití na GitHubu (Java)
- Další ukázky na GitHubu
Další kroky
Teď můžete pokračovat a získat další informace o procesoru kanálu změn v následujícím článku: