各位朋友,今天咱们来聊聊消息队列中一个很经典的问题——如何解决消息重复。
在实际开发过程中,很多使用过消息队列的同学都碰到过这个情况。比如说商城下单送积分,用户在商城下单成功后,通过消息队列给积分系统发送消息奖励积分。假如出现消息重复,像积分系统收到同一个用户同一个订单的两条相同消息,那积分可能就会加两遍。原本下单 100 块奖励 100 积分,现在可能就变成了 200 积分,这要是一堆用户都遇到这种情况,那问题可就大了,会给公司造成资损,还容易引起各方扯皮。
出现重复消息的可能性有很多,常见的场景是发送方为防止消息丢失做了消息补偿。比如消费方响应超时、网络抖动、MQ 挂了或者其他原因,导致发送方长时间收不到消费成功的消息,就会再次发送进行补偿。要是消费端响应不及时,就可能多次补偿、重发消息,一旦消费端响应,就会重复处理。
那要怎么解决呢?很简单,需要针对积分累积接口做幂等设计。但首先应该从上游,比如下单中心去做消息去重处理,不过咱们不能完全依赖上游,还得在积分中心做好幂等设计,才能完全避免和钱相关的麻烦。积分中心的幂等处理也不难,根据用户订单号或者流水号来判断就行。每成功操作一条积分奖励就记录下来,即使消息重复了,只要判断同一个订单号已经操作加分,就不再进行任何操作。
总结下来,解决消息重复就一条路,那就是做好接口的幂等设计。
好了,今天关于这个话题就聊到这儿,如果您对本期内容有任何疑问,欢迎在评论区给我留言。谢谢大家!