RabbitMQ将消息分组为一条消息,即合并消息

时间:2013-02-25 15:52:16

标签: java rabbitmq amqp spring-integration

我正在尝试理解在RabbitMQ中合并或分块传入消息的最佳方法(直接使用Spring AMQP或Java客户端)。

换句话说,我想说100条传入消息并将它们组合为1并以可靠(正确ACK方式)将其重新发送到另一个队列。我相信这在EIP中被称为aggregator模式。

我知道Spring Integration provides an aggregator solution,但实现看起来不是故障安全(也就是看起来它必须使用ack并使用消息来构建合并消息,因此如果你在执行此操作时将其关闭会丢失消息吗?)。

2 个答案:

答案 0 :(得分:2)

如果将<amqp-inbound-channel-adapter/> tx-size属性设置为100,则容器将每100封邮件确认一次,这样可以防止邮件丢失。

但是,您可能希望发送聚合消息(在第100次接收时)事务,以便您可以确认代理在入站消息的确认之前有消息。

答案 1 :(得分:2)

我不能直接在Spring Integration库上发表评论,所以我会用RabbitMQ来说话。

如果你不是100%相信聚合器的Spring Integration实现并且会尝试自己实现它,那么我建议避免使用在RabbitMQ中使用事务的tx

RabbitMQ中的事务很慢,如果您正在构建高流量/吞吐量系统,肯定会遇到性能问题。

相反,我建议你看一下 Publisher Confirms ,这是在RabbitMQ中实现的AMQP的扩展。以下是新版http://www.rabbitmq.com/blog/2011/02/10/introducing-publisher-confirms/时的介绍。

您需要调整预取设置才能获得正确的效果,请查看http://www.rabbitmq.com/blog/2012/05/11/some-queuing-theory-throughput-latency-and-bandwidth/了解一些细节。

以上所有内容为您提供了一些帮助您解决问题的背景知识。实施相当简单。

创建消费者时,您需要确保将其设置为需要确认。

  1. 出列n条消息,当您出列时,您需要记下每条消息的DeliveryTag(这用于确认消息)
  2. 将邮件聚合为新邮件
  3. 发布新消息
  4. 确认每个已出列的消息
  5. 需要注意的一点是,如果您的消费者在3之后死亡并且在4之前完成,则那些未确认的消息将在重新生效时重新处理