gpt4 book ai didi

crash - 使用 Rabbitmq 并设置 ttl = 0 时如何使消息自动重试?

转载 作者:行者123 更新时间:2023-12-03 15:59:21 26 4
gpt4 key购买 nike

我们有这样一个场景:

多个节点中可能有很多worker(即消费者),同时webapp会向这些worker提交在线工作。我们需要均匀地处理这些工作,并知道是否有可用的 worker 来完成每一项工作。因此,我们想使用 Rabbitmq 来调度作业并设置每个作业消息 ttl = 0如果没有 worker 来做每项工作,就会得到通知。但我们也希望 Rabbitmq 在工作节点崩溃时处理作业重新调度。但是,如果 ttl设置为 0,Rabbitmq 只会在 worker 崩溃或网络失败时丢弃作业消息。

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

大家还有什么想法吗?

最佳答案

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

But also we want Rabbitmq to handle job rescheduling when worker node crashing



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

The most important is that I can not distinguish from scheduling failure and rescheduling faiture, which is very different to handle!



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

关于crash - 使用 Rabbitmq 并设置 ttl = 0 时如何使消息自动重试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36835742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com