コンテナーの選択
バージョン 2.0 は DirectMessageListenerContainer
(DMLC) を導入しました。以前は、SimpleMessageListenerContainer
(SMLC) のみが利用可能でした。SMLC は、コンシューマーごとに内部キューと専用スレッドを使用します。コンテナーが複数のキューをリッスンするように構成されている場合、同じコンシューマースレッドを使用してすべてのキューが処理されます。同時実行性は、concurrentConsumers
およびその他のプロパティによって制御されます。メッセージが RabbitMQ クライアントから到着すると、クライアントスレッドはそれらをキューを介してコンシューマースレッドに渡します。このアーキテクチャが必要だったのは、RabbitMQ クライアントの初期のバージョンでは、複数の同時配信が不可能だったためです。新しいバージョンのクライアントでは、スレッドモデルが改訂されており、同時実行をサポートできるようになりました。これにより、リスナーが RabbitMQ クライアントスレッドで直接呼び出されるようになった DMLC の導入が可能になりました。そのアーキテクチャは実際には SMLC よりも「単純」です。ただし、このアプローチにはいくつかの制限があり、SMLC の特定の機能は DMLC では利用できません。また、同時実行は consumersPerQueue
(およびクライアントライブラリのスレッドプール) によって制御されます。concurrentConsumers
および関連するプロパティは、このコンテナーでは使用できません。
次の機能は SMLC で使用できますが、DMLC では使用できません。
batchSize
: SMLC を使用すると、これを設定して、トランザクションで配信されるメッセージの数を制御したり、ACK の数を減らしたりできますが、失敗後に重複配信の数が増える可能性があります。(DMLC にはmessagesPerAck
があり、batchSize
や SMLC と同じように ACK を減らすために使用できますが、トランザクションでは使用できません。各メッセージは個別のトランザクションで配信および確認されます)。consumerBatchEnabled
: コンシューマーで個別のメッセージのバッチ処理を有効にします。詳細については、メッセージリスナーコンテナーの設定を参照してください。maxConcurrentConsumers
およびコンシューマーのスケーリング間隔またはトリガー— DMLC には自動スケーリングはありません。ただし、プログラムでconsumersPerQueue
プロパティを変更でき、それに応じてコンシューマーが調整されます。
ただし、DMLC には SMLC よりも次の利点があります。
実行時にキューを追加および削除する方が効率的です。SMLC を使用すると、コンシューマースレッド全体が再起動されます (すべてのコンシューマーがキャンセルされ、再作成されます)。DMLC では、影響を受けないコンシューマーは取り消されません。
RabbitMQ クライアントスレッドとコンシューマースレッド間のコンテキストスイッチは回避されます。
SMLC で各コンシューマーに専用のスレッドを用意するのではなく、コンシューマー間でスレッドを共有します。ただし、スレッド化と非同期コンシューマーの接続ファクトリ構成に関する IMPORTANT Note を参照してください。
各コンテナーに適用される構成プロパティについては、メッセージリスナーコンテナーの設定を参照してください。