RabbitMQ 延迟消息完整指南
1. 概述
延迟消息是指在发送消息时指定一个延迟时间,消息不会立即投递给消费者,而是在延迟时间结束后才被投递给消费者处理。这在许多业务场景中非常有用,如订单超时处理、预约提醒、定时任务等。
2. 实现方式
2.1 延迟消息插件方式
插件安装
# 启用延迟消息插件
rabbitmq-plugins enable rabbitmq_delayed_message_exchange交换机配置
@Bean
public CustomExchange delayExchange() {
Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "direct"); // 指定延迟消息到期后的路由类型
return new CustomExchange("exchange.name", "x-delayed-message", true, false, args);
}参数说明
x-delayed-message: 交换机类型,表示这是一个延迟消息交换机x-delayed-type: 延迟消息到期后的路由类型,可选值包括:direct: 直连类型topic: 主题类型fanout: 广播类型headers: 头部类型
消息发送
// 发送延迟消息
MessageProperties properties = new MessageProperties();
properties.setHeader("x-delay", 5000); // 延迟5秒
Message delayedMessage = new Message(message.getBytes(), properties);
rabbitTemplate.send(exchangeName, routingKey, delayedMessage);2.2 TTL + 死信队列方式
当无法使用延迟消息插件时,可以使用 TTL(Time To Live)+ 死信队列的方式实现延迟消息。
配置
// 死信交换机
@Bean
public DirectExchange deadLetterExchange() {
return new DirectExchange("dead.letter.exchange");
}
// 死信队列
@Bean
public Queue deadLetterQueue() {
return QueueBuilder.durable("dead.letter.queue")
.withArgument("x-message-ttl", 5000) // 设置TTL
.withArgument("x-dead-letter-exchange", "normal.exchange") // 死信转发交换机
.withArgument("x-dead-letter-routing-key", "routing.key") // 死信转发路由键
.build();
}
// 绑定
@Bean
public Binding deadLetterBinding() {
return BindingBuilder.bind(deadLetterQueue())
.to(deadLetterExchange())
.with("dl.routing.key");
}2.3 消息级 TTL 方式
在发送消息时单独设置 TTL:
MessageProperties props = new MessageProperties();
props.setExpiration("5000"); // 5秒后过期
Message message = new Message(content.getBytes(), props);3. 优缺点对比
| 方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 延迟消息插件 | 使用简单,功能强大 | 需要安装插件,服务器配置要求高 | 高频延迟消息场景 |
| TTL+死信队列 | 不需要额外插件,兼容性好 | 配置复杂,灵活性较低 | 对延迟精度要求不高的场景 |
| 消息级TTL | 灵活性高 | 不能动态修改TTL,功能有限 | 单条消息个性化TTL需求 |
4. 注意事项
- 插件依赖:使用延迟消息插件方式需要确保 RabbitMQ 服务器已安装相应插件
- 性能影响:大量延迟消息可能影响 RabbitMQ 性能
- 可靠性:延迟消息期间若服务重启,可能导致消息丢失
- 监控:需要监控延迟消息的处理状态,防止消息积压
5. 实际应用场景
- 订单超时处理:用户下单后一定时间内未支付则自动取消
- 预约提醒:提前一定时间向用户发送提醒
- 重试机制:消息处理失败后延迟重试
- 定时任务:替代传统定时任务,更灵活高效
这份文档涵盖了 RabbitMQ 延迟消息的主要知识点,希望能帮助您深入理解和应用这一重要功能。
评论