在上一讲中详细介绍了打造一个高性能系统的应对策略和架构手段。那么今天,就以 1 号店的秒杀系统为例,来具体说明如何实现一个高性能的系统。
背景和问题
先说下背景。在 2014 年的时候,1 号店作为网上超市类电商,经常在线上举行各种大促活动。比如进口牛奶促销活动,每次促销的牛奶有几十万盒,促销价格非常优惠,一般这样的促销活动会在某个整点的时间进行开卖(如上午 10 点)。对于这种质高价优并且是刚需的商品,会有大量的用户来抢购,俗话说“手快有,手慢无”,往往短短几分钟内,所有牛奶就能售卖完毕。
这本质上是一种秒杀活动,但商品数量非常大,一瞬间会有大量的用户流量涌入,流量可以高达平时的几十倍。而且和少量商品的秒杀不同,这些都是有效流量,最终会生成订单。
而在正常情况下,系统因为资源有限,只能处理 10% 的流量,无法处理剩下的 90% 流量,瞬间高并发的流量涌入,很大程度上会引起后台系统超时报错,导致用户下单不成功。这样一来,用户就会反复刷新页面,多次尝试下单,不但用户的体验不好,而且系统的压力会更大。
最终的结果就是,系统往往由于过载,整体处理能力下降,甚至瘫痪,导致所有用户都无法购买。就像下图表示的一样,在秒杀场景下,系统会面临这样的困境:
在这种情况下,对于用户来说,能不能买到商品,拼的是体力和人品,由于体验不好,用户会逐渐对活动失去兴趣;而对于系统来说,我们需要拼命地加机器来满足峰值流量。
每次 1 号店要进行大促的时候,在活动开始前,运营和技术人员会坐在一起,大家一起来预估活动的峰值流量,然后技术人员做评估,系统的哪些节点需要加机器,以及要加多少机器。但这样的做法其实存在几个问题:
首先,我们对峰值流量的预估以及要加多少机器都是拍脑袋的,和实际出入往往很大,一旦估计少了,