写在前面
秒杀是所有交易系统都会接触到的场景,做过交易系统的同学谁还没搞过几次大促秒杀呢。
秒杀业务业务特点
服务承载的访问压力大
- 瞬时流量突增:业务促销活动在特定时间开启,大量用户请求等待活动开启后瞬间涌入
- 抢购脚本带来压力:灰产通过抢购脚本薅羊毛,一方面带来额外的系统压力,另一方面影响抢购活动公平性
- DDOS趁虚而入:可能存在竞对在活动期间使用DDOS攻击网站
存在明显的访问热点
- 热点集中:少量优惠力度大的商品成为抢购热点,比如小米华为手机,10万台手机在1分钟内售罄
- 热点未知:部门商家和商品可能并不在预计的促销范围内,但是可能突然成为爆款
数据一致性要求高
- 一方面优惠商品库存有限,超卖会给商家带来损失;另一方面用户抢到商品后如果不能支付,则会引起客诉
“秒杀”系统的技术挑战与架构优化
“秒杀”系统的建设需要整个系统从前到后全栈的协同配合,其中包含了基础技术部维护的多个服务,比如CDN、高防IP、容器平台、缓存、数据库、中间件、全链路压测、监控系统等,我们围绕这些基础服务讨论秒杀系统的技术挑战与架构优化。
前端与接入层:加速与限流
前端动静分离,把90%的静态数据缓存在用户端或者CDN上,当真正秒杀时用户只需要点击特殊的按钮“刷新抢宝”即可,而不需要刷新整个页面,这样只向服务端请求很少的有效数据,而不需要重复请求大量静态数据。
网站负载均衡层或业务网关层需要能够对访问请求按用户粒度进行流量限制,以降低抢购脚本对系统带来的压力。
在安全方面,通过高防CDN或高防IP,降低DDOS攻击的影响。
在业务方面,通过引入答题环节,将突然涌入的压力平滑到3s左右的时间段内。
业务层:隔离、限流与弹性伸缩
通过对后台系统的微服务化改造和数据库层面的拆分(SOA),实现微服务之间的隔离,避免相互影响,实现不同核心服务相互独立的容量评估和紧急情况下的限流熔断。
在活动进行过程中,如果业务流量过大,业务需要紧急扩容,底层容器服务需要能够支持分钟内的快速弹性扩容,因此容器调度、镜像分发、服务发现的效率都需要相应的进行提升和优化。
在处理业务弹性扩容的过程中,还有一点也需要考虑到,即数据库的连接数风险,在没有类似dbproxy(数据库代理中间件)这样的服务进行连接池收敛的情况下,业务的弹性扩容能力需要考虑数据库的对连接数的承载力。
缓存层:数据读取加速
在抢购业务中,对商品库存数量的更改主要通过数据库进行,但是由于读取流量过大,一般需要通过两级缓存的机制进行优化,即:Java服务进程内本地缓存-->分布式缓存服务-->数据库服务。
由于库存数据更新非常频繁,再加上后面要提到的库存拆分设计,缓存一致性在系统设计时是需要折中考虑的,库存数据的缓存往往被设计为延后定时刷新,而不是在每次成功扣减库存后去刷新,用户可能会看到商品仍有剩余库存,但是实际下单时返回售罄;更进一步甚至可以像12306那样只缓存“有余票”或“没有余票”两个状态。
技术保障
业务全链路压测
全链路压测是阿里2013年在双11压力之下被逼出来的技能,由于线上线下环境多少都会有些不同,很多问题只有在实际生产环境才能暴露,对于秒杀类业务,线上压测也能够实际评估出系统的真实承载力,为容量预估给出重要参考。
同时阿里的全链路压测是真正的“全链路”,淘宝、天猫、支付宝的系统都会一同参与。
准实时监控
这里的技术挑战主要是在海量业务和数据库的场景下,如何做到全局有效而实时的监控数据采集和分析,一方面是为了实时监控系统健康度,另一方面则是pr需求。比如阿里张瑞说的:
“在零点前有一个倒计时环节,连线杭州光明顶作战指挥室,逍遥子会为大家揭幕2015双11启动,然后直接切换到我们的媒体大屏,所以对GMV数字的要求基本上是零延迟,这个挑战有多大不言而喻。”
实时热点发现
与准实时的监控类似,技术团队需要及时发现系统中的热点和瓶颈,并作出调整。实时热点的发现,需要业务层监控、数据库层监控一起配合改进优化,才能准确分析出热点。
容灾与高可用
业务容器宕机、数据库主库宕机、机房级宕机都可能出现,技术团队需要通过有效的容灾规划、set化、分库分表等,降低“爆炸半径”,并且要做到快速切换。
因此这里的技术挑战是容器的快速扩容,容器镜像快速分发,数据库分库分表尽量降低单个集群主备切换的影响,业务层面的set化和灵活的流量切换。
系统预热
大量流量会在大促开始的第0秒集中涌入,活动开始前需要完成 JVM预加载代码、缓存预热、数据库连接池预热等系统预热工作。
同时在各个系统的设计时也要做到避免对单点的依赖,原则仍然是降低“爆照半径”,防止大量流量进入后,把系统中的某个单点压垮,比如2016年美团Tair的故障,configserver被自己的客户端压垮后造成整个系统的风暴。
我们可以做些什么
阿里双11的目的在于:去库存、提升影响力和拉新,而对研发和基础架构来说则是保持技术领先的年度演习。
因此需要在一下基础技术上进行积累:
- MySQL数据库内核优化,适配秒杀业务
- 构建公司系统化的全链路压测解决方案
- 与有秒杀类需求的业务共建,从中间件、缓存、数据库、业务逻辑等方面构建全套解决方案
- 提升容器弹性伸缩效率,提升系统准实时的监控能力