Sdílet prostřednictvím


Použití odhadce zdroje 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 posouvá vpřed ve vašem změnovém kanálu a doručuje změny implementaci delegáta.

Nasazení zpracovatele kanálu změn může zpracovávat změny určitým tempem na základě dostupných prostředků, jako jsou procesor, paměť, síť a podobně.

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álování nasazení procesoru sledování 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é zpoždění pro pronájem
  • 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 pronájmu a prodlevě a také o tom, která je aktuální instance, která jej 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 odhadovače může sledovat průběh všech pronájmů a instancí v nasazení procesoru sledování změn.

Každý odhad využívá jednotky požadavků z vašich monitorovaných a zapůjčených kontejnerů. 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 jak pro režim nejnovější verze, tak pro režim všech verzí a odstranění. V obourežimch

Další materiály

Další kroky

Nyní se můžete dozvědět více o procesoru změnového toku v následujícím článku: