我已经为我的队列设置了死信路由,以便将被拒绝的消息重新排队并延迟数秒,防止临时消费者错误堵塞队列。我已经设置了工作队列和死信队列都绑定到同一个交换机上:
外部生成的传入消息被路由到交换机,然后放置在工作队列中。在处理消息时,消费者可能会因为一些临时错误(比如爬虫从网站接收到500错误)而失败。
我们不会拒绝消息并将其重新放置在队列的头部(导致无限循环),而是将被拒绝的消息(使用
第二个设计相对于第一个有哪些关键优势?我无法确定,但我对RabbitMQ也不是太自信。
我们不会拒绝消息并将其重新放置在队列的头部(导致无限循环),而是将被拒绝的消息(使用
requeue=0
)路由到交换机,并将死信队列添加为路由键。在这里,每个消息都会接收到X秒的TTL,之后它将被拒绝,因此被路由回交换机,并将路由键设置为原始工作队列。然而,在查看文献和在线示例时,似乎每个人都建议路由到单独的死信交换机:
外部生成的进入消息被路由到工作交换机,然后放置在工作队列中。如果消费者失败,则消息将被拒绝(使用requeue=0
),并将被路由到死信交换机。死信交换机将消息路由到死信队列,消息的TTL将过期,再次被拒绝的消息将被路由回工作交换机。
第二个设计相对于第一个有哪些关键优势?我无法确定,但我对RabbitMQ也不是太自信。