2016-05-03 16 views
1

RabbitMQブローカからのメッセージを消費するためにSpring-AMQPを使用するプロジェクトがあります。複数のワーカースレッドがメッセージを並行して処理できるように、消費側の並行性を向上させたいと考えています。私はネイティブRabbitMQクライアントのドキュメントを読むことから始めました。これは、単一のコンシューマを使用する設計と、並列処理を制御するプリフェッチ数> 1につながりました。 RabbitMQクライアントを直接使用すると、これはかなり自然なようです。 のhandleDeliveryメソッドは、作業を行い、作業の最後にメッセージを確認する新しいRunnableを生成できます。プリフェッチ・カウントは、コンシューマが生成する最大数Runnableを効果的に制御します。プリフェッチを伴うSpring AMQP単一コンシューマの並列処理

しかし、このデザインはSpring-AMQPの世界には変換できないようです。 SimpleMessageListenerContainerでは、AMQPコンシューマごとにすべてのメッセージが単一のBlockingQueueConsumerに配信され、単一のスレッドがBlockingQueueConsumerのブロッキングキューからのメッセージをMessageListenerに配信します。 SimpleMessageListenerContainerTaskExecutorをサポートしていますが、TaskExecutorはコンシューマごとに1つのタスクを実行するためにのみ使用されます。したがって、複数のメッセージを並列に処理するには、複数のコンシューマーを使用する必要があります。

これは、Spring-AMQPとの並列性についていくつか質問します。まず、シングルコンシューマとハイプリフェッチを使用した私の初期設計は、AMQPとの並列性を実現する有効な方法ですか?もしそうなら、なぜSpring-AMQPはこの設計を消費者のスレッドごとの設計に嫌うのでしょうか? Spring-AMQPをカスタマイズして単一消費者並列処理を可能にすることは可能ですか?

答えて

1

Spring AMQPは、接続ごとに1つのスレッドしか持たないウサギクライアントライブラリの以前のバージョンに対して設計されました。

DefaultConsumerのhandleDeliveryメソッドは、作業を行い、作業の最後にメッセージを確認する新しいRunnableを生成できます。唯一の違いは、各スレッドのための消費者がありますが、そこのオーバーヘッドの全体の多くはありません - 実際には、単にconcurrentConsumersを増やすよりも、より多くのあなたを購入していません

ただし、ChannelAwareMessageListenerを使用して確認応答モードをMANUALに設定すると、リスナーがメッセージを確認する必要があります。

2.0(来年)では、クライアントライブラリのスレッドでリスナーを直接呼び出す代替リスナーコンテナが用意されています。しかし、それは相当量の作業です。 This (closed) pull request has an initial PoCしかし、それはまだフル装備のコンテナではありません。

関連する問題