终身学习,迭代更新技术能力,保持核心竞争力
采用持续集成、自动化测试、全链路测试、自动化部署、灰度发布、容器化部署的方式在进行系统的开发、测试以及发布
项目案例驱动技术学习
系统架构的痛点,使用何种技术方案?如何使用?
技术方案如何落地,考虑哪些因素?
会有哪些问题(消息丢失),如何解决?
消息中间件技术到底在生产环境是解决哪些系统业务问题的?
到底如何用消息中间件技术来解决这些问题?
如何根据生产情况去设计消息中间件的技术方案?
在真正把消息中间件技术落地到项目中的时候,到底应该考虑哪些问题?
1 业务流程
整体流程:
核心业务流程
- 确认这个订单中的商品、价格、运费、优惠券、收件地址、是否开发票及发票抬头等。。。
- 创建订单,订单信息由APP传过来,入库
- 跳转支付页面,完成支付
- 支付成功通知,发货
- 发送优惠券、抵用卷,短信推送支付成功、待发货信息
非核心业务流程
- 用户查询自己订单,订单查询模块
- 下单模块
- 支付成功之后异步发优惠券、红包和推送
- 退货
- 订单的物流信息、配送状态
- 订单数据,大数据分析
- 高并发下单场景:流量洪峰(双11),秒杀模块
2 订单系统的真实生产负载情况
初创新兴互联网公司
千万注册用户,百万日活,每日几十万订单量,每天高峰期访问每秒两三千的QPS
大促:日百万订单,10000QPS
QPS:系统每秒的查询数量,每秒请求数
压力有二:
- 订单系统日益增长的数据量
- 在大促活动时每秒上万的访问压力
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请求的。
