选择容器

2.0 版本引入了 DirectMessageListenerContainer (DMLC)。此前,只有 SimpleMessageListenerContainer (SMLC) 可用。SMLC 使用内部队列和为每个消费者专门分配的线程。如果容器配置为监听多个队列,则使用相同的消费者线程来处理所有队列。并发性由 concurrentConsumers 和其他属性控制。当消息从 RabbitMQ 客户端到达时,客户端线程通过队列将其传递给消费者线程。这种架构是必需的,因为在早期版本的 RabbitMQ 客户端中,不可能实现多个并发交付。新版本的客户端采用了修订的线程模型,现在可以支持并发。这使得 DMLC 得以引入,其中监听器现在直接在 RabbitMQ 客户端线程上调用。因此,其架构实际上比 SMLC“更简单”。然而,这种方法存在一些限制,并且 DMLC 不支持 SMLC 的某些功能。此外,并发性由 consumersPerQueue(以及客户端库的线程池)控制。此容器不支持 concurrentConsumers 和相关属性。

SMLC 具备但 DMLC 不具备以下功能:

  • batchSize: 使用 SMLC,您可以设置此值以控制在事务中交付的消息数量或减少确认数量,但这可能会导致失败后重复交付的数量增加。(DMLC 确实有 messagesPerAck,您可以像使用 SMLC 的 batchSize 一样使用它来减少确认,但它不能与事务一起使用——每条消息都在单独的事务中交付并确认)。

  • consumerBatchEnabled:启用消费者中离散消息的批处理;有关更多信息,请参阅 消息监听器容器配置

  • maxConcurrentConsumers 和消费者伸缩间隔或触发器——DMLC 中没有自动伸缩。但是,它允许您以编程方式更改 consumersPerQueue 属性,并相应地调整消费者。

然而,DMLC 相对于 SMLC 具有以下优点:

  • 在运行时添加和删除队列效率更高。使用 SMLC,整个消费者线程都会重新启动(所有消费者都会被取消并重新创建)。使用 DMLC,未受影响的消费者不会被取消。

  • 避免了 RabbitMQ 客户端线程和消费者线程之间的上下文切换。

  • 线程在消费者之间共享,而不是像 SMLC 中那样为每个消费者分配一个专用线程。但是,请参阅 线程和异步消费者 中关于连接工厂配置的重要注意事项。

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

© . This site is unofficial and not affiliated with VMware.