Condividi tramite


Usare lo strumento di stima dei feed di modifiche

SI APPLICA A: NoSQL

Questo articolo descrive come monitorare lo stato di avanzamento delle istanze del processore di feed di modifiche durante la lettura del feed di modifiche.

Perché è importante monitorare lo stato di avanzamento?

Il processore di feed di modifiche funge da puntatore che avanza nel feed di modifiche e distribuisce le modifiche a un'implementazione delegata.

La distribuzione del processore di feed di modifiche può elaborare le modifiche a una determinata frequenza in base alle risorse disponibili, ad esempio CPU, memoria, rete e così via.

Se questa frequenza è più bassa di quella con cui si verificano le modifiche nel contenitore Azure Cosmos DB, il processore inizierà a ritardare.

L'identificazione di questo scenario consente di capire se è necessario ridimensionare la distribuzione del processore di feed di modifiche.

Implementare lo strumento di stima dei feed di modifiche

Come modello push per le notifiche automatiche

Analogamente al processore di feed di modifiche, lo strumento di stima dei feed di modifiche può funzionare come modello push. Lo strumento misura la differenza tra l'ultimo elemento elaborato (definito dallo stato del contenitore di lease) e la modifica più recente nel contenitore ed effettua il push di questo valore a un delegato. L'intervallo in cui viene eseguita la misurazione può anche essere personalizzato con un valore predefinito di 5 secondi.

Ad esempio, se il processore di feed di modifiche è definito come segue:

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();

Il modo corretto per inizializzare uno strumento di stima per misurare il processore consiste nell'uso di GetChangeFeedEstimatorBuilder, come indicato di seguito:

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

In cui sia il processore che lo strumento di stima condividono lo stesso leaseContainer e lo stesso nome.

Gli altri due parametri corrispondono al delegato, che riceverà un numero che rappresenta la quantità di modifiche in sospeso per la lettura da parte del processore e l'intervallo di tempo in cui si vuole che venga eseguita questa misurazione.

Di seguito è riportato un esempio di un delegato che riceve la stima:

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);
}

È possibile inviare questa stima alla soluzione di monitoraggio e usarla per comprendere lo stato di avanzamento nel corso del tempo.

Come stima dettagliata su richiesta

A differenza del modello push, esiste un'alternativa che consente di ottenere la stima su richiesta. Questo modello fornisce anche informazioni più dettagliate:

  • Il ritardo stimato per lease.
  • L'istanza proprietaria e l'elaborazione di ogni lease, per identificare se si verifica un problema in un'istanza.

Se il processore di feed di modifiche è definito come segue:

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();

È possibile creare lo strumento di stima con la stessa configurazione di lease:

ChangeFeedEstimator changeFeedEstimator = monitoredContainer
    .GetChangeFeedEstimator("changeFeedEstimator", leaseContainer);

E ogni volta che lo si desidera, con la frequenza necessaria, è possibile ottenere la stima dettagliata:

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.");
    }
}

Ogni ChangeFeedProcessorState conterrà le informazioni sul lease e sul ritardo e anche sull'istanza proprietaria corrente.

Distribuzione della stima

Non è necessario distribuire lo strumento di stima dei feed di modifiche come parte del processore di feed di modifiche né come parte dello stesso progetto. È consigliabile distribuire la stima in un'istanza indipendente e completamente diversa dai processori. Una singola istanza di stima può tenere traccia dello stato di avanzamento per tutti i lease e le istanze nella distribuzione del processore del feed di modifiche.

Ogni stima utilizzerà unità richiesta dai contenitori monitorati e di lease. Una frequenza compresa di 1 minuto è un buon punto di partenza, minore è la frequenza, maggiore è l'utilizzo delle unità richiesta.

Risorse aggiuntive

Passaggi successivi

È ora possibile procedere ad acquisire altre informazioni sul processore di feed di modifiche negli articoli seguenti: