RabbitMQ在扇出交换时重试逻辑

时间:2017-10-02 16:32:28

标签: rabbitmq spring-rabbit spring-rabbitmq rabbitmq-exchange

RabbitMQ周围的当前系统拱门

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

  1. 主要交换:这是从消息制作者收到消息以便第一次处理的地方。这可能是一个主题或扇出(当前问题是关于扇出)
  2. 主要队列:这是消费者从中挑选消息进行处理的队列。
  3. 死交换和队列:错误消息的简单基本设置。
  4. 延迟队列:如果需要重新尝试,这是从消费者那里获取消息的队列。此队列中的消息具有特定的ttl,此队列的死交换是“主交换”。没有人听这个队列,消息只是坐着过期并转移到“主要交换”。
  5. 错误队列:即使重试后仍无法处理的邮件也会显示在此处。目前还没有人听他们说话。
  6. 以上设置的问题场景:

    说我有一个扇出“foo-exchange”,它将消息发送到队列“bar”和“baz”。假设有消息进来,它有效,“bar”成功处理,但“baz”由于某种原因失败(可能是外部服务失败),我们想在5分钟后重试。来自“baz”的消息被发送回“foo-exchange”(通过延迟队列),然后不仅将其发送回“baz”,而且还发送回“bar”。

    当前实施的解决方案(我们想要比这更好的东西!)

    我们有一个每个队列的交换,以便在重试超时后将重试的消息发送回特定的队列。

    在这种情况下,我们有3个交换(“foo-exchange”,“foo-exchange-dead”,“Baz-exchange-retry(每个队列1个扇出交换)”和3个队列(“baz-queue”) ,“baz-queue-delay”,“baz-queue-error”和整个交换的1个死队列(“foo-queue-dead”。

    此设置用于1个队列扇出,并且会在扇出交换具有多个消费者队列时显着增加。

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

    我们已经研究过的事情:

    1. x-delay-exchange :这对我们来说不是一个好的解决方案,因为这并不能说明有多少消息等待再次处理。我们需要知道在外部故障情况下要重试多少次。 (https://github.com/rabbitmq/rabbitmq-delayed-message-exchange
    2. 消息ttl到主队列:这会阻止延迟消息后面的所有消息。

2 个答案:

答案 0 :(得分:1)

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

您只需将过期的死信直接路由到原始队列即可。

答案 1 :(得分:0)

其中一个选项是在放入Delay队列之前用Destination详细信息装饰消息,然后当消息等待持续时间到期时,将解包消息以获取目标和原始消息并发送到目的地。