本人详解
作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》
公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题
中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯
转载说明:务必注明来源(注明:作者:王文峰哦)
学习教程(传送门)
1、掌握 JAVA入门到进阶知识(持续写作中……)
2、学会Oracle数据库用法(创作中……)
3、手把手教你vbs脚本制作(完善中……)
4、牛逼哄哄的 IDEA编程利器(编写中……)
5、吐血整理的 面试技巧(更新中……)
背景与挑战
在某电商平台中,订单创建后需触发多个动作:
- 通知支付系统生成支付链接
- 扣减库存
- 发送短信/邮件通知用户
- 更新用户积分
最初采用 同步调用 实现,导致以下问题:
• 性能瓶颈:高并发时接口响应慢,超时频繁。
• 系统耦合:任一服务故障(如短信服务宕机)导致整个订单流程失败。
• 扩展困难:新增业务逻辑(如优惠券核销)需修改订单主代码。
技术选型:为什么选择 RabbitMQ?
为解决上述问题,引入消息队列实现 异步解耦,选型考虑如下:
• 可靠性:支持持久化、ACK 确认,适合电商场景。
• 灵活路由:通过 Topic 交换器实现消息的动态分发。
• 社区支持:丰富的客户端库和运维工具(如管理界面)。
核心设计
- 整体架构
(示意图:生产者 -> Exchange -> 多个队列 -> 消费者服务)
• 生产者:订单服务(Order Service)作为 Producer,订单创建后发送消息到 RabbitMQ。
• 消费者:支付、库存、通知等服务作为 Consumer,订阅各自队列处理消息。
- 消息流转设计
• Exchange 类型:使用 Topic Exchange,按order.action.{service}
格式路由消息(如order.action.payment
)。
• 队列绑定:
• 支付服务绑定路由键 order.action.payment
• 库存服务绑定路由键 order.action.inventory
• 通知服务绑定 order.action.notification
- 关键机制
• 持久化:队列和消息均设置为持久化,防止服务重启丢失数据。
• 消费者 ACK:采用手动确认模式,确保消息处理成功后才移除。
• 死信队列:处理失败的消息转入 DLX,人工介入或自动重试。
代码实现(Spring Boot 示例)
- 生产者(订单服务)
@RestController
public class OrderController {
@Autowired
private RabbitTemplate rabbitTemplate;
@PostMapping("/createOrder")
public