一、订单系统存在的常见问题

mq01

1、用户取消支付

mq02

用户提交订单之后订单系统会锁定库存,然后创建订单,这是订单的状态为待支付,然后跳转到支付页面,如果用户取消支付,那么订单的状态会一直都是待支付状态,而且对应库存被锁定,那么订单系统会保存该状态一段时间,比如一天,如果这段时间内,用户还没支付该订单,那么系统会释放库存,并修改订单状态已取消。

对于这种待支付的订单,现有系统的做法是在订单系统启动一个后台线程定时去扫描待支付的订单,找出过期的待支付订单,释放对应库存并修改订单状态,那么如果待支付的订单数据量比较大的话,这种做法会加大数据库的压力,效率低。

2、用户正常下单流程

mq03

用户成功支付订单之后,支付系统将支付结果通知订单系统,那么订单系统将进行下面业务处理:
(1)更新订单状态为已支付
(2)调用库存系统扣减库存
(3)调用第三方短信系统发送通知短信
(3)调用积分系统增加积分
(4)调用促销系统赠送优惠券
(5)调用仓储系统通知发货
这个环节需要经历若干步骤,不单涉及到内部子系统,还涉及到第三方系统,如果这其中某个步骤出现问题,需要重试和补偿机制,会把整个逻辑变得非常复杂和不稳定。

3、用户支付订单后发起退款申请

用户退款操作,订单需要逆向操作,需要进行下面业务处理:
(1)更新订单状态为已退款
(2)调用库存系统增加库存
(3)调用积分系统扣减积分
(4)调用促销系统回收优惠券
(5)调用仓储系统取消发货
(6)调用支付系统进行退款
与上面的问题一样,需要经历若干步骤。

4、大数据分析

mq04

大数据团队直连订单数据库进行报表统计,如果指定的时间点不是闲时,而且是复杂的统计SQL,那么订单数据库所在服务器CPU飙升,拖累了数据库,从而导致了正常的订单业务。

5、秒杀活动

mq05
电商APP通常会开展一些秒杀活动,秒杀活动期间,系统的请求量通常是平时的好几倍,那么当请求量超过数据库的最大承受能力时,将压垮数据库,最终导致系统崩溃。

二、如何解决

1、用户取消支付

mq06
对于由于用户取消支付,订单预取待支付状态且库存被锁定的问题,原先的做法是后台线程定时扫描数据库,当数据量大的时候,数据库压力大且效率低,因此这里的改进的做法是订单系统创建订单的时候,除了写数据库,也往redis写一份订单数据,然后后台线程不再去扫描数据库,而是去扫描redis, 比如通过zset数据类型,score就是订单过期的时间戳,那么定时去扫描时间戳晚于当前时间即可。

2、用户正常下单流程

对于发送通知短信、增加积分、赠送优惠券、通知发货这些动作,其实在10秒内完成还是20秒内完成,对于用户来说都无太大差别,因此对于以上动作可以采用异步化处理,这样处理不仅加快订单系统响应时间、减低代码复杂度,而且还与其他第三方系统和子系统解耦。那么可以在平台加入MQ(消息中间件),当订单支付成功时,订单系统完成更新订单状态和扣减库存之后,往MQ发送短信通知消息、增加积分消息、赠送优惠券消息以及发货通知消息,第三方短信系统从MQ中消费短信通知消息,积分系统从MQ消费积分消息、促销系统从MQ消费赠送优惠券消息、仓储系统从MQ消费发货消息,从而达到系统解耦的效果。
mq07

3、用户支付订单后发起退款申请

退款申请流程与上面的优化很类似,也是通过MQ进行异步化改造。

4、大数据分析

对于大数据分析需要执行统计SQL的动作,如果直接让BI系统直接读取订单数据库(主库),也就是与订单系统共用同一个数据库实例,由于统计SQL通常比较耗费CPU,那么势必影响订单系统的正常业务,那么我们可以再增加一个从库,这个从库专门给BI系统进行大数据分析,从而不会影响到订单系统的正常业务。
mq08

5、秒杀活动

由于平台的性能瓶颈通常都在数据库上,在秒杀活动期间,并发量往往比平常高好几倍,如果这个峰值超过了数据库的承受能力,这个时候如果请求直达数据库,通常都会把数据库压垮,那么常见的做法就是加入MQ,通过MQ来进行流量削峰操作,也就是用户的请求并不会直达数据库,而且先写入MQ,再由其他处理模块去消费MQ的消息,由于处理模块的处理能力可以有平台自身能力来定义,因此即使请求量再多,也会积压再MQ中,不会压垮数据库,从而导致系统崩溃。
mq09

总结一下:
(1)平台如果需要与多个第三方系统或者子系统进行业务交互时,通常会把可以异步化操作的动作通过消息的方式写入到MQ,再由其他模块处理响应的消息,达到简化业务流程和平台解耦的效果。
(2)平台一般不会直接开放数据库给到其他第三方团队,如果一定要通过开放数据库的方式让其他团队读取数据库中的数据,一般都会通过从库的方式,而且配置的数据库账号只有读权限。
(3)当请求的并发量大于平台的处理速度时,通常需要进行限流,如果不限流的话,需要通过MQ来暂存请求,平台内部再慢慢消费MQ中的请求。

儒猿技术窝 专栏[从 0 开始带你成为消息中间件实战高手]
https://apppukyptrl1086.pc.xiaoe-tech.com/detail/p_5d887e7ea3adc_KDm4nxCm/6
本笔记主要对该专栏的学习总结,如侵犯您的权益,请及时联系我。

打赏
支付宝 微信
上一篇 下一篇