综合练习
订单通知 Topic Exchange 实验。
40 分钟
综合练习
在 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 时 ()。