RabbitMQブローカからのメッセージを消費するためにSpring-AMQPを使用するプロジェクトがあります。複数のワーカースレッドがメッセージを並行して処理できるように、消費側の並行性を向上させたいと考えています。私はネイティブRabbitMQクライアントのドキュメントを読むことから始めました。これは、単一のコンシューマを使用する設計と、並列処理を制御するプリフェッチ数> 1につながりました。 RabbitMQクライアントを直接使用すると、これはかなり自然なようです。 のhandleDelivery
メソッドは、作業を行い、作業の最後にメッセージを確認する新しいRunnable
を生成できます。プリフェッチ・カウントは、コンシューマが生成する最大数Runnable
を効果的に制御します。プリフェッチを伴うSpring AMQP単一コンシューマの並列処理
しかし、このデザインはSpring-AMQPの世界には変換できないようです。 SimpleMessageListenerContainer
では、AMQPコンシューマごとにすべてのメッセージが単一のBlockingQueueConsumer
に配信され、単一のスレッドがBlockingQueueConsumer
のブロッキングキューからのメッセージをMessageListener
に配信します。 SimpleMessageListenerContainer
はTaskExecutor
をサポートしていますが、TaskExecutor
はコンシューマごとに1つのタスクを実行するためにのみ使用されます。したがって、複数のメッセージを並列に処理するには、複数のコンシューマーを使用する必要があります。
これは、Spring-AMQPとの並列性についていくつか質問します。まず、シングルコンシューマとハイプリフェッチを使用した私の初期設計は、AMQPとの並列性を実現する有効な方法ですか?もしそうなら、なぜSpring-AMQPはこの設計を消費者のスレッドごとの設計に嫌うのでしょうか? Spring-AMQPをカスタマイズして単一消費者並列処理を可能にすることは可能ですか?