397 字
2 分钟
RabbitMQ 延迟队列:TTL+DLX 与延迟消息插件
RabbitMQ 原生没有通用的延迟消息类型,常见做法是组合 TTL(消息存活时间)和 DLX(死信交换器),也可以使用官方延迟消息插件。
TTL + DLX 的工作流程
消息先进入没有消费者的普通队列,超过 TTL 后变成死信,被转发到绑定的死信交换器,再进入死信队列供消费者处理。

TTL 可以配置在队列级别,也可以配置在单条消息上。DLX 则负责接收过期、被拒绝或因队列满而溢出的消息。
队头阻塞问题
同一队列先进先出:如果先进入的消息延迟 10 秒,后进入的消息只延迟 2 秒,后者也可能要等队头消息过期后才能继续处理。
常见解决方式是按延迟档位拆分多个队列;如果延迟时间非常灵活,则使用延迟消息插件。
延迟消息插件
插件提供 x-delayed-message 交换器,消息不会立即路由到队列,而是先按延迟时间保存,时间到达后再投递到目标队列。

大量延迟消息的注意事项
死信队列仍是普通队列,消息量大时可能成为瓶颈。可以拆分多个死信队列、增加消费者并行度,或改用插件。插件使用 Mnesia 保存延迟消息,大量堆积会占用内存;更大规模的延迟任务可以评估 RocketMQ 或 Redis 方案。
RabbitMQ 延迟队列:TTL+DLX 与延迟消息插件
https://blog.xqcherry.top/posts/interview/message-queues/rabbitmq-delay-queue/ 目录