如何在不使用事务的情况下使用RabbitMQ和Spring AMQP实现至少一次交付保证?

时间:2018-06-13 14:56:24

标签: rabbitmq spring-rabbitmq

本文档https://www.rabbitmq.com/reliability.html表示可以在不使用事务的情况下使用RabbitMQ实现至少一次保证。事务的问题在于它们很慢,因此吞吐量急剧下降(请参阅https://www.rabbitmq.com/confirms.html中的发布者确认部分)。选项是使用Consumer Acknowledgements和Publisher Confirms。

另一方面,Spring AMQP能够使用此配置自动处理Consumer Acknowledgements:

spring.rabbitmq.listener.acknowledgeMode=AUTO

对于Publisher确认,这是配置:

spring.rabbitmq.publisherConfirms=true

我怀疑这两个属性是否足以保证至少一次交付或我是否需要做其他任何事情。

1 个答案:

答案 0 :(得分:0)

您需要向兔子模板(自定义模板或由boot配置的模板)添加确认回调以获取确认。您可以将相关数据添加到消息发送中,以便您可以将确认与发送相关联。

请参阅the documentation

  

对于Publisher Confirms(也称为Publisher Acknowledgements),模板需要一个将publisherConfirms属性设置为true的CachingConnectionFactory。通过调用setConfirmCallback(ConfirmCallback回调)注册RabbitTemplate.ConfirmCallback,将确认发送给客户端。回调必须实现此方法:

     

void confirm(CorrelationData correlationData, boolean ack, String cause);

     

CorrelationData是客户端在发送原始邮件时提供的对象。 ack对于ack是真的而对于nack是假的。对于nack,如果在生成nack时可用,则原因可能包含nack的原因。一个例子是向不存在的交换机发送消息。在这种情况下,经纪人关闭渠道;关闭的原因包括在原因中。原因已在版本1.4中添加。

     

RabbitTemplate只支持一个ConfirmCallback。