首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在RabbitMQ中需要单独交换死信吗?

在RabbitMQ中需要单独交换死信吗?
EN

Stack Overflow用户
提问于 2020-10-03 11:30:59
回答 1查看 1.7K关注 0票数 4

我用队列设置了一个死信路由,以请求延迟数秒的被拒绝消息,防止临时使用者错误阻塞队列。我已经将其设置为工作队列和死信队列都绑定到相同的交换:

外部产生的传入消息被路由到exchange,后者将它们放置在工作队列中。在处理消息期间,用户可能会因为一些临时错误而失败(假设爬虫从网站接收错误500 )。 我们没有拒绝消息并将其再次置于队列的首位(导致无限循环),而是将被拒绝的消息(使用requeue=0)路由到交换中,将死信队列添加为路由密钥。在这里,每条消息都接收到一个X秒的TTL,在此之后它将被拒绝,因此被路由回使用路由密钥se的交换到原始工作队列。

然而,从网上的文献和例子来看,每个人似乎都建议选择一个单独的死信交换:

外部产生的传入消息被路由到工作交换,后者将它们放置在工作队列中。如果使用者失败,消息将被拒绝(与requeue=0一起),并将被路由到死信交换。死信交换将消息路由到死信队列,其中消息TTL将过期,而再次拒绝的消息将被路由回工作交换。

与第一种设计相比,第二种设计有什么关键优势吗?我无法识别任何信息,但我对RabbitMQ并不太有信心。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-08 11:26:19

这取决于您所使用的交换类型,以及您需要执行的其他路由。如果对原始消息和重新排队的消息使用相同的交换,则需要区分:

  • 新消息,这些消息可能被路由到多个队列,或者根本没有消息。
  • 失败的消息,这些消息只应路由到延迟队列。
  • 延迟消息,只应路由到失败的单个队列。

我对这个模式的实现中,我使用两个额外的交换(都是按需动态声明的),以便它尽可能独立于原始路由配置:

  • 原始消息由使用者确认,并手动重新发布到“开始”交换。这允许一些额外的灵活性,例如在消息上设置自定义标头,并且有多个具有不同TTL连接到同一个工作队列的延迟队列。
  • “开始”交换是一个扇出交换,与特定的“等待”队列绑定,如第二个图所示。
  • 当消息TTL在“等待”队列中过期时,它将被路由到一个单独的“完成”交换,设置为死信交换。
  • 该交换也是一个扇形交换,只绑定到原始工作队列。这将确保不向第一次成功处理消息的其他队列创建消息的额外副本。
  • 因此,该消息返回到原始队列中,并带有其原始路由密钥。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64183725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档