首页 > 解决方案 > 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,根据文档它的速度较慢,我可以通过使用发布者确认来提高吞吐量。

但我不是很清楚。

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

任何建议都受到高度赞赏。

标签: rabbitmqspring-rabbit

解决方案


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

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

请参阅确认和退货

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

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

我希望这会有所帮助。

示例存储库中有一个确认并返回示例Spring Boot 应用程序,但它是在未来添加到CorrelationData. 这将很快得到解决

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


推荐阅读