rabbitmq - RabbitMQ 发布者确认如何工作?
问题描述
我已经浏览了rabbitmq文档, https: //www.rabbitmq.com/confirms.html#publisher-confirms
使用标准 AMQP 0-9-1,保证消息不丢失的唯一方法是使用事务——使通道具有事务性,然后为每条消息或一组消息发布、提交。在这种情况下,交易是不必要的重量级,并将吞吐量降低了 250 倍。为了解决这个问题,引入了确认机制。它模仿了协议中已经存在的消费者确认机制。
为了启用确认,客户端发送 confirm.select 方法。根据是否设置了 no-wait,broker 可能会以 Confirm.select-ok 进行响应。一旦在通道上使用了 confirm.select 方法,就说它处于确认模式。交易通道不能进入确认模式,一旦通道处于确认模式,就不能进行交易。
目前我正在使用 spring-rabbit 库的 RabbitTemplate.convertAndSend 发送消息。我正在使用事务通道将消息发布到rabbitmq,根据文档它的速度较慢,我可以通过使用发布者确认来提高吞吐量。
但我不是很清楚。
如果我想启用确认,那么需要进行哪些更改以及如何处理异常?我的重审机制是什么?此发布者是否确认以异步方式工作?事务是否同步工作?
任何建议都受到高度赞赏。
解决方案
如果您等待每个单独发送的确认,则使用发布者确认不会显着提高事务的性能。如果您发送许多消息并稍后等待确认,它们将有很大帮助。
事务是同步的。确认是完全异步的。
请参阅确认和退货。
当您启用确认时,您向模板提供一个回调,该模板将在收到确认时调用。您将相关数据添加到回调中提供的发送,以便您可以确定此确认用于哪个发送。此外,相关数据(在最近的版本中)提供了一个Future<?>
您可以等待以同步方式接收确认的数据。
那是您处理任何异常的地方。
我希望这会有所帮助。
示例存储库中有一个确认并返回示例Spring Boot 应用程序,但它是在未来添加到CorrelationData
. 这将很快得到解决。
相关数据可以包含原始消息,从而启用重试。
推荐阅读
- php - 启动 Laravel 应用程序时执行一个函数
- python-3.x - 使用 webbot 进行网页抓取
- javascript - 通过节点的异步/等待不需要按预期顺序返回结果 - 使用什么正确模式?
- java - Java中的String Rotation程序,用于查找向后旋转的空格数
- c# - 实体框架为一对多 rel 创建查询
- linux - ELF 文件中的文本和数据段与 .text 和 .data 段有什么区别?
- python - 如何确定对象的属性及其正确的函数返回?
- php - Google Adwords 通过 Measurement Protocol 保存服务器端转化跟踪
- uml - UML 组件图关系
- c# - 如何将自定义数据类型从 C++ DLL 方法返回到 C# 代码?