扇出交换上的RabbitMQ重试逻辑 RabbitMQ的当前系统架构

扇出交换上的RabbitMQ重试逻辑 RabbitMQ的当前系统架构,rabbitmq,spring-rabbit,rabbitmq-exchange,Rabbitmq,Spring Rabbit,Rabbitmq Exchange,我们有一组队列和交换来支持消息 主交换:这是从消息生产者处接收消息以进行第一次处理的地方。这可以是一个主题或扇出(当前的问题是关于扇出) 主队列:这是消费者从中挑选消息进行处理的队列 死交换和队列:对坏消息进行简单的基本设置 延迟队列:如果需要重新尝试,这是从使用者获取消息的队列。此队列中的消息具有特定的ttl,此队列的死交换为“主交换”。并没有人监听这个队列,消息只是等待到期并移动到“主交换” 错误队列:即使在重试后也无法处理的消息将转到此处。现在也没有人听他们的 上述设置的问题场景: 假设我

我们有一组队列和交换来支持消息

  • 主交换:这是从消息生产者处接收消息以进行第一次处理的地方。这可以是一个主题或扇出(当前的问题是关于扇出)
  • 主队列:这是消费者从中挑选消息进行处理的队列
  • 死交换和队列:对坏消息进行简单的基本设置
  • 延迟队列:如果需要重新尝试,这是从使用者获取消息的队列。此队列中的消息具有特定的ttl,此队列的死交换为“主交换”。并没有人监听这个队列,消息只是等待到期并移动到“主交换”
  • 错误队列:即使在重试后也无法处理的消息将转到此处。现在也没有人听他们的
  • 上述设置的问题场景: 假设我有一个扇出的“foo交换”,它将消息发送到队列“bar”和“baz”。假设一条消息传入,并且它是有效的,“bar”成功地处理了它,但“baz”由于某种原因失败(可能是外部服务关闭),我们希望在5分钟后重试。来自“baz”的消息被发送回“foo-exchange”(通过延迟队列),后者不仅将消息发送回“baz”,还将消息发送回“bar”

    当前实施的解决方案(我们想要比这更好的解决方案!) 每个队列有一个exchange,用于在重试超时后将重试消息发送回特定队列

    在这个场景中,我们有3个交换(“foo-exchange”、“foo-exchange-dead”、“Baz-exchange-retry(每个队列1个到扇出交换)”)和3个队列(“Baz-queue”、“Baz-queue-delay”、“Baz-queue-error”以及整个交换的1个死队列(“foo-queue-dead”)

    此设置适用于1个队列到扇出,并且将大大增加扇出交换的多个使用者队列

    因此,我们需要一种解决方案,可以将这种复杂的设置减少到一些可管理的队列和交换中

    我们已经调查过的事情:
  • x-delay-exchange:这对我们来说不是一个好的解决方案,因为它不能告诉我们有多少消息正在等待再次处理。我们需要知道在外部失败的情况下有多少消息需要重试。()
  • 消息ttl到主队列:这将阻止延迟消息后面的所有消息

  • 其中一个选项是在放入延迟队列之前用目的地详细信息装饰消息,然后当消息等待时间到期时,消息被展开以获取目的地和原始消息并发送到目的地。

    每个队列也绑定到默认交换(“”)路由密钥等于队列名称


    您只需将过期的死信直接发送到原始队列。

    当您说“装饰”时,您的意思是添加一个新的标题吗?将其发送到正确队列的逻辑在哪里?是的,您答对了。逻辑应该在延迟队列处理中。这大大简化了事情!感谢您的洞察力。