コンテナーの選択

バージョン 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 を参照してください。

各コンテナーに適用される構成プロパティについては、メッセージリスナーコンテナーの設定を参照してください。