Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo descrive come monitorare lo stato di avanzamento delle istanze del processore del feed di modifiche durante la lettura del feed di modifiche.
Perché il monitoraggio dello stato di avanzamento è importante?
Il processore del feed di modifiche funge da puntatore che si sposta in avanti nel feed di modifiche e trasmette le modifiche a un'implementazione delegata.
La distribuzione del processore di feed delle modifiche può elaborare le modifiche a una velocità specifica 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 comprendere se è necessario ridimensionare la distribuzione del processore dei feed di modifiche.
Implementare lo strumento di stima del feed di modifiche
Come modello push per le notifiche automatiche
Come il processore del feed di modifiche, lo stimatore del feed di modifiche può funzionare come modello push. Lo strumento di stima misura la differenza tra l'ultimo elemento elaborato (definito dallo stato del contenitore di lease) e la modifica più recente nel contenitore, e invia 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à dell'ultima versione 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 quel processore sarebbe utilizzare GetChangeFeedEstimatorBuilder in questo modo:
ChangeFeedProcessor changeFeedEstimator = monitoredContainer
.GetChangeFeedEstimatorBuilder("changeFeedEstimator", Program.HandleEstimationAsync, TimeSpan.FromMilliseconds(1000))
.WithLeaseContainer(leaseContainer)
.Build();
Dove il processore e lo strumento di stima condividono lo stesso leaseContainer e lo stesso nome.
Gli altri due parametri sono il delegato, che riceve un numero che rappresenta il numero di modifiche in sospeso da leggere dal processore e l'intervallo di tempo in cui si desidera eseguire questa misurazione.
Un esempio di 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 il comportamento dello stato di avanzamento nel 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 contratto di locazione.
- L'istanza che possiede ed elabora ogni lease, in modo da poter identificare se c'è un problema in un'istanza.
Se il processore del 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 stimatore con la stessa configurazione di locazione:
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.");
}
}
Ognuno ChangeFeedProcessorState contiene le informazioni sul lease e sul ritardo e anche sull'istanza corrente proprietaria.
Distribuzione dello strumento di stima
Il valutatore del feed di modifiche non necessita di essere implementato come parte del processore del feed di modifiche, né deve far parte dello stesso progetto. È consigliabile distribuire lo strumento di stima in un'istanza indipendente dai processori. Una singola istanza di stimatore può tenere traccia dello stato di avanzamento per tutti i contratti e le istanze nella distribuzione del processore di feed di modifiche.
Ogni stima usa unità richiesta dai contenitori monitorati e di lease. Una frequenza compresa tra 1 minuto è un buon punto di partenza, minore è la frequenza, maggiore è l'utilizzo delle unità richiesta.
Modalità di feed di modifiche supportate
Lo stimatore del feed delle modifiche può essere utilizzato sia per la modalità della versione più recente che per la modalità di 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 in GitHub (Java)
- Altri esempi su GitHub
Passaggi successivi
È ora possibile scoprire di più sul processore del flusso delle modifiche nell'articolo seguente: