案例背景
电商平台上,用户购买商品时会选择使用积分抵扣一部分的金额,在整个过程中,交易服务和积分服务是通过MQ消息队列进行通信的。下单时,交易服务发送扣减积分的消息给MQ队列,而积分服务则在消费端消费这条命令,实现真正扣减操作。
思路分析
使用MQ的目的:对系统进行解耦,流量控制(高可用和高性能问题)
系统解耦
- 用MQ消息队列,可以隔离系统上下游环境变化带来的不稳定因素。比如,积分服务无论如何变化,交易服务都不受影响,即便积分服务出现故障,主交易流程也可以将积分服务降级,实现2个服务之间的解耦,实现系统高可用
流量控制
- 高峰期交易时流量突增的场景,通过MQ实现流量的削峰填谷作用,可以下游服务处理能力自动调节流量
解题思路
解决消息丢失需要知道哪些环节会丢失消息。而整个过程涉及生产者,消费者,消息中间件。
生产者:消息在发送给MQ时,若出现网络问题,或者业务bug问题可能会导致消息无法发送成功。所以需要处理好返回值和异常,防止消息无法正常发送给MQ,必要时可增加报警机制,监控未成功发送的数据,提醒开发人员进行人工干预或自动重发机制。
消息中间件:由消息中间件来保证
消费者:消费者从Broker上拉取消息,只要消费服务完成业务处理,再发送消费成功确认,就能保证消息不丢失。
整个过程,从生产者发送消息,到消费者获取到消息,并完成业务处理,最后发送消费完成确认,就可以保证万无一失。但是对于Design for Failure的设计原则,我们应该增加一个消息检测来检查消息是否丢失。即在消息生产者,发出消息时同时携带全局唯一ID或者连续递增版本号,然后消费者对对应的版本做校验。