我可以重试N次消息,然后将其发送到死队列而不会发消息并重新发布消费者的消息吗?
我能想到的唯一方法是使用dlx setup的多个队列,这样就填充了下一个重试队列:
test ---> test.retries.1 ---> ... ---> test.retries.N ---> test.dead
这可以吗?我不确定我的意思是好的。我最近开始玩rabbitmq。让我们说这是一个常见的设置吗?有什么缺点吗?
还有其他方法吗?也许一个插件可以为basic.reject
添加一个计数器并做同样的事情?
附注:我想知道这一点,因为我不相信让消费者承认一条消息(即使他不能处理它),然后再发布它。最后你会得到多个liers,它们会发布一条消息,并且不时在其他人之前立即获取它“只是为了确定”并且......你会让他们记住......(他们不会) [这也发生在具有多个重试队列的场景中,但至少代理将控制消息不在消费者的位置]
答案 0 :(得分:1)
basic.reject重新加注+ TTL
您有一个队列,并且在失败时多次重新排队邮件,当ttl过期时,您可以设置dlx。
具有多个队列的basic.reject
失败时你总是basic.reject without requeue
并使用dlx将消息发送到下一个重试队列:
test ---> test.retries.1 ---> ... ---> test.retries.N ---> test.z_dead
目前我只使用这种方法只有1个重试队列,并且我有一个特殊的队列,它接收来自dlx的某些消息并向我发送电子邮件。 (在我的情况下,消息会在几个小时内得到确认)
basic.reject,计算重试次数
执行basic.reject without requeue
并使用dlx时,您可以检查dlx添加的x-death
标头,以确定重试次数。
这是如何在sneakers中完成的 - 一个红宝石宝石:
---> test (queue)
|
| test.retry (exchange)
|
---> test.retry (queue - wait for some time with ttl)
|
| test.retry.requeue (exchange)
|
---> test (queue)
最后,您计算通过测试队列的次数,当您超过重试次数时,您必须确认该消息(可能在将其发布到某个地方后,您可能会收到错误通知)。