我正在尝试理解在RabbitMQ中合并或分块传入消息的最佳方法(直接使用Spring AMQP或Java客户端)。
换句话说,我想说100条传入消息并将它们组合为1并以可靠(正确ACK
方式)将其重新发送到另一个队列。我相信这在EIP中被称为aggregator模式。
我知道Spring Integration provides an aggregator solution,但实现看起来不是故障安全(也就是看起来它必须使用ack并使用消息来构建合并消息,因此如果你在执行此操作时将其关闭会丢失消息吗?)。
答案 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/了解一些细节。
以上所有内容为您提供了一些帮助您解决问题的背景知识。实施相当简单。
创建消费者时,您需要确保将其设置为需要确认。
需要注意的一点是,如果您的消费者在3之后死亡并且在4之前完成,则那些未确认的消息将在重新生效时重新处理