RabbitMQ-延迟队列(Delayed Queue)

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

图片

中间件,我给它的定义就是为了实现某系业务功能依赖的软件,包括如下部分:

Web服务器

代理服务器

ZooKeeper

Kafka

RabbitMQ(本章节)

我们在Rabbitm-队列(Queues)的时候,介绍创建队列的时候后面还有很多参数,今天我们介绍的延迟队列就会利用到它。而且我们交换机还可以把消息转发到其他交换机(有些交换机只对内)。

1. 核心概念与作用

延迟队列用于处理需要在指定时间后执行的任务,例如:

  • 订单超时自动取消。

  • 消息定时重试。

  • 优惠券到期提醒。

  • 消息不会立即被消费,而是在指定时间后才可见。

  • 实现方式灵活,可基于 TTL 和死信队列或插件实现。

2. 实现方式
2.1 基于 TTL 和死信队列的实现
  • 消息发送到临时队列并设置 TTL。

  • 消息过期后进入死信队列,消费者从死信队列消费消息,实现延迟效果。

  • 队列级别的 TTL(x-message-ttl)会导致队列中所有消息具有相同的过期时间。比如设置30000(毫秒)消息到达队列30秒未被消费就会过期。

  • 消息级别的 TTL(expiration 属性)存在 “队列头部阻塞” 问题:若队首消息未过期,后续消息即使已过期也无法被消费。

2.2 基于 RabbitMQ 延迟消息插件的实现

插件名称rabbitmq_delayed_message_exchange
优势

  • 支持任意延迟时间,无需依赖死信队列。

  • 解决了 “队列头部阻塞” 问题,过期消息可立即被消费。

安装与配置

  1. 下载插件并放入 RabbitMQ 插件目录。

wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/3.8.9/rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez

2.启用插件

./sbin/rabbitmq-plugins enable rabbitmq_delayed_message_exchange

3.创建 x-delayed-message 类型的交换机。

图片

4.生产者发送延迟消息

import pika

headers = {"x-delay": 5000}  # 延迟 5 秒
properties = pika.BasicProperties(headers=headers)
channel.basic_publish(
    exchange="delayed.exchange",
    routing_key="my.key",
    body="Delayed Message",
    properties=properties
)

5. 应用场景

  • 订单系统:下单后 30 分钟未支付自动取消。

  • 缓存刷新:定期刷新分布式缓存。

  • 重试机制:消息处理失败后,按指数退避策略延迟重试。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值