【发布时间】: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
【问题讨论】:
-
您好!你解决了吗?我没有亲自使用/测试过这个,但是这个想法突然出现并发现了这个问题
-
很遗憾没有,我没有找到这个问题的答案,我不得不切换到另一个后台任务库