【问题标题】:How to achieve at-least-once delivery guarantee with RabbitMQ and Spring AMQP without using transactions?如何在不使用事务的情况下使用 RabbitMQ 和 Spring AMQP 实现至少一次交付保证?
【发布时间】:2018-06-13 14:56:24
【问题描述】:

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

另一方面,Spring AMQP 能够使用此配置自动处理消费者确认:

spring.rabbitmq.listener.acknowledgeMode=AUTO

对于发布者确认这是配置:

spring.rabbitmq.publisherConfirms=true

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

【问题讨论】:

    标签: rabbitmq spring-rabbit


    【解决方案1】:

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

    the documentation

    对于发布者确认(又名发布者确认),模板需要将其 publisherConfirms 属性设置为 true 的 CachingConnectionFactory。通过调用 setConfirmCallback(ConfirmCallback callback) 注册 RabbitTemplate.ConfirmCallback 将确认发送到客户端。回调必须实现这个方法:

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

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

    RabbitTemplate 仅支持一个 ConfirmCallback。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-18
      • 1970-01-01
      • 2019-03-05
      • 2018-06-20
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多