基于云原生的秒杀系统设计思路
链接:https://www.zhihu.com/question/54895548/answer/259218876
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
秒杀的核心问题就是极高并发处理,由于系统要在瞬时承受平时数十倍甚至上百倍的流量,这往往超出系统上限,因此处理秒杀的核心思路是流控和性能优化。
流控
- 请求流控
尽可能在上游拦截和限制请求,限制流入后端的量,保证后端系统正常。
因为无论多少人参与秒杀,实际成交往往是有限的,而且远小于参加秒杀的人数,因此可以通过前端系统进行拦截,限制最终流入系统的请求数量,来保证系统正常进行。
- 客户端流控
在客户端进行访问限制,较为合适的做法是屏蔽用户高频请求,比如在网页中设置5s一次访问限制,可以防止用户过度刷接口。这种做法较为简单,用户体验也尚可,可以拦截大部分小白用户的异常访问,比如狂刷F5。关键是要明确告知用户,如果像一些抢购系统那样假装提交一个排队页面但又不回应任何请求,就是赤裸裸的欺骗了。
- Web端流控
对客户端,特别是页面端的限流,对稍有编程知识或者网络基础的用户而言没有作用(可以简单修改JS或者模拟请求),因此服务端流控是必要的。服务端限流的配置方法有很多种,现在的主流Web服务器一般都支持配置访问限制,可以通过配置实现简单的流控。
但是这种限制一般都在协议层。如果要实现更为精细的访问限制(根据业务逻辑限流),可以在后端服务器上,对不同业务实现访问限制。常见做法是可以通过在内存或缓存服务中加入请求访问信息,来实现访问量限制。
- 后端系统流控
上述的流控做法只能限制用户异常访问,如果正常访问的用户数量很多,就有后端系统压力过大甚至异常宕机的可能,因此需要后端系统流量控制。
对于后端系统的访问限制可以通过异步处理、消息队列、并发限制等方式实现。核心思路是保证后端系统的压力维持在可以正常处理的水平。对于超过系统负载的请求,可以选择直接拒绝,以此来对系统进行保护,保证在极限压力的情况下,系统有合理范围内的处理能力。
系统架构优化
除了流控之外,提高系统的处理能力也是非常重要的,通过系统设计和架构优化,可以提高系统的吞吐量和抗压能力。关于通用系统性能的提升,已经超出本节的范围,这里只会提几点和秒杀相关的优化。
- 读取加速:在秒杀活动中,数据需求一般都是读多写少。20万人抢2000个商品,最后提交的订单最多也就2000个,但是在秒杀过程中,这20万人会一直产生大量的读取请求。因此可以使用缓存服务对用户请求进行缓存优化,把一些高频访问的内容放到缓存中去。对于更大规模的系统,可以通过静态文件分离、CDN服务等把用户请求分散到外围设施中去,以此来分担系统压力。
- 异步处理和排队:通过消息队列和异步调用的方式可以实现接口异步处理,快速响应用户请求,在后端有较为充足的时间来处理实际的用户操作,提高对用户请求的响应速度,从而提升用户体验。通过消息队列还可以隔离前端的压力,实现排队系统,在涌入大量压力的情况下保证系统可以按照正常速率来处理请求,不会被流量压垮。
- 无状态服务设计:相对于有状态服务,无状态服务更容易进行扩展,实现无状态化的服务可以在秒杀活动前进行快速扩容。而云化的服务更是有着先天的扩容优势,一般都可以实现分钟级别的资源扩容。
系统扩容
这项内容是在云计算环境下才成为可能,相对于传统的IT行业,云计算提供了快速的系统交付能力(min VS. day),因此可以做到按需分配,在业务需要时实现资源的并行扩展。
对一次成功的秒杀活动来说,无论如何限流,如何优化系统,最终产生数倍于正常请求的压力是很正常的。因此临时性的系统扩容必不可少,系统扩容包括以下3个方面。
- 增加系统规格:可以预先增加系统容量,比如提高系统带宽、购买更多流量等。
- 服务扩展:无状态服务+负载均衡可以直接进行水平扩展,有状态的服务则需要进行较为复杂的垂直扩展,增大实例规格。
- 后端系统扩容:缓存服务和数据库服务都可以进行容量扩展。
秒杀服务实践
一般来说,流控的实现,特别是业务层流控,依赖于业务自身的设计,因此云计算提供的服务在于更多、更完善的基础设计,来支持用户进行更简单的架构优化和扩容能力。
系统架构优化
通过CDN服务和对象存储服务来分离静态资源,实现静态资源的加速,避免服务器被大量静态资源请求过度占用。要实现异步的消息处理,可以使用队列服务来传输消息,以达到消息异步化和流控。
系统扩容
云服务会提供按需计费的资源分配方式和分钟级甚至秒级的资源交付能力,根据需要快速进行资源定制和交付。
内部系统可以通过负载均衡等服务实现并行扩展,在网易云基础服务中,用户可以直接使用Kubernetes的Replication Controller服务实现在线水平扩容。对于对外提供的Web系统,可以通过负载均衡服务实现水平在线扩展。
对于后端系统来说,建议使用云计算服务商提供的基础服务来实现并行扩展。例如,网易云基础服务就提供了分布式缓存服务和数据库服务,支持在线扩容。