作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
中间件,我给它的定义就是为了实现某系业务功能依赖的软件,包括如下部分:
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
优势:
-
支持任意延迟时间,无需依赖死信队列。
-
解决了 “队列头部阻塞” 问题,过期消息可立即被消费。
安装与配置:
-
下载插件并放入 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 分钟未支付自动取消。
-
缓存刷新:定期刷新分布式缓存。
-
重试机制:消息处理失败后,按指数退避策略延迟重试。
运维小路
一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!
关注微信公众号《运维小路》获取更多内容。