终身学习,迭代更新技术能力,保持核心竞争力

采用持续集成、自动化测试、全链路测试、自动化部署、灰度发布、容器化部署的方式在进行系统的开发、测试以及发布

项目案例驱动技术学习

系统架构的痛点,使用何种技术方案?如何使用?

技术方案如何落地,考虑哪些因素?

会有哪些问题(消息丢失),如何解决?

消息中间件技术到底在生产环境是解决哪些系统业务问题的?
到底如何用消息中间件技术来解决这些问题?
如何根据生产情况去设计消息中间件的技术方案?
在真正把消息中间件技术落地到项目中的时候,到底应该考虑哪些问题?

1 业务流程

整体流程:

核心业务流程

  1. 确认这个订单中的商品、价格、运费、优惠券、收件地址、是否开发票及发票抬头等。。。
  2. 创建订单,订单信息由APP传过来,入库
  3. 跳转支付页面,完成支付
  4. 支付成功通知,发货
  5. 发送优惠券、抵用卷,短信推送支付成功、待发货信息

非核心业务流程

  1. 用户查询自己订单,订单查询模块
  2. 下单模块
  3. 支付成功之后异步发优惠券、红包和推送
  4. 退货
  5. 订单的物流信息、配送状态
  6. 订单数据,大数据分析
  7. 高并发下单场景:流量洪峰(双11),秒杀模块

2 订单系统的真实生产负载情况

初创新兴互联网公司

千万注册用户,百万日活,每日几十万订单量,每天高峰期访问每秒两三千的QPS

大促:日百万订单,10000QPS

QPS:系统每秒的查询数量,每秒请求数

压力有二:

  1. 订单系统日益增长的数据量
  2. 在大促活动时每秒上万的访问压力

3 当前系统架构及面临的问题

应用集群部署,8台机器,4核8G,峰值2000QPS

单数据库,16核32G,SSD固态硬盘,

4核8G的机器一般每秒钟抗几百请求都没问题

每秒四五千的请求的话,这样的数据库服务器是没什么问题的,极限每秒上万

系统压力越来越大会怎么样?

大促时会不稳定

随着业务发展,订单数据越来越多,数据库读写性能越来越差,大促高峰时,数据库压力剧增,性能进一步下降,请求过慢,请求超时

团队任务:亟需对订单系统整体进行架构的升级、改造、优化,保障系统高可用、高性能,保证业务的高速发展

4 系统面临的问题

4.1 支付成功后,流程复杂,耗时长,用户体验差

支付成功后,需要扣减库存,更新订单状态,推送短信信息,发优惠券,红包等,这些操作全部完成需要1~2s,高峰期负载压力大的时候,数据库性能下降厉害,甚至需要几秒钟,影响用户体验。

4.2 退款失败

退款问题,订单支付逆向过程

重新给商品增加库存
更新订单状态为“已完成”
减少你的积分
收回你的优惠券和红包
发送Push告诉你退款完成了
通知仓储系统取消发货

假设你的库存增加完了,订单状态更新了,积分收回了,优惠券收回了,仓储系统中断发货了,然后Push推送告诉你说已经退款了,结果第三方支付系统退款失败了

失败原因可能是支付系统自己的问题,也可能是自己订单系统网络问题导致调用失败

结果:用户流失,领导请喝茶,年终奖泡汤,被优化。。。

4.3 用户下单后一直不付款

一般来说,我们的订单系统会启动一个后台线程,这个后台线程就是专门扫描数据库里那些待付款的订单,如果发现超过24小时还没付款,就直接把订单状态改成“已关闭”了,释放掉锁定的那些商品库存。

如果数据库中积压了几十万、几百万笔待支付的订单,不停扫描?效率低

4.4 和第三方系统耦合性太高

在订单支付的时候,大部分核心步骤,其实都是在自己公司的系统里完成的,比如你更新订单的状态,是在自己公司的订单系统内部完成的;你扣减库存,是找自己公司内部的库存系统完成的;你在增加积分的时候,是找自己公司内部的积分系统完成的;你在派发优惠券、红包的时候,是找自己公司内部的营销系统完成的。

发货的时候还需要调用第三方物流公司的系统,通知物流公司去仓库里取货发货。

4.4.1 系统间的耦合?

依赖的别的系统的接口有变更,比如加了参数,自己的系统也要跟着变更,还得配合他的新接口测试及上线。

要动一起动,要静一起静,这就是系统间的耦合

4.4.2 性能差,不稳定

对方不可控,导致你的系统的性能和稳定性也不可控

4.5 大数据的订单数据

大数据?

用户积累下来的浏览行为、访问行为、搜索行为、交易行为等

商品的点击量,用户每天登录APP的时间和使用APP的时间,用户买了什么东西、

大数据团队提取订单数据,严重影响订单系统的运行

传统做法

SQL

4.6 秒杀活动,数据库压力太大

每秒2000个请求到订单系统,调用下单、订单查询、退款等接口,根据经验,平均每个接口会执行2~3次数据库操作。根据业务不同,有的接口可能处理一个请求要执行五六次数据库操作,有的接口可能是1次数据库操作+两三个其他系统的接口调用(比如库存系统、营销系统)

所以,高峰时,大概有每秒4000的请求到数据库

大促了,怎么办?

双11最高峰10000QPS,那么数据库QPS将达到20000,目前数据库性能,是扛不住每秒20000请求的。