选择容器
版本 2.0 引入了 DirectMessageListenerContainer
(DMLC)。以前,只有 SimpleMessageListenerContainer
(SMLC) 可用。SMLC 使用内部队列和每个消费者专用的线程。如果容器配置为监听多个队列,则使用相同的消费者线程处理所有队列。并发性由 concurrentConsumers
和其他属性控制。当消息从 RabbitMQ 客户端到达时,客户端线程通过队列将其传递给消费者线程。需要这种架构是因为在早期版本的 RabbitMQ 客户端中,无法实现多个并发投递。较新版本的客户端采用了改进的线程模型,现在可以支持并发。这使得引入了 DMLC,其中监听器现在直接在 RabbitMQ 客户端线程上被调用。因此,它的架构实际上比 SMLC 更“简单”。然而,这种方法存在一些限制,SMLC 的某些特性在 DMLC 中不可用。此外,并发性由 consumersPerQueue
控制(以及客户端库的线程池)。此容器不可用 concurrentConsumers
和相关属性。
以下特性在 SMLC 中可用,但在 DMLC 中不可用
-
batchSize
:在 SMLC 中,您可以设置此值来控制在事务中投递多少消息或减少确认次数,但这可能导致在故障后重复投递的数量增加。(DMLC 确实有messagesPerAck
,您可以使用它来减少确认次数,与batchSize
和 SMLC 的效果相同,但它不能与事务一起使用——每条消息在单独的事务中投递和确认)。 -
consumerBatchEnabled
:启用消费者中离散消息的批量处理;更多信息请参见消息监听器容器配置。 -
maxConcurrentConsumers
和消费者伸缩间隔或触发器——DMLC 中没有自动伸缩。但是,它允许您以编程方式更改consumersPerQueue
属性,并相应地调整消费者。
然而,DMLC 相比 SMLC 具有以下优势
-
在运行时添加和移除队列更高效。使用 SMLC,整个消费者线程会重新启动(所有消费者被取消并重新创建)。使用 DMLC,未受影响的消费者不会被取消。
-
避免了 RabbitMQ 客户端线程与消费者线程之间的上下文切换。
-
线程在消费者之间共享,而不是像 SMLC 中那样每个消费者都有专用线程。然而,请参阅关于 线程与异步消费者 中连接工厂配置的重要说明。
有关适用于每个容器的配置属性的信息,请参见消息监听器容器配置。