次の方法で共有


Azure Event Hubs のパフォーマンスのトラブルシューティング

この記事では、Azure SDK for Java で Event Hubs ライブラリを使用するときに発生する可能性がある一般的なパフォーマンスの問題の解決策について説明します。 Event Hubs の使用時に発生する可能性がある他の一般的な問題の解決策については、「 Azure Event Hubs のトラブルシューティング」を参照してください。

processEvent または processEventBatch を使用する

processEventコールバックを使用すると、受信した各EventDataインスタンスがコードを呼び出します。 このプロセスは、イベント ハブ内のトラフィックが少ない、または中程度の場合に適しています。

イベント ハブのトラフィックとスループットが高い場合、コールバックの継続的な呼び出しがコストを積み重ねることで、EventProcessorClientのパフォーマンスが低下します。 この場合は、 processEventBatchを使用する必要があります。

パーティションごとに、コールバックが一度に 1 つずつ呼び出されます。 コールバックの処理時間が長いほど、パフォーマンスが低下します。これは、 EventProcessorClient がダウンストリームにより多くのイベントをプッシュし続けず、Event Hubs サービスからより多くの EventData インスタンスを要求しないためです。

チェックポイント処理のコスト

チェックポイント ストアとして Azure Blob Storage を使用する場合、HTTP 要求を行い、応答を待機するため、チェックポイント処理にはネットワーク コストがかかります。 このプロセスは、ネットワーク待機時間、Azure Blob Storage のパフォーマンス、リソースの場所などが原因で、最大で数秒かかる場合があります。

すべての EventData インスタンスが処理された後にチェックポイントを作成すると、これらの HTTP 要求を行うコストが原因でパフォーマンスが低下します。 コールバックがイベントを処理しなかった場合、またはいくつかのイベントを処理した後にチェックポイントを設定する必要がある場合は、チェックポイントを設定しないでください。

LoadBalancingStrategy.BALANCED または LoadBalancingStrategy.GREEDY を使用する

LoadBalancingStrategy.BALANCEDを使用すると、EventProcessorClientは負荷分散サイクルごとに 1 つのパーティションを要求します。 イベント ハブに 32 個のパーティションがある場合、すべてのパーティションを要求するために 32 回の負荷分散イテレーションが必要です。 ユーザーが一連の EventProcessorClient インスタンスが実行されていることがわかっている場合は、 LoadBalancingStrategy.GREEDY を使用して、1 回の負荷分散サイクルでパーティションの共有を要求できます。

各戦略の詳細については、azure-sdk-for-java リポジトリLoadBalancingStrategy.javaを参照してください。

prefetchCount を設定する

既定のプリフェッチ値は 500 です。 AMQP 受信リンクが開かれると、リンクに 500 クレジットが配置されます。 各 EventData インスタンスが 1 つのリンク クレジットであると仮定すると、 EventProcessorClient は 500 EventData インスタンスをプリフェッチします。 すべてのイベントが使用されると、プロセッサ クライアントはリンクに 500 クレジットを追加して、さらにメッセージを受信します。 このフローは、 EventProcessorClient がまだパーティションの所有権を持っている間に繰り返されます。

prefetchCountを構成すると、数が少なすぎる場合にパフォーマンスに影響する可能性があります。 AMQP が受信リンクにクレジットを設定するたびに、リモートサービスが確認応答を送信します。 高スループットのシナリオでは、何千ものクライアント要求とサービス ACC を作成するオーバーヘッドによってパフォーマンスが低下する可能性があります。

prefetchCountを構成すると、数値が大きすぎるとパフォーマンスに影響する可能性があります。 x クレジットが行に配置されると、Event Hubs サービスは最大 x 個のメッセージを送信できることを認識します。 各 EventData インスタンスを受信すると、処理を待ってメモリ内キューに配置されます。 キュー内の EventData インスタンスの数が多い場合、メモリ使用量が非常に多くなる可能性があります。

次のステップ

この記事のトラブルシューティング ガイダンスが、Azure SDK for Java クライアント ライブラリを使用するときに問題を解決するのに役立たない場合は、Azure SDK for Java GitHub リポジトリに 問題を報告 することをお勧めします。