选择容器

版本 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 中那样每个消费者都有专用线程。然而,请参阅关于 线程与异步消费者 中连接工厂配置的重要说明。

有关适用于每个容器的配置属性的信息,请参见消息监听器容器配置