好久没更新文章了,有半个月了,最近工作确实比较忙,忙得热火朝天的。
当然也不是瞎忙,做了一个非常有意义的需求,后续也会分享出来,敬请关注哈!
今天,我们继续RocketMQ专题文章。
目录:
- 业务场景
- 问题原因
- 解决方案
- 幂等性
- 总结
1、业务场景
在电商系统中,一般付款成功后,会给用户发放优惠券,一来给用户优惠,二来激励用户继续消费。但最近运营反馈,优惠券有时候会重复发放。
架构图
基于优惠券重复发放问题的前提下,我们来看一下流程图:
- 1、支付订单
- 2、发送支付消息
- 3、消费支付消息
- 4、发放优惠券
上面这个是发放优惠券的流程图。
现在,我们首先来思考一下,绘制一下关于这个问题的蓝图:
1、目的:解决优惠券重复方法的问题
2、解决方案:待定
3、原因:未知
方法论: 想要解决这个问题-->得设计解决方案-->找到问题原因
2、问题原因
抽象原因
- 原因1:生产者多次发送同一条消息,导致消费者多次消息同一条消息,因此重复发放优惠券
- 原因2:生产者发送一次消息,但消费者多次消费同一条消息,因此重复发送优惠券
具象原因
- 比如原因1,用户支付订单后,订单系统处理有点慢,这会让支付系统以为请求超时,这时支付系统会再次调用订单系统。这就会导致订单系统多次发送同一条支付消息。
- 原因1,消息重试,网络异常,都会导致生产者多次发送同一条消息,这里不细说,想要细究,欢迎留言。
- 比如原因2,用户支付成功,订单系统和支付系统交互也没超时,顺利发送一条支付消息,这个时候优惠券系统也成功消费支付消息,这时发放了一张优惠券。但意外来了,这个时候优惠券系统崩了,但还没来得及提交消费进度offset到RocketMQ。因而重启优惠券系统后,又会重新消费一次支付消息,从而重复发放优惠券。
3、解决方案
我们知道问题原因后,就可以开始设计解决方案了
- 针对原因1:生产者多次发送同一条消息,导致消费者多次消息同一条消息,因此重复发放优惠券
- 确保那就是要确保生产者能成功发送有且只有一次消息,但需要确保消费者只消费一次。
- 对阵原因2:生产者发送一次消息,但消费者多次消费同一条消息,因此重复发送优惠券
- 那就是要确保消费者只消费一次。但奈何这个不太现实,为什么呢?因为服务器重启,上线升级版本,这是非常常见的现象。因此,只消费一次,不太现实。
上面这2种方案,都涉及到消费者,都不能完美解决重复消费消息的问题
其实我们想想,我们可以用事务消息的方法,来确保消息一定能发送成功到RocketMQ,这个时候我们只需要解决消费者的消费问题即可。
4、幂等性
想要解决重复消息问题,我们需要引入幂等性机制。
什么是幂等性
就是无论别人对你的接口请求多少次,你都需要保证接口调用一次和多次的结果是相同的。
天上飞的理论,得有落地实现。
幂等性,就是理论。那具体的落地实现一般有:
业务判断法
举个例子,在电商系统中,有订单id,这个时候在优惠券系统每消费一条支付消息,同步插入一条订单数据,能插入成功,证明之前这个订单没被消费过,发送优惠券。插入失败,则证明这个订单之前已经被消费过了。不做任何操作即可。
Redis缓存法
在并发量特别高的订单系统中,支付消息会特别多,这个时候,如果用业务判断法,插入数据库,容易存在瓶颈。这个时候如果想要提高并发量,可以考虑使用Redis。
Redis缓存订单id,如果这个订单id已经被消费过后,会存在Redis中。当这个订单id再次被消费时,就会被过滤,不操作。
这也是一种幂等性的实现方法。但Redis容易丢数据,这也是需要考虑的。
5、总结
用什么幂等性的具体方案,得看你的使用场景。
- 如果你的并发量不高,直接用数据库即可解决。
- 如果你允许有误差,允许重复发放优惠券,只追求高并发量,直接用Redis即可。
- 如果你既要并发量,也要准确性,可以结合数据库+Redis的方案,但这种方案实现复杂度比较高。
所以,选择什么方案,真的得看你的使用场景。
你也看看你公司的幂等性方案是如何做的?学以致用啊!!!
好了,今天的分享,就到这结束了。
bye bye
有问题,欢迎留言。。。
也欢迎技术交流。。。
6、后续文章
- RocketMQ-入门(已更新)
- RocketMQ-架构和角色(已更新)
- RocketMQ-消息发送(已更新)
- RocketMQ-消费信息
- RocketMQ-消费者的广播模式和集群模式(已更新)
- RocketMQ-顺序消息(已更新)
- RocketMQ-延迟消息(已更新)
- RocketMQ-批量消息(已更新)
- RocketMQ-过滤消息(已更新)
- RocketMQ-事务消息(已更新)
- RocketMQ-消息存储(已更新)
- RocketMQ-高可用
- RocketMQ-高性能
- RocketMQ-主从复制
- RocketMQ-刷盘机制(已更新)
- RocketMQ-幂等性(已更新)
- RocketMQ-消息重试
- RocketMQ-死信队列
...
欢迎各位入(guan)股(zhu),后续文章干货多多。
—本文转载自「大头菜技术」公众号