只是用支付宝和12306比较,其实是不恰当的。12306的逻辑复杂程度远远高于支付宝,所以我们先换一个思维吧,用双11的天猫和12306做比较吧。
2017年的双11,天猫交易量达到了1682亿元,并且也没有出现问题。但是,12306没到春运,就连接不通畅,是什么原因呢?
这就需要从两个系统卖的东西开始说起了。
我们都知道,天猫卖的是实体的商品,这些商品(SKU)都是有库存量的,也就是下图所示的这个内容。
用户每买一个商品,这个库存就相应的减少1,到减少到0的时候,库存就没了,后面的人也就买不到了。
这个是一个非常简单的逻辑,其中的核心,就是SKU(最小库存单元),对于天猫来说,SKU也就是一件商品。
天猫2016年的时候,统计自己拥有940万商家,超10亿件商品,数量是非常庞大的。但是每一件这样的商品的库存都是可以统计出来的,而且任何一个商品销售的时候,并不会影响到其他的商品。
商品量大,我就多增加硬件来存储这些商品就行了,所以技术上的难度并不是特别大。
但是12306不一样,我去查了一下中国的铁路运行情况。
根据2017年初的数据,中国列车车次一共有3500余对,铁路站点2000多个。
也就是说,每天,会有7000余次的列车在中国的铁路上行为,途经这2000多个点。
对于任何电商网站来说,SKU都是核心,那12306也算是电商网站,他的商品是什么呢?就是火车票,火车票对应的是什么呢?火车上的座位或者站位。
那SKU就是座位了。
对于天猫来说,商品卖一个少一个。
对12306来说,一列火车上的座位,卖一个他不一定少一个。因为我一列火车可能途经20个站点,一个人可能始发站上车,第三站下车,那这个SKU在1-3站之间被卖掉了,但是第4站的时候,它又回来了。我还可以继续卖。
但是也可能一个人直接买了始发站到终点站,我这个SKU就完全卖掉了,回不来了。
用户买的行为,决定着我SKU的剩余情况,而用户买的行为是一个不可控的行为。
如果在没有控制策略的情况下,就意味着,SKU是随时发生着变化的。
我们来简单算一笔账。
一列火车途经20个点,车上有5000个座位,那他理论最小库存就是5000(一个座位1张票,始发—终点),最大库存是95000(所有人都只坐1站)
但是对于用户来说,他只是关心他那一站作为起点的时候,剩余的票的数量,这样的话,我们就必须计算,火车行进到他所在站的时候,车票的剩余情况(包括未购买的和要下车的),这样,每有一张火车票销售出去,计算机就需要执行复杂的运算,来重新的定义SKU和库存量。
中国有超过10亿人在春运的时候会去12306抢票,7000余次的列车,这个运算的复杂程度是非比寻常的。
可以说,现在中国的互联网中,暂时还没有能够比12306还复杂的运算场景了。
我们假设,买一张票需要运算1秒钟,有100台服务器同时工作,也就是1秒可以买100张票。一天可以处理多少张票呢?8,640,000(864万张票),我相信,春运开始的第一天,中国至少有1亿人回去12306抢票吧,如果我们真的使用这种算法,那就意味着有9000多万人,可能连抢票页面张什么都看不到。
但实际上是这样么?
并不是的,12306是设置了放票的节点,每个节点进行放票,也就是说,12306会按照以往的数据经验,对车票进行预演算,在不同的线路之间按照一定比例,先将票的库存计算出来。然后进行贩卖。
在下一个节点的时候,会再次按照这个规则,对车票的余量进行统计和计算,保证在每个节点时,各个站点的票都是有的,而且票与票之间的销售不会相互干扰,这样就可以减少在销售期间的运算次数的减少,提高效率。
如此说来,在节点的间隔时间内,12306的下单复杂度和天猫是一样的了,为什么春运时候,它还是要会打不开页面,没有响应呢?
我们就可以看到12306和天猫另一个不同的地方了。
12306是实名制的,一人一票,但是天猫可以随便买,所以,12306在下单前后有比较多的身份验证,但是天猫并不需要,所以,12306的单个订单的处理复杂度还是高于天猫的。
而且,全世界没有任何一个系统,在一个时间节点的时候,会涌进来好几亿人。12306能安安全全的票卖出去,我觉得已经很强大了。