常见模式
工作队列、RPC、延迟队列概念。
30 分钟
常见模式
RabbitMQ 经典用法:工作队列 削峰填谷、RPC 临时回复队列、延迟队列(TTL + DLX 或插件)定时触发。CodeRoadMap lab 以工作队列为主;事件广播对照 kafka-intro。
学习目标
- 实现多 Worker 竞争消费同一 Queue
- 理解 RPC 的
replyTo与correlationId - 知道延迟消息的 TTL + DLX 思路
核心内容
工作队列(Work Queue)
[API 高峰 publish] --> [Queue: export.tasks] --> Worker1 / Worker2 / Worker3
订单导出、批量发邮件、生成报表:API 只入队立即返回,Worker 按 prefetch 拉活。扩容 加 Consumer 实例 即可;无需像 Kafka 那样改分区数。慢任务设 prefetch=1(rmq-publish)。
与 Redis List 队列相比,RabbitMQ 提供 ack、DLX、Management 可视化。
RPC(Request / Reply)
String replyQueue = channel.queueDeclare().getQueue();
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
.correlationId(corrId)
.replyTo(replyQueue)
.build();
channel.basicPublish("", "coderoadmap.rpc", props, requestBytes);
// 另线程 basicConsume replyQueue,匹配 correlationId
适合 短时同步语义、跨进程 调用;长耗时仍应改异步任务 + 轮询 MySQL 状态(spring-boot-essentials REST)。微服务间默认仍 REST/Feign,MQ RPC 作 lab 了解即可。
延迟队列(概念)
[延迟 Exchange/Queue TTL=30s] --过期--> [DLX] --> [实际消费 Queue]
「30 分钟后未支付取消订单」:消息先进延迟队列,到期死信到业务 Queue。也可用 rabbitmq_delayed_message_exchange 插件。Redis 键过期 + 回调 不可靠(键删除不保证触发),复杂延迟仍选 MQ。
与 Kafka 模式对照
| 模式 | RabbitMQ | Kafka |
|---|---|---|
| 任务竞争 | 多 Consumer 同 Queue | 同 group 分摊分区 |
| 广播 | fanout | 多 consumer group |
| 延迟 | TTL+DLX / 插件 | 时间戳 + 消费过滤 |
练习
- 用 3 个 Worker 消费
export.tasks,统计各自处理条数 - 画出 RPC 的 replyTo 时序图
- 说明「未支付超时关单」用 TTL+DLX 还是 Cron 扫 MySQL 更合适