RabbitMQ基本恢复无法;t工作

本文关键字:工作 恢复 RabbitMQ | 更新日期: 2023-09-27 17:59:16

我们有一个持久的RabbitMQ队列。当消费者从队列中获得项目时,它会对其进行处理,然后确认。如果消费者未能处理该项目,它会打印一个错误,期望有人解决问题并停止。没有发送确认。当消费者重新启动时,它接收的项目是队列中的下一个项目,而不是没有ack的项目。基本的Recover()没有帮助(使用.NET客户端)。任何关于如何使其作为队列工作的想法——如果没有确认,总是得到第一个项目。

RabbitMQ基本恢复无法;t工作

消息可以通过两种方式使用noAck=false或noAck=true

noAck是两个Model的参数。基本概念和模型。BasicGet

当noAck设置为true时,消息在传递后会自动从队列中删除。如果noAsk设置为false,则只有在调用basicAck时才会删除消息。

如果noAck=false并且您没有调用basicAck,则消息将保留,但在重新启动应用程序(或关闭首先使用它的连接)之前,您不会收到其他使用者的消息。如果您呼叫BasicReject,消息将重新发送给订户。

我希望这能有所帮助。

请参阅RabbitMQ常见问题解答中的此条目。虽然您可能希望RabbitMQ将您未确认的消息重新排列到队列的最前面(在您的消费者将其取下之前它们所在的位置),但现实可能会有所不同,正如您所经历的那样。

因此,这并不是说Basic.Recover()不起作用(消息放回队列以备将来重新处理),只是它没有按您预期的方式工作。

我脑海中的某些东西告诉我,通过将预取计数设置为1,并且在任何时候最多只能有一个消费者连接到队列,您可能能够获得您想要的行为,但我不能保证是这样。值得一试。然而,即使它有效,也不能指望永远保持这种状态,而且预取次数如此之低,消费者的消息/秒性能可能会受到影响。

自2.7.0以来,RabbitMQ似乎已经修复了部分问题,因为现在消息将按发布顺序重新排队。尽管队列中有多个订阅者,但您可能仍会收到来自原始顺序的消息。

您可以通过拥有一对队列(一个高优先级和一个正常优先级)来获得这种行为。将预取计数设置为1,然后使用basic.get在队列之间交替。大多数情况下,优先级队列将为空,但当您想重新排队时,请将消息再次发布到高优先级队列中。

这适用于这样一种情况,即您有多个进程在使用消息流,而一个进程决定放弃一条消息。该消息几乎会立即被另一个进程接收。