RabbitMQ在不从使用者发布的情况下重试消息

RabbitMQ在不从使用者发布的情况下重试消息,rabbitmq,Rabbitmq,我是否可以重试消息N次,然后将其发送到死队列,而不进行确认并重新发布来自消费者的消息 我能想到的唯一方法是在dlx安装程序中使用多个队列,这样会填充下一个重试队列: test ---> test.retries.1 ---> ... ---> test.retries.N ---> test.dead 这样行吗?我不确定我的意思是“好”。我最近开始和兔子玩。比如说,这是一种常见的设置吗?有什么缺点吗 还有别的办法吗?可能是一个插件,它在basic.reject中添加了一

我是否可以重试消息N次,然后将其发送到死队列,而不进行确认并重新发布来自消费者的消息

我能想到的唯一方法是在dlx安装程序中使用多个队列,这样会填充下一个重试队列:

test ---> test.retries.1 ---> ... ---> test.retries.N ---> test.dead
这样行吗?我不确定我的意思是“好”。我最近开始和兔子玩。比如说,这是一种常见的设置吗?有什么缺点吗

还有别的办法吗?可能是一个插件,它在
basic.reject
中添加了一个计数器,并执行相同的操作


旁注:我想知道这一点,因为我不相信消费者会确认一条消息(即使他无法处理),然后再次发布。最后,您将得到多个LIER,这些LIER将发布消息,并不时地在其他人“只是为了确保”之前立即获取消息,以及。。你会让他们记住。。(而且不会)[这也发生在具有多个重试队列的场景中,但至少代理将控制消息的去向,而不是消费者]

使用requeue+

您有一个队列,并且在出现故障时多次重新获取消息,当ttl过期时,您可以设置一个队列

basic.reject具有多个队列

失败时,您始终执行
basic.reject而不重新请求
,并使用dlx将消息发送到下一个重试队列:

test ---> test.retries.1 ---> ... ---> test.retries.N ---> test.z_dead
目前,我使用的这种方法只有一个重试队列,我有一个特殊的队列,从dlx接收特定消息并向我发送电子邮件。(就我而言,几小时后会收到一条消息)

basic.reject,计算重试次数

当您执行
basic.reject without requeue
并使用dlx时,您可以检查dlx添加的
x-death
头以确定重试次数

下面是如何在ruby gem中完成的:

---> test (queue)
     |
     | test.retry (exchange)
     |
     ---> test.retry (queue - wait for some time with ttl)
          |
          | test.retry.requeue (exchange)
          |
          ---> test (queue)

最后,您要计算您通过测试队列的次数,当您超过重试次数时,您必须确认消息(可能是在发布消息后,以便您收到错误通知)。

确认消息并不意味着消费者处理了它。这仅仅意味着消费者收到了教程中的信息:“确认(确认)从使用者发回,告知RabbitMQ已接收、处理特定消息,并且RabbitMQ可以自由删除该消息。如果使用者在未发送ack的情况下死亡,RabbitMQ将理解消息未被完全处理,并将其重新传递给另一个使用者。这样,即使从这个问题上看,您似乎能够处理消息,但无法根据处理消息的内容执行其他操作。在这种情况下,代理已经成功地履行了向您传递有效消息的职责,而您的消费者只是没有告诉代理您已经处理了该消息(即使根据消息内容采取的一些其他无关操作失败)。如果是这样的话,那么正确的解决方案就是确认消息并重新发布。我认为你可以创建一个这样的消费者。。正确的解决方案是拒绝并继续执行我在问题中建议的场景。(当然,你也可以让消息像疯了一样循环,也许可以使用ttl,但另一种情况会让你有更多的控制权)@bilof,我有一个队列
a
。当我拒绝来自
A
的消息时,它不会被重新查询。它被发送到
DLX
。我可以这样配置吗:每天14:00将消息从
DLX
重新发送到队列
A
?或者类似于:控制单个消息级别-尝试在进入
DLX
一小时后重新发送消息?@HaskellFun只需添加一个cron,将它们从您的死队列移动到a。否则,您可以使用每条消息ttl攻击某些内容<代码>每条消息ttl意味着从
A
重新发送到
DLX
的每条消息将在固定时间后重新发送到
A
。如果再次拒绝,请返回到
DLX
,并在ttl过期后再次返回。。。是吗?@HaskellFun你可以有1个。队列ttl-例如,如果消息在队列中超过一个小时,请将其发送到DLX,您可以有2个。根据消息ttl,例如正常队列,您(您的应用程序)应使用所需的ttl P发布消息。阅读文档。在案例1中,按摩将永远循环:)ps。这就是为什么你需要在应用程序中设置一个条件,该条件将丢弃循环次数过多的消息。在案例2中,过期标头将被删除