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 inizia 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 Ieasing) 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 del feed di modifiche usa la modalità versione più recente ed è 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 riceve 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 desidera 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
contiene le informazioni sul Ieasing 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 lo strumento di stima in un'istanza indipendente 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 utilizza unità richiesta dai contenitori monitorati e di Ieasing. Una frequenza compresa di 1 minuto è un buon punto di partenza, minore è la frequenza, maggiore è l'utilizzo delle unità richiesta.
Modalità di feed di modifiche supportate
È possibile usare lo strumento di stima del feed di modifiche sia per la modalità Versione più recente che per quella Tutte le versioni ed eliminazioni. In entrambe le modalità, la stima fornita non è garantita come un conteggio esatto delle modifiche in sospeso da elaborare.
Risorse aggiuntive
- SDK di Azure Cosmos DB
- Esempi di utilizzo in GitHub (versione più recente di .NET)
- Esempi di utilizzo in GitHub (.NET tutte le versioni ed eliminazioni)
- Esempi di utilizzo su GitHub (.Java)
- Altri esempi in GitHub
Passaggi successivi
È ora possibile procedere ad acquisire altre informazioni sul processore di feed di modifiche nell'articolo seguente: