【问题标题】:How does RabbitMQ publisher confirms work?RabbitMQ 发布者确认如何工作?
【发布时间】:2020-03-13 02:27:54
【问题描述】:

我已经浏览了 rabbitmq 文档, https://www.rabbitmq.com/confirms.html#publisher-confirms

使用标准的 AMQP 0-9-1,唯一保证一条消息 不会丢失是通过使用事务——使通道具有事务性 然后为每条消息或一组消息发布、提交。 在这 在这种情况下,交易是不必要的重量级和减少 吞吐量增加了 250 倍。为了解决这个问题,确认 引入了机制。它模仿了消费者的确认 协议中已经存在的机制

为了启用确认,客户端发送confirm.select 方法。 根据是否设置了无等待,代理可能会响应 带有确认.select-ok。一旦 confirm.select 方法用于 频道,据说处于确认模式。交易渠道 无法进入确认模式,一旦通道处于确认模式, 它不能进行事务处理。

目前我正在使用 spring-rabbit 库的 RabbitTemplate.convertAndSend 发送消息。 我正在使用事务通道将消息发布到rabbitmq,根据文档它的速度较慢,我可以通过使用发布者确认来提高吞吐量。

但我不是很清楚。

如果我想启用确认,那么需要进行哪些更改以及如何处理异常? 我的重审机制是什么? 此发布者是否确认以异步方式工作? 事务是否同步工作?

非常感谢任何建议。

【问题讨论】:

    标签: rabbitmq spring-rabbit


    【解决方案1】:

    如果您等待每个单独发送的确认,则使用发布者确认不会显着提高交易性能。如果您发送许多消息并稍后等待确认,它们会很有帮助。

    事务是同步的。确认是完全异步的。

    Confirms and Returns

    当您启用确认时,您会向模板提供一个回调,该模板将在收到确认时调用。您将相关数据添加到回调中提供的发送,以便您可以确定此确认用于哪个发送。此外,相关数据(在最近的版本中)提供了一个Future<?>,您可以等待以同步方式接收确认。

    这是您处理任何异常的地方。

    希望对你有帮助。

    samples repo 中有一个确认并返回示例 Spring Boot 应用程序,但它是在未来添加到 CorrelationData 之前创建的。那个will be fixed soon

    关联数据可以包含原始消息,启用重试。

    【讨论】:

    • 谢谢你,Gary,你解开了我的疑惑。对我来说,稍后确认很好,相关数据将用于重新发送。但是它会保持排序吗,假设m5在RMQ中发布失败,m6,m7成功,所以任何听RMQ的消费者都会失去排序。请纠正我。或者我需要捕获异常并从 m5 重新开始并通过重复后来成功的消息 m6、m7 来继续发布到 RMQ ...通过将所有消息保留在缓冲区中直到我得到确认为止,如果我是,请纠正我错了吗?
    • 最后,如果我的RMQ消费者系统依赖ordering,有没有办法使用publisher Confirm来发布消息到RMQ?
    • 不能有订货保证;如果 m5 失败,m6 和 m7 很可能也会失败,但 m6 和 m7 肯定有可能成功。如果需要订购,那么我认为交易是唯一的选择。此外,为确保排序,您应该在template.invoke() 操作范围内进行所有发送(除非您只有一个线程发送消息)。见Scoped Operations
    猜你喜欢
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    相关资源
    最近更新 更多