我们已经使用 2 个队列和 x-dead-letter-exchange/x-message-ttl 实现了延迟消息处理,其中在 queue1 中的消息超时后,它将转到 queue2。
现在是否可以设置 RabbitMQ,这样如果在处理来自 queue2 的消息期间我们将其拒绝为“死信”,那么它将自动转到 queue3?我担心的是queue2中的消息已经被标记为“dead”,有没有办法区分那些因为被拒绝而死的消息并自动只将那些消息放入queue3?
我们已经使用 2 个队列和 x-dead-letter-exchange/x-message-ttl 实现了延迟消息处理,其中在 queue1 中的消息超时后,它将转到 queue2。
现在是否可以设置 RabbitMQ,这样如果在处理来自 queue2 的消息期间我们将其拒绝为“死信”,那么它将自动转到 queue3?我担心的是queue2中的消息已经被标记为“dead”,有没有办法区分那些因为被拒绝而死的消息并自动只将那些消息放入queue3?
是的,消息有可能多次死信。
要查看消息死信的原因,请查看x-death
标头,它是最近排序的数组,因此消息死信的最新原因是第一个。
有关更多详细信息,请查看死信交换手册中的死信消息部分。
升级版:
在 RabbitMQ 官方用户组中讨论了是否可以仅在被拒绝的情况下移动死信消息?:
...
我关心的是:由于消息已经被 TTL 死信了,有没有办法将它们从 Queue2 移动到 Queue3, 只有当它们被拒绝时?
要严格回答您的问题,不:您不能选择要死信的事件。
但是,我认为您真正要问的是“来自 queue2 的所有消息是否都会立即死信到 queue3,因为它们已经死信了一次?” 答案是否定的;一旦一条消息被死信发送到 queue2,它就是一个自由代理,并且只有在它再次执行一些死信时才会再次被死信。