我有一个设置了max length
参数的队列,如https://www.rabbitmq.com/maxlength.html。
我注意到,被拒绝的消息和达到最大长度时被删除的消息都会在死信交换中结束。
是否可以定义多个死信交换?一个用于拒绝的消息,一个用于清除的消息。
更新
我不介意清除的消息被默默地丢弃,而不是转发到死信交换。这样,只有被拒绝的消息最终进入死信交换。这可能吗?
我有一个设置了max length
参数的队列,如https://www.rabbitmq.com/maxlength.html。
我注意到,被拒绝的消息和达到最大长度时被删除的消息都会在死信交换中结束。
是否可以定义多个死信交换?一个用于拒绝的消息,一个用于清除的消息。
更新
我不介意清除的消息被默默地丢弃,而不是转发到死信交换。这样,只有被拒绝的消息最终进入死信交换。这可能吗?
2条答案
按热度按时间bsxbgnwa1#
这取决于您以后想对消息做什么。在我的例子中,我需要丢弃“清除”的消息,因为我只想将否定的消息重新发布到同一队列的尾部,以便在处理完其余消息后重试它们。
事实证明RabbitMQ已经考虑了这种使用情形。
可能会形成消息死信循环。例如,当队列将死信消息发送到默认交换而未指定死信路由关键字时,可能会发生这种情况。如果在整个循环中没有拒绝,则将丢弃此类循环中的消息(即两次到达同一队列的消息)。
因此,如果创建循环,只有被拒绝的消息才会真正被重新路由到队列,而被清除的消息不会。
sq1bmfud2#
您可以设置RabbitMQ,根据死亡原因(
x-death.reason
或x-first-death-reason
)通过死信交换路由消息。您应该使用
type=headers
设置死信交换,以便能够通过这些标头的值进行路由,并且x-match
应该是any-with-x
或all-with-x
,以便能够匹配x-
标头。从有关交换标头的文档中:
对于
any
和all
,以字符串x-
开头的标头将不用于评估匹配项。将x-match
设置为any-with-x
或all-with-x
也将使用以字符串x-
开头的标头来评估匹配项。事情大概是这样的: