消息队列为什么能削峰填谷
消息队列在削峰填谷、异步解耦中发挥关键作用。很多项目引入消息队列后遇到了消息丢失、重复消费等问题。本文讲为什么它能解决这些问题,以及项目中如何选型和避坑。
先从业务问题出发
架构设计不要先问“用什么中间件”,而要先问业务目标:是要提升吞吐、解耦系统、保证最终一致,还是降低峰值压力?不同目标对应的方案完全不同。
一个典型流程
以订单创建后发送通知为例:
- 订单服务先保存订单。
- 写入消息或事件。
- 通知服务异步消费。
- 消费端做好幂等,避免重复通知。
伪代码可以这样理解:
orderService.create(order); |
消费端必须能处理重复消息:
if (processed(messageId)) { |
设计时要补的问题
- 消息发送失败怎么办?
- 消费失败是否重试?
- 重复消费如何保证幂等?
- 下游长时间不可用时如何降级?
核心要点
消息队列的核心价值:异步处理、解耦、削峰填谷
常见的消息队列:RabbitMQ、Kafka、RocketMQ 的区别
消息丢失的原因和解决方案:生产者确认、消息持久化、消费者确认
消息重复消费的处理:幂等性设计
总结
消息队列是构建高可用系统的重要组件,但需要正确使用。在实际项目中,根据业务需求选择合适的消息队列,并做好消息可靠性保障。