首页 > 解决方案 > 延迟消息的传递顺序与它们在 RabbitMQ 中发送的顺序相同

问题描述

我正在尝试实现 rabbitmq 延迟消息队列(没有插件)。我遇到了一些奇怪的问题。这是我当前的设置(不是实际名称,顺便说一句)

1个交换“交换”

2个队列:最终目的地队列“Queue”和延迟队列“Delayed”

两个队列都绑定到“Exchange”

这是我发布消息的方式

err := confirmModeChannel.Publish(
  "Exchange", // exchange
  "Delayed",   // routing key
  false,        // mandatory
  false,
  amqp.Publishing{
    Body:         payload,
    Expiration:   expiration,
  })

(发布确认已处理,但此处未显示)

以及如何定义延迟通道

channel.QueueDeclare(
    "Delayed",             // name
    true,             // durable
    false,            // delete when unused
    false,            // exclusive
    false,            // no-wait
    map[string]interface{}{
      "x-dead-letter-exchange": "Exchange",
      "x-dead-letter-routing-key": "Queue"
    }, // arguments
  )

以及它如何与交易所绑定

channel.QueueBind(
    "Delayed",    // queue name
    "Delayed",    // routing key
    "Exchange",    // exchange
    false,
    nil,
)

交换被正确定义为“直接”

问题是,如果我使用“队列”并将一些消息发布到“延迟”,则消息的到达顺序与发送的顺序相同,但会延迟到最大过期时间。例如

send message 1 with 3s delay
send message 2 with 1s delay

3秒后,它们被交付

received message 1 at [timestamp1]
received message 2 at [timestamp2]

timestamp1 和 timestamp2 几乎相同(一些纳秒不同) 我不知道我在哪里搞砸了?我希望消息按此顺序到达

received message 2 at [timestamp2]
received message 1 at [timestamp1]

时间戳2与时间戳1相距约2秒

我在用着

标签: gorabbitmq

解决方案


先进先出

消息 2 的传递等待消息 1 的传递(即使它的延迟较小)


推荐阅读