如何在使用Rabbitmq并设置ttl = 0时进行消息自动重试?

时间:2016-04-25 08:44:51

标签: crash rabbitmq ttl

我们有这样的场景:

在多个节点中可能有许多工人(也就是消费者),同时,webapp会向这些工作人员提交在线工作。我们需要均匀地处理这些工作,并知道是否有可用的工人来完成每项工作。因此,我们希望使用Rabbitmq来安排作业并设置每个作业消息ttl = 0,以便在没有工作人员完成每项工作时发出通知。但是我们也希望Rabbitmq在工作节点崩溃时处理作业重新安排。但是,如果ttl设置为0,则Rabbitmq将在工作程序崩溃或网络失败时丢弃作业消息。

我知道我们可以使用DLX来处理死信息,但是构建一个模块来处理这些异常是很繁琐的,因为我必须为它提供高可用性。最重要的是我无法区分调度失败和重新调度faiture,这是非常不同的处理!

你们有其他想法吗?

1 个答案:

答案 0 :(得分:1)

RabbitMQ无法明确知道是否有任何可用的工作者,消费者是。它知道有多少消费者正在消耗队列,或者已连接等等。如果你有5名工作人员,他们将以循环方式获取消息,如described in the tutorial. 对于这部分

  

但我们也希望Rabbitmq在工作节点处理作业重新安排   崩溃

简单地不使用自动ACK,而是在作业完成后进行手动ACK(实际上在上述教程中描述)。如果工作人员死亡,则消息不会被确认,并且它会“重新排队”。

  

最重要的是,我无法区分调度失败和重新调度faiture,这是非常不同的处理!

现在这有点复杂,具体取决于您的使用案例和/或您希望如何处理这些类型的故障。你可能根本就没有确认,杀死消费者,但如果消息不好,下一个消费者会得到它并做同样的事情,然后它会永远继续下去。您也可以转发此消息(可能会添加一些其他信息),但问题是如何处理它(也许记录它,就是这样?)等。