この記事では、 変更フィードプロセッサ インスタンスが変更フィード を読み取る際の進行状況を監視する方法について説明します。
監視の進行状況が重要なのはなぜですか?
変更フィード プロセッサは、変更フィード間を進み、 その変更 をデリゲート実装に配信するポインターとして機能します。
変更フィード プロセッサのデプロイでは、CPU、メモリ、ネットワークなどの使用可能なリソースに基づいて、特定のレートで変更を処理できます。
この速度がご利用の Azure Cosmos DB コンテナー内で変更が発生する速度よりも遅い場合、そのプロセッサは遅れ始めます。
このシナリオを特定することは、変更フィード プロセッサのデプロイをスケーリングする必要があるかどうかを理解するのに役立ちます。
変更フィード推定機能を実装する
自動通知のプッシュ モデルとして
変更フィード プロセッサと同様に、変更フィード推定機能はプッシュ モデルとして機能します。 エスティメーターは、最後に処理された項目 (リース コンテナーの状態によって定義されます) とコンテナーの最新の変更の差を測定し、この値をデリゲートにプッシュします。 測定の間隔は、既定値の 5 秒でカスタマイズすることもできます。
たとえば、変更フィード プロセッサが最新バージョン モードを使用していて、次のように定義されている場合は、次のようになります。
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();
推定器を初期化してそのプロセッサを測定する正しい方法は、次のように GetChangeFeedEstimatorBuilder 使用します。
ChangeFeedProcessor changeFeedEstimator = monitoredContainer
.GetChangeFeedEstimatorBuilder("changeFeedEstimator", Program.HandleEstimationAsync, TimeSpan.FromMilliseconds(1000))
.WithLeaseContainer(leaseContainer)
.Build();
プロセッサと推定器の両方が同じ leaseContainer と同じ名前を共有する場合。
他の 2 つのパラメーターはデリゲートであり、プロセッサによって 読み取られる保留中の変更の数 と、この測定を実行する時間間隔を表す数値を受け取ります。
推定を受け取るデリゲートの例を次に示します。
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);
}
この見積もりを監視ソリューションに送信し、それを使用して、時間の経過に伴う進行状況の動作を把握できます。
オンデマンドの詳細な見積もりとして
プッシュ モデルとは対照的に、必要に応じて見積もりを取得できる代替手段があります。 このモデルでは、さらに詳細な情報も提供されます。
- リースあたりの推定ラグ。
- 各リースを所有および処理するインスタンス。そのため、インスタンスに問題があるかどうかを特定できます。
変更フィード プロセッサが次のように定義されている場合:
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();
同じリース構成でエスティメーターを作成できます。
ChangeFeedEstimator changeFeedEstimator = monitoredContainer
.GetChangeFeedEstimator("changeFeedEstimator", leaseContainer);
必要に応じて、必要な頻度で、詳細な見積もりを取得できます。
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.");
}
}
各 ChangeFeedProcessorState には、リースとラグの情報と、それを所有している現在のインスタンスが含まれます。
推定器の展開
変更フィード推定機能は、変更フィード プロセッサの一部としてデプロイする必要も、同じプロジェクトの一部である必要もありません。 プロセッサから独立したインスタンスにエスティメーターをデプロイすることをお勧めします。 1 つのエスティメーター インスタンスは、変更フィード プロセッサのデプロイ内のすべてのリースとインスタンスの進行状況を追跡できます。
各見積もりでは、監視対象コンテナーとリース コンテナーからの要求ユニットが消費されます。 1分間隔の頻度は良い開始点です。頻度が低いほど、要求ユニットの消費量が増えます。
サポートされている変更フィード モード
変更フィード推定機能は、 最新バージョン モード と すべてのバージョンと削除モードの両方に使用できます。 どちらのモードでも、提供される見積もりは、プロセスに対する未処理の変更の正確な数であるとは限りません。
その他のリソース
- Azure Cosmos DB SDK
- GitHub (.NET 最新バージョン) の使用サンプル
- GitHub の使用サンプル (.NET のすべてのバージョンと削除)
- GitHub の使用サンプル (Java)
- GitHub のその他のサンプル
次のステップ
変更フィード プロセッサの詳細については、次の記事を参照してください。