【问题标题】:Delayed messages are delivered in the same order they are sent in RabbitMQ延迟消息的传递顺序与它们在 RabbitMQ 中发送的顺序相同
【发布时间】:2021-10-25 23:11:45
【问题描述】:

我正在尝试实现一个 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]

timestamp2 距离timestamp1 大约2s

我正在使用

  • golang 1.14

  • 在 docker 中运行的rabbitmq:3.8.3-management-alpine

  • github.com/streadway/amqp v0.0.0-20200108173154-1c71cc93ed71

【问题讨论】:

  • 您好!你解决了吗?我没有亲自使用/测试过这个,但是这个想法突然出现并发现了这个问题
  • 很遗憾没有,我没有找到这个问题的答案,我不得不切换到另一个后台任务库

标签: go rabbitmq


【解决方案1】:

先进先出

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

【讨论】:

    猜你喜欢
    • 2014-02-17
    • 2020-04-17
    • 2014-08-11
    • 1970-01-01
    • 2021-06-19
    • 2021-02-05
    • 1970-01-01
    • 2011-05-25
    相关资源
    最近更新 更多