【问题标题】:How to put a message at the end of MQRabbit Queue如何将消息放在 MQRabbit 队列的末尾
【发布时间】:2016-12-29 02:30:15
【问题描述】:

我正在开发一个能够处理来自 RabbitMQ 的消息的工作人员。

但是,我不确定如何做到这一点。

如果我收到一条消息并且在处理过程中发生错误,我如何将消息放入队列的末尾?

我正在尝试使用 nack 或拒绝,但消息总是重新放在第一个位置,其他消息保持冻结!

我不明白为什么必须将消息放在首位,我正在尝试“玩”其他选项,例如 requeue 或 AllupTo,但它们似乎都不起作用。

提前谢谢你!

【问题讨论】:

    标签: node.js rabbitmq node-amqp


    【解决方案1】:

    Documentation 说:

    可以使用具有 requeue 参数(basic.recover、basic.reject 和 basic.nack),或由于通道关闭而保持未确认 消息。任何这些情况都会导致消息在 早于 2.7.0 的 RabbitMQ 版本的队列后面。从 RabbitMQ 2.7.0 发布,消息总是保存在队列中 发布顺序,即使存在重新排队或通道 关闭。

    对于 2.7.0 及更高版本,个人仍然可以 如果队列有多个,消费者观察消息乱序 订户。这是由于其他订阅者的行为,他们可能 重新排队消息。从队列的角度来看,消息是 始终按出版顺序举行。

    请记住ack您成功的消息,否则它们将不会从队列中删除。

    如果您需要更好地控制被拒绝的邮件,您应该查看dead letter exchanges

    【讨论】:

      【解决方案2】:

      nack 或 reject 丢弃消息或重新排队消息。

      以下可能适合您的要求,

      一旦消费者收到消息,就在开始处理它之前,将 ack() 发送回 rabbitmq 服务器。

      然后处理消息,如果在过程中发现任何错误,则将相同的消息发送(发布)到同一个队列中。这会将消息放在队列的后面。

      处理成功后什么也不做。 ack() 已经发送到rabbitmq 服务器。只需接收下一条消息并进行处理。

      【讨论】:

      • 为什么 ack() 没有处理过的消息并且有错误?在处理消息之后确认应该是骨干,否则如果在它被处理或再次发布之前或期间出现问题,则该消息将丢失并从队列中删除。您应该拒绝该消息并决定是否要重新排队或丢弃该消息。
      • 这一切都取决于业务需求在处理之前或之后何时 ack() 消息。如果在脚本死亡/退出之前执行的最后一个故障转移代码发生任何错误/异常,我们可以将消息发送回队列。如果在少数情况下我们想将消息放在队列的后面而不是全部,我们可以在处理后保留 ack() / nack() / republish 。我们可以在最后决定 ack / nack 或在处理结束时重新发布消息。
      猜你喜欢
      • 1970-01-01
      • 2015-05-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多