大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
综合练习
在 spring-boot-essentials 项目完成 订单支付通知:支付成功写 MySQL 后,向 topic exchange 发 order.paid,邮件与审计两个 Queue 分别消费。串联 rmq-exchanges、rmq-spring、rmq-reliability。
学习目标
- 实现 Topic Exchange + 双 Queue 绑定
- 保证事务提交后再 publish,Consumer 幂等 + manual ack
- 用 Management UI 验证路由与队列深度
核心内容
业务场景
POST /api/orders/{id}/pay → MySQL 状态=PAID → publish order.paid
|
+-----------------------------+------------------+
v v v
[queue.notify.email] [queue.audit] (可选 DLX)
用户只等支付 API;发邮件、写审计异步完成。与 kafka-practice 双消费组类似,但 RabbitMQ 消息 ack 后删除,无法按 offset 重放。
拓扑与代码要点
@Bean TopicExchange orderTopic() { return new TopicExchange("coderoadmap.order", true, false); }
@Bean Queue emailQueue() { return QueueBuilder.durable("coderoadmap.notify.email").build(); }
@Bean Binding emailBinding() {
return BindingBuilder.bind(emailQueue()).to(orderTopic()).with("order.paid");
}
@Transactional
public void markPaid(long orderId) {
orderRepo.updateStatus(orderId, PAID);
// 事务提交后发送 — 可用 @TransactionalEventListener(phase = AFTER_COMMIT)
publisher.publishPaid(orderId);
}
Consumer 用 orderId 做 Redis 去重(redis-patterns)或 DB 唯一键,失败 nack 进 DLX。
验收清单
| 步骤 | 预期 |
|---|---|
| Compose 起 RabbitMQ | 15672 可登录 |
| 支付 API | MySQL PAID + 两队列各 1 条 |
| 停邮件 Consumer | email Ready 上升,audit 仍消费 |
| 重复投递 | 幂等,不重复发信 |
集成测试无 Broker 时 @Disabled(sb-test)。
练习
- 完成上述拓扑并实现
@RabbitListener双队列 - 在 UI 手动 Publish
order.created,验证只有绑定order.*的队列收到 - 写一段选型说明:此练习若改 Kafka,要改哪些概念
小结
Topic 路由 + 事务后发消息 + 幂等消费 = RabbitMQ 入门闭环;CodeRoadMap 生产仍以 MySQL/REST 为准,RabbitMQ 是任务队列能力扩展。 本 track 完结;事件流见 kafka-essentials,缓存见 redis-essentials。