这篇文章上次修改于 1807 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

12306 面临那些压力

一年一度的春节抢票过动又要告一段落了,今年我们的 12306 又经历了几次崩溃。那么就引出一个问题为什么我们的抢票神器总是崩溃呢?我们列举几个 12306 所经历的问题。

抢票的人数太多

最重要的一点是我们国家人口众多,北上广深的务工人员学生来自全国各地。我们的铁路运输资源就那么多。另外加上很多企业不会提前告知放假时间,导致部分打工族需要提前购票备用。再加上购票需求远远大于供需就会发生定点哄抢,发生流量短时高峰。对机房网络拥堵,网关的压力,服务器任务处理的拥堵,短时间内突然蜂拥而至。

举个栗子,假设:

你过年了想抢猪肉吃,因为猪肉少但是购买的人太多了。所以肉脯说了为了保证公平我们定点开售。肉脯再周围 50 米开外拉上警戒线。中午 12 点整开方警戒线购买。

快到点了人们都在警戒线外等待,到了 12 点人们从四面八方疯狂涌向商场门口,门口就这么大但是卖猪肉的人疯狂涌入,商场门口也受不了。进不来的人没办法只能在门口堵着,慢慢的等。进商场门口的人则根据商场的排队规则在柜台前排队按顺序出售。

买的人太多一是会是把门挤坏,二是柜台的服务人员会累死。

代抢票的机构太疯狂

抢票 的机构会定时的去 12306 拉取数据,而且是使用大量的服务器进行刷票。也会加重服务器的工作压力,现在如果你是用刷票软件等,可能会触发 12306 风险控制策略将你的 IP 拉黑。

票务业务太复杂

人们都在说阿里的双十一也是这个流程,大家一块去哄抢商品,阿里不也没事。接下来我给大家解释一下。

12306 的票务系统太复杂了,怎么复杂的我们使用京沪高铁来举个例子,京沪高铁全程 24 个站,那么我想买票肯定是我从任意一个站都可以去另一个站,那么这个座位从哪到哪有票,从哪到哪没票。全车那么多座位,系统要去把这些座位去分配处理好,你说复杂不复杂。我光是想想就脑袋大。

在举个不恰当的例子:

大家都在柜台上买猪肉,一个要排骨,一个要里脊肉,另一个要五花肉等等的,柜台后面的仓库里放着很多头猪,他要去看看那头猪还有排骨,那头猪还有里脊肉,然后在卖给顾客。如果人多的时候就只有一头猪有排骨了,但是很多人都要,那么售货员需要大喊一身这个排骨有顾客预订了,过五分钟还没有卖出去,你们在卖这一头猪的排骨。

如果人多的话会怎么样,售货员真的会累死。

12306 有什么优化方案

12306 的短时流量是非常惊人的,不要觉得国外技术非常牛X,实际上国外也没有这种处理大流量高并发的好方案,所以我们能做到这个程度已经很厉害了,业内人士都知道像 12306 业务复杂再加上这种高并发短时流量实际上是非常难已处理,他同时考验机房宽带带宽(网络的高速公路堵了一样崩),网关(大流量的分发能力),数据库(数据强一致性的读取存储),服务器(秒杀型业务的巨大工作必须要服务器强行撑起来)。

因为这种业务是强一致性的,能依靠缓存的地方相对双11来说比较少。就需要服务器时时去处理。可以说难度非常之大。

阿里云团队的合作

之前阿里团队就与 12306 合作,服务器、机房、网络等等的都是阿里云提供技术支持。将阿里双 11 的经验来帮 12306 处理一部分瓶颈。

举个例子就是

商场的大门,柜台,货仓都经过又经验的人给装修改造了。但是业务复杂还是无法避免。

增加服务器

添加一些服务器来添加处理能力,当然也不是无节制的增加,毕竟只有春节等少数节日需要这么多服务器资源。平时闲置肯定是浪费的。

举个例子

我们去增加柜台的数量,但是平时的时候都要闲置了,所以只能在外面临时支摊子。虽然是临时的但是也需要非常依赖后面的仓库的库存,所以也不能无限增加柜台数量。

票务分段分片

由于票务业务太复杂,所以 12306 的售票可以根据大数据分析预测从哪个站到哪个站的人数提前把票分开。

举个例子

现在大家卖猪肉可以直接去柜台,柜台后边的仓库有专人已经把把肉分好了,处理了一些大部分猪,把排骨,里脊肉,五花肉都按量提供好了。售货员卖五花肉,只需要看还有没有五花肉就好了。

夜晚进行数据库维护

12306 每天晚上是不外进行买票了,他是关闭系统维护数据库的,查漏补缺,进行优化。

举个例子

卖肉买了一天后面仓库搞得乱七八糟的,就需要重新维护,整理,好准备第二天的工作。

12306 抢票建议

直接使用 12306 购票

所以大家会经常看到,半程票会经常没有,但是全程票是有的。这就是分段买票引起的。如果你想要买票可以考虑多花钱买全程票提前下车。或者挑选热门站点之间的票,然后采取补票的形式做到家。

第三方购票软件

还有就是使用第三方购票软件来捡退票的漏,至于退票软件的加速逻辑,我想额外说一点。

其实第三方购票软件在 12306 面前没有任何优势可言,他无非大家都在他那里买票,相当于都在他那里排队。谁给的钱多或者谁邀请的用户多,就把谁放在队伍前面,他就把抢到的票先给谁。很鸡贼的商业行为。