Azure Event Hubs パフォーマンスのトラブルシューティング
この記事では、Azure SDK for Java で Event Hubs ライブラリを使用するときに発生する場合がある一般的なパフォーマンスの問題の解決策について説明します。 Event Hubs の使用時に発生する可能性がある他の一般的な問題の解決策については、「Azure Event Hubsのトラブルシューティング」を参照してください。
processEvent または processEventBatch を使用する
processEvent
コールバックを使用すると、各 EventData
インスタンスがコードを呼び出します。 このプロセスは、イベント ハブ内のトラフィックが少ない、または中程度の場合に適しています。
イベント ハブのトラフィックが多く、スループットが高い場合は、コールバックを継続的に呼び出すためにかかる集計コストは、EventProcessorClient
のパフォーマンスを低下させます。 この場合は、processEventBatch
を使用します。
パーティションごとに、コールバックが一度に 1 つずつ呼び出されます。 EventProcessorClient
は、引き続き、より多くのイベントをダウンストリームにプッシュせず、EventData
Event Hubs サービスからのより多くのインスタンスも要求しないため、コールバックの処理時間が長引くほどパフォーマンスが低下します。
チェックポイントのコスト
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 repository」の「LoadBalancingStrategy.java」を参照してください。
prefetchCount の構成
デフォルトのプリフェッチ値は、500 です。 AMQP 受信リンクが開かれると、リンクに 500 クレジットが配置されます。 各 EventData
インスタンスが 1 つのリンク クレジットであると仮定すると、EventProcessorClient
は、500 の EventData
インスタンスをプリフェッチします。 すべてのイベントが使用されると、プロセッサ クライアントはリンクに 500 クレジットを追加して、さらにメッセージを受信します。 このフローは、EventProcessorClient
がパーティションの所有権を持っている間に繰り返されます。
prefetchCount
を構成すると、数が少なすぎる場合は、パフォーマンスに影響を与えることがあります。 AMQP がリンクを受信するたびにクレジットが配置され、リモート サービスは ACK を送信します。 高スループットのシナリオでは、何千ものクライアント要求とサービス ACK を作成するオーバーヘッドによってパフォーマンスが低下する場合があります。
prefetchCount
を構成すると、数が多すぎる場合は、パフォーマンスに影響を与えることがあります。 x クレジットが行に配置されると、Event Hub サービスは、ほとんどの x メッセージに送信できることを認識します。 各 EventData
インスタンスを受信すると、そのインスタンスはメモリ内キューに配置され、処理を待機します。 キュー内の EventData
インスタンスの数が多い場合、メモリ使用量が非常に多くなる可能性があります。
次のステップ
この記事のトラブルシューティング ガイダンスが、Azure SDK for Java クライアント ライブラリを使用するときの問題の解決に役立たない場合は、Azure SDK for Java GitHub リポジトリに問題を提出することをお勧めします。