Sdílet prostřednictvím


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 změny projeví v kontejneru Azure Cosmos DB, 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 změří rozdíl mezi poslední zpracovávanou položkou (definovanou stavem kontejneru zapůjčení) a nejnovější změnou v kontejneru a nasdílí tuto hodnotu delegátu. Interval, ve kterém je měření pořízeno, lze také přizpůsobit výchozí hodnotou 5 sekund.

Například 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();

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 přeč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ý z nich ChangeFeedProcessorState bude obsahovat informace o zapůjčení a prodlevě a také to, 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 a úplně jinou instanci než procesory. 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 bude spotřebovávat 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í.

Další materiály

Další kroky

Teď můžete pokračovat a získat další informace o procesoru kanálu změn v následujících článcích: