Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird beschrieben, wie Sie den Fortschritt Ihrer Änderungsfeedprozessorinstanzen überwachen können, während sie den Änderungsfeed lesen.
Warum ist die Überwachung des Fortschritts wichtig?
Der Änderungsfeedprozessor fungiert als Zeiger, der sich über Ihren Änderungsfeed vorwärts bewegt und die Änderungen an einer Stellvertretungsimplementierung bereitstellt.
Ihre Bereitstellung des Änderungsfeedprozessors kann Änderungen mit einer bestimmten Rate basierend auf den verfügbaren Ressourcen wie CPU, Arbeitsspeicher, Netzwerk usw. verarbeiten.
Wenn diese Rate langsamer als die Rate ist, mit der Ihre Änderungen in Ihrem Azure Cosmos DB-Container erfolgen, beginnt ihr Prozessor hinterherzuhinken.
Die Identifizierung dieses Szenarios hilft zu verstehen, ob wir unsere Implementierung des Änderungsfeedprozessors skalieren müssen.
Implementieren der Änderungsfeed-Schätzung
Als Pushmodell für automatische Benachrichtigungen
Wie der Änderungsfeedprozessor kann der Änderungsfeed-Schätzer als Pushmodell funktionieren. Der Schätzer misst den Unterschied zwischen dem zuletzt verarbeiteten Element (definiert durch den Status des Lease-Containers) und der neuesten Änderung im Container und überträgt diesen Wert an einen Delegierten. Das Intervall, in dem die Messung durchgeführt wird, kann auch mit einem Standardwert von 5 Sekunden angepasst werden.
Beispiel: Wenn Ihr Änderungsfeedprozessor den aktuellen Versionsmodus verwendet und wie folgt definiert ist:
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();
Die richtige Methode, um einen Schätzer zu initialisieren, der den Prozessor misst, wäre die Verwendung von GetChangeFeedEstimatorBuilder wie folgt.
ChangeFeedProcessor changeFeedEstimator = monitoredContainer
.GetChangeFeedEstimatorBuilder("changeFeedEstimator", Program.HandleEstimationAsync, TimeSpan.FromMilliseconds(1000))
.WithLeaseContainer(leaseContainer)
.Build();
Wo sowohl der Prozessor als auch der Schätzer denselben leaseContainer und denselben Namen haben.
Die anderen beiden Parameter sind der Delegat, der eine Zahl empfängt, die angibt, wie viele Änderungen vom Prozessor gelesen werden müssen, und das Zeitintervall, zu dem diese Messung durchgeführt werden soll.
Ein Beispiel für einen Delegaten, der die Schätzung erhält, ist:
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);
}
Sie können diese Schätzung an Ihre Überwachungslösung senden und sie verwenden, um zu verstehen, wie Sich Ihr Fortschritt im Laufe der Zeit verhält.
Detaillierte Schätzung bei Bedarf
Im Gegensatz zum Pushmodell gibt es eine Alternative, mit der Sie die Schätzung nach Bedarf erhalten können. Dieses Modell enthält auch ausführlichere Informationen:
- Die geschätzte Verzögerung pro Mietvertrag.
- Die Instanz, die jede Lease besitzt und verarbeitet, sodass Sie feststellen können, ob ein Problem bei einer Instanz aufgetreten ist.
Wenn Ihr Änderungsfeedprozessor wie folgt definiert ist:
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();
Sie können den Schätzer mit derselben Leasekonfiguration erstellen:
ChangeFeedEstimator changeFeedEstimator = monitoredContainer
.GetChangeFeedEstimator("changeFeedEstimator", leaseContainer);
Und wann immer Sie möchten, mit der von Ihnen benötigten Häufigkeit, können Sie die detaillierte Schätzung erhalten:
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.");
}
}
Jeder ChangeFeedProcessorState enthält die Leasing- und Verzögerungsinformationen und auch welche die aktuelle Instanz ist, die diese Informationen besitzt.
Bereitstellung von Estimator
Der Änderungsfeed-Schätzer muss nicht als Teil des Änderungsfeed-Prozessors bereitgestellt werden oder Teil desselben Projekts sein. Es wird empfohlen, den Schätzwert auf einer unabhängigen Instanz von Ihren Prozessoren bereitzustellen. Eine einzelne Schätzerinstanz kann den Fortschritt für alle Leases und Instanzen in der Bereitstellung des Change Feed Processors nachverfolgen.
Jede Schätzung verbraucht Anforderungseinheiten aus Ihren überwachten Containern und Leasecontainern. Eine Häufigkeit von 1 Minute dazwischen ist ein guter Ausgangspunkt, je niedriger die Häufigkeit, desto höher die verbrauchten Anforderungseinheiten.
Unterstützte Änderungsfeedmodi
Der Änderungsfeed-Schätzer kann sowohl für den neuesten Versionsmodus als auch für alle Versionen und den Löschmodus verwendet werden. In beiden Modi stellt die angegebene Schätzung keine genaue Anzahl der noch zu bearbeitenden Änderungen dar.
Weitere Ressourcen
- Azure Cosmos DB SDK
- Verwendungsbeispiele auf GitHub (neueste.NET-Version)
- Verwendungsbeispiele auf GitHub (.NET alle Versionen und Löschungen)
- Verwendungsbeispiele auf GitHub (Java)
- Weitere Beispiele auf GitHub
Nächste Schritte
Im folgenden Artikel finden Sie nun weitere Informationen zum Change Feed Processor.