次の方法で共有


変更フィード推定ツールを使用する

この記事では、 変更フィードプロセッサ インスタンスが変更フィード を読み取る際の進行状況を監視する方法について説明します。

監視の進行状況が重要なのはなぜですか?

変更フィード プロセッサは、変更フィード間を進み、 その変更 をデリゲート実装に配信するポインターとして機能します。

変更フィード プロセッサのデプロイでは、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分間隔の頻度は良い開始点です。頻度が低いほど、要求ユニットの消費量が増えます。

サポートされている変更フィード モード

変更フィード推定機能は、 最新バージョン モードすべてのバージョンと削除モードの両方に使用できます。 どちらのモードでも、提供される見積もりは、プロセスに対する未処理の変更の正確な数であるとは限りません。

その他のリソース

次のステップ

変更フィード プロセッサの詳細については、次の記事を参照してください。