第26章 低速なコンシューマーの処理

サーバー側のキューがある低速なコンシューマーは、サーバーのパフォーマンスに大きな問題を引き起こす可能性があります。メッセージがコンシューマーのサーバー側キューで構築されるため、メモリー使用量が増えます。その結果、サーバーがページングモードに入り、パフォーマンスに悪影響を与える可能性があります。別の大きな問題として、consumer-windows-size 属性が 0 よりも大きい場合は、クライアントのメッセージバッファーに送信されたメッセージが消費されるのを待ち続ける可能性があります。メッセージをすぐに消費しないコンシューマーをサーバーから切断できるように基準を設定できます。

低速なコンシューマーが MDB の場合、JBoss EAP サーバーが接続を管理します。MDB が切断されると、MDB が消費していたキューにメッセージが返され、MDB が自動的に再接続します。この時点で、メッセージはキュー上のすべての MDB に再度負荷分散されます。この同じプロセスは、永続的なトピックでリッスンする MDB にも当てはまります。JMS コンシューマーの場合は、速度が遅いと切断され、reconnects-attempts-1 に設定されている場合や、0 よりも大きい場合にのみ再接続します。

非永続的な JMS サブスクライバーまたは非永続的なサブスクリプションを持つ MDB の場合、接続は切断されます。その結果、サブスクリプションが削除されます。非永続的なサブスクライバーが再接続すると、新しい非永続的なサブスクリプションが作成され、トピックに送信された新しいメッセージのみ消費が開始されます。

コンシューマーが遅いかどうかを判断する計算では、特定のコンシューマーが確認応答したメッセージの数のみを確認します。たとえば、フロー制御がコンシューマーで有効になっているか、またはコンシューマーが大きいメッセージをストリーミングしているかどうかは考慮しません。低速なコンシューマー検出を設定する場合はこれに留意してください。

低速なコンシューマーのチェックは、スケジュールスレッドプールを使用して実行されます。低速なコンシューマー検出が有効になっているサーバー上の各キューにより、内部の java.util.concurrent.ScheduledThreadPoolExecutor インスタンスで新しいエントリーが発生します。キューが多数あり、slow-consumer-check-period が比較的小さい場合は、チェックの一部の実行に遅延が生じる可能性があります。ただし、検出アルゴリズムで使用される計算の精度には影響しません。このスレッドプールに関する詳細は、「スレッド管理」を参照してください。

低速なコンシューマー処理は、address-setting に基づきます。address-setting 設定に関する詳細は、「アドレス設定」を参照し、付録の address-setting 属性のリストを参照してください。低速なコンシューマーの処理を設定するために使用される属性は 3 つあります。以下のとおりです。

slow-consumer-check-period
低速なコンシューマーについてチェックする頻度 (秒単位)。デフォルトは 5 です。
slow-consumer-policy

低速なコンシューマーが特定されたときにどうするのかを決定します。有効なオプションは KILL または NOTIFY です。

  • KILL はコンシューマーの接続を強制終了します。同じ接続を使用するどのクライアントスレッドにも影響を与えます。
  • NOTIFYCONSUMER_SLOW 管理通知をクライアントに送信します。

デフォルトは NOTIFY です。

slow-consumer-threshold
最小限許可されるメッセージ消費率。この値を下回るとコンシューマーは遅いと見なされます。デフォルトは -1 で、バインドされません。

管理 CLI を使用して、属性の現在の値を読み取ります。たとえば、以下のコマンドを使用して、myAddress という名前の address-setting の現在の slow-consumer-policy を読み取ります。

/subsystem=messaging-activemq/server=default/address-setting=myAddress:read-attribute(name=slow-consumer-policy)

同様に、以下の例を使用して同じ slow-consumer-policy を設定します。

/subsystem=messaging-activemq/server=default/address-setting=myAddress:write-attribute(name=slow-consumer-policy,value=<NEW_VALUE>)