go - 延迟消息的传递顺序与它们在 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秒
我在用着
戈朗 1.14
rabbitmq:3.8.3-management-alpine 在 docker 中运行
github.com/streadway/amqp v0.0.0-20200108173154-1c71cc93ed71
解决方案
先进先出
消息 2 的传递等待消息 1 的传递(即使它的延迟较小)
推荐阅读
- c# - 如何在通用 Windows 平台中连接组合框和图像?
- javascript - Leaflet.js 用户脚本,从坐标转换为经纬度时遇到问题
- oracle - 从 S3 存储桶下载文件 - AWS Oracle RDS
- javascript - 如何在 React 中清理 HTML?
- azure - 使用本地值定义 Azure Databricks 用户块
- java - 在 Eclipse 中创建 Weblogic Server - 依赖问题
- css - 使 v-col 高度等于父 v-row
- ios - ErrorDomain Code=260 尝试读回本地存储的图像文件时
- lua - 如何在lua脚本中的每一行中填充列表
- dart - Dart中是否有任何http标准头定义lib