RabbitMQ订阅者将消息发送回RabbitMQ队列?

时间:2016-03-05 14:13:34

标签: node.js rabbitmq message-queue

我很感激你对此的看法。

我有一个订阅RabbitMQ队列的节点应用程序。收到消息后,会检查消息,然后将其保存到数据库中。

但是,如果消息丢失了某些信息或某些其他标准尚未满足,我希望订阅者将消息发布回RabbitMQ队列。

我从逻辑上理解这只是连接到队列并发布消息,但这真的很简单,还是这种做法不好或有潜在危险?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

正如我在评论中指出的那样,当你创建与队列的连接,并设置autoAck = true时,启用消息确认。队列中的消息将被删除,直到收到确认。

当收到的消息满足要求时,则将ack消息发送到该队列,此消息将从队列中删除。否则,没有ack消息发送到队列,此消息将保留在队列中。

至于你在评论中提到的,有效过程可能需要5分钟,只需将send ack消息设置为验证功能的回调函数。

答案 1 :(得分:0)

在您的问题中,您描述了可能无法处理邮件的两个标准:

  
      
  1. 如果邮件缺少某些信息或
  2.   
  3. 尚未达到其他一些标准
  4.   

其中第一个似乎是邮件的问题,并且似乎没有必要重新排列有问题的邮件。适当的操作是记录错误并删除消息(或调用应用程序包含的任何错误处理逻辑)。

其中第二个是相当模糊的,但是为了这个答案的目的,我们将假设问题不在于消息,而在于系统中的某些其他组件(例如,可能是网络连接问题)。在这种情况下,消费应用程序可以发送Nack (negative acknowldegement),其可以选择性地重新排队消息。

请记住,在第二种情况下,有必要关闭消费者,直到错误情况得到解决,或者消息将被重新传递并错误地处理,直到系统重新启动,从而浪费资源一条无法处理的消息。

为什么要使用nack而不是简单地重新发布?
这将设置" redelivered"在邮件上标记,以便您知道它已经发送过一次。处理不良消息也有other options