叁叁肆

这个世界会好吗

453篇博客

快速成长期应用架构实践 (2):秒杀

叁叁肆2018-11-14 18:24

欢迎访问网易云社区,了解更多网易技术产品运营经验。


4.1.2 秒杀


把秒杀服务单列出来进行分析,主要有下面两个原因。 


1. 秒杀服务的重要性:秒杀活动本身已经是很多业务推广的重要方式之一,大部分的 电商类业务都会涉及这一促销方式。很多非直接秒杀的业务(如火车购票),在实 际运行时也会碰到类似秒杀的场景。秒杀实际上就是在瞬时极大并发场景下如何保 证系统正常运行的问题,而这种场景对很多系统都是无法避免的,因此在系统设计 时,我们往往要考虑到秒杀的影响。


2. 系统实现难度:秒杀最能考验系统负载能力,瞬间涌入平时数十倍甚至数百倍的压力,对开发和运维人员来说都是噩梦,这也为系统设计带来了巨大的挑战。针对秒 杀活动的处理,是一个系统性的设计,并不是单一模块或者层面可以解决的问题, 需要从系统设计整体进行考量。


处理秒杀的指导思路


秒杀的核心问题就是极高并发处理,由于系统要在瞬时承受平时数十倍甚至上百倍的 流量,这往往超出系统上限,因此处理秒杀的核心思路是流控和性能优化。


流控


1. 请求流控 

尽可能在上游拦截和限制请求,限制流入后端的量,保证后端系统正常。
因为无论多少人参与秒杀,实际成交往往是有限的,而且远小于参加秒杀的人数,因 此可以通过前端系统进行拦截,限制最终流入系统的请求数量,来保证系统正常进行。


2. 客户端流控 

在客户端进行访问限制,较为合适的做法是屏蔽用户高频请求,比如在网页中设置 5s 一次访问限制,可以防止用户过度刷接口。这种做法较为简单,用户体验也尚可,可以拦 截大部分小白用户的异常访问,比如狂刷 F5。关键是要明确告知用户,如果像一些抢购系 统那样假装提交一个排队页面但又不回应任何请求,就是赤裸裸的欺骗了。


3. Web 端流控 

对客户端,特别是页面端的限流,对稍有编程知识或者网络基础的用户而言没有作用 (可以简单修改 JS 或者模拟请求),因此服务端流控是必要的。服务端限流的配置方法有很 多种,现在的主流 Web 服务器一般都支持配置访问限制,可以通过配置实现简单的流控。


但是这种限制一般都在协议层。如果要实现更为精细的访问限制(根据业务逻辑限流), 可以在后端服务器上,对不同业务实现访问限制。常见做法是可以通过在内存或缓存服务 中加入请求访问信息,来实现访问量限制。


4. 后端系统流控

上述的流控做法只能限制用户异常访问,如果正常访问的用户数量很多,就有后端系 统压力过大甚至异常宕机的可能,因此需要后端系统流量控制。


对于后端系统的访问限制可以通过异步处理、消息队列、并发限制等方式实现。核心 思路是保证后端系统的压力维持在可以正常处理的水平。对于超过系统负载的请求,可以 选择直接拒绝,以此来对系统进行保护,保证在极限压力的情况下,系统有合理范围内的 处理能力。


系统架构优化 

除了流控之外,提高系统的处理能力也是非常重要的,通过系统设计和架构优化,可 以提高系统的吞吐量和抗压能力。关于通用系统性能的提升,已经超出本节的范围,这里 只会提几点和秒杀相关的优化。


1. 读取加速:在秒杀活动中,数据需求一般都是读多写少。20 万人抢 2000 个商品, 最后提交的订单最多也就 2000 个,但是在秒杀过程中,这 20 万人会一直产生大量 的读取请求。因此可以使用缓存服务对用户请求进行缓存优化,把一些高频访问的 内容放到缓存中去。对于更大规模的系统,可以通过静态文件分离、CDN 服务等 把用户请求分散到外围设施中去,以此来分担系统压力。


2. 异步处理和排队:通过消息队列和异步调用的方式可以实现接口异步处理,快速响 应用户请求,在后端有较为充足的时间来处理实际的用户操作,提高对用户请求的 响应速度,从而提升用户体验。通过消息队列还可以隔离前端的压力,实现排队系 统,在涌入大量压力的情况下保证系统可以按照正常速率来处理请求,不会被流量 压垮。


3. 无状态服务设计:相对于有状态服务,无状态服务更容易进行扩展,实现无状态化 的服务可以在秒杀活动前进行快速扩容。而云化的服务更是有着先天的扩容优势, 一般都可以实现分钟级别的资源扩容。


系统扩容 

这项内容是在云计算环境下才成为可能,相对于传统的 IT 行业,云计算提供了快 速的系统交付能力(min VS. day),因此可以做到按需分配,在业务需要时实现资源的并 行扩展。


对一次成功的秒杀活动来说,无论如何限流,如何优化系统,最终产生数倍于正常请 求的压力是很正常的。因此临时性的系统扩容必不可少,系统扩容包括以下 3 个方面。


1. 增加系统规格:可以预先增加系统容量,比如提高系统带宽、购买更多流量等。

2. 服务扩展:无状态服务+负载均衡可以直接进行水平扩展,有状态的服务则需要进 行较为复杂的垂直扩展,增大实例规格。


3. 后端系统扩容:缓存服务和数据库服务都可以进行容量扩展。


秒杀服务实践 

一般来说,流控的实现,特别是业务层流控,依赖于业务自身的设计,因此云计算提供 的服务在于更多、更完善的基础设计,来支持用户进行更简单的架构优化和扩容能力。


系统架构优化 

通过 CDN 服务和对象存储服务来分离静态资源,实现静态资源的加速,避免服务器被 大量静态资源请求过度占用。要实现异步的消息处理,可以使用队列服务来传输消息,以 达到消息异步化和流控。


系统扩容 

云服务会提供按需计费的资源分配方式和分钟级甚至秒级的资源交付能力,根据需要 快速进行资源定制和交付。


内部系统可以通过负载均衡等服务实现并行扩展,在网易云基础服务中,用户可以直 接使用 Kubernetes 的 Replication Controller 服务实现在线水平扩容。对于对外提供的 Web 系统,可以通过负载均衡服务实现水平在线扩展。


对于后端系统来说,建议使用云计算服务商提供的基础服务来实现并行扩展。例如, 网易云基础服务就提供了分布式缓存服务和数据库服务,支持在线扩容。

文章节选自《云原生应用架构实践》 网易云基础服务架构团队 著


网易云计算基础服务深度整合了 IaaSPaaS 及容器技术,提供弹性计算、DevOps 工具链及微服务基础设施等服务,帮助企业解决 IT、架构及运维等问题,使企业更聚焦于业务,是新一代的云计算平台。点击可免费试用