为什么12306时不时要崩那么一下? | 半佛仙人

 
1
2019年即将过去,过年回家的火车票,你们买到了吗?我知道你们很多人都没有买到,我能感受到你们内心的绝望。前几天12306崩了,很多人在痛骂12306,还有很多人在我公众号的后台问我为什么12306总是动不动就崩溃,和大姨妈一样不给力。

明明只是一个简单的卖票软件,怎么搞成这个鬼样子,人家QQ微信几亿人同时在线聊天,激情互动,还有各种小视频。

另一边双十一几亿人同时购物疯狂败家剁手都没有问题,为什么12306一出手,就是炸穿裤衩的用户体验?

让硬核的半佛老师来给你们科普一下。12306到底面临多大的业务压力和挑战。你们这么多人一拥而上,他们当然受不了,谁受得了呢。

虽然本篇文章会有大量极为硬核的技术术语,但是我会说的尽量简单,大家一定要认真听,多记笔记,过年在饭桌上吹牛的时候,这都是王炸,不用谢我了。

不是说你看了这篇文章就能买到票,实际上买票是一个玄学。

只是说,能死的明白点。

2
很多人拿12306和双十一来比较,认为双十一这么多订单都能撑住,12306就撑不住,显然是因为技术水平不到位。这一开始就走了弯路了朋友,12306的业务模式和双十一是有本质不同的。这种不同,就导致了12306的难度要比双十一大的多的多的多多多~

如果说双十一的难度是人间模式,那么12306差不多相当于是地狱十八层,还要再挖个坑的难度。

第一,双十一的流量再大,也只不过是纯线上业务,什么叫纯线上业务?所有用户都是在网页或者APP下单,整个数据其实是闭环的。这就导致双十一其实只是一个纯粹的线上流量问题,解决起来相对纯粹,就像一个单纯的小朋友一样好欺负。而12306不是,12306不是只有一个APP和网站的朋友,所有人在线下售票厅以及线下机器里产生的交易,也会影响整个12306的数据系统。

实际上现实生活中非常多的买火车票返乡的人,例如辛苦的农民和工人朋友,很多都是不会线上操作的,他们只会线下彻夜排队,非常辛苦,所以12306也必须照顾他们的感受,不能断掉线下业务。

这就导致了12306本身是一个线下与线上同享数据的复杂业务,复杂度要高出双十一一个数量级的。

和纯粹简单的双十一相比,12306就像一个饱经社会摧残的老油条,你永远不知道他们会什么时候会出现什么幺蛾子。

这就像一个纯洁男孩第一次和他的男朋友约会,怕他不来,又怕他乱来。

3
第二,抛开线上线下不说,毕竟这是欺负12306,我们谈谈业务本身的计划性和可预测性。如果认真思考,你会发现,双十一是一个有明确计划和操作节点的业务,而12306不是。双十一活动并不是只有11月11号当天,其实是一个月前甚至几个月前就已经开始了,大量的用户都已经支付了定金,大量的商家也已经锁定了库存和销售额,只不过最终的结算是在11月11号当天进行的而已。

这就代表着,双十一面对的是一个高确定性的任务,只要有确定性,流量再大也不是特别难的问题。

当你知道困难会在什么时候发生的时候,这个困难就不再困难了。

真正的困难,在于不可知。

什么叫不可知?12306就是不可知。因为你永远不可能测算出会有多少人在哪一天去哪一个地方,一个从浙江回山东的人,他为了回家,选择的线路和时间会非常诡异多变。他可以买浙江到山东,可以买浙江到上海到山东,可以买浙江到南京到山东,可以买千岛湖到山东,可以买浙江到北京到山东,可以买浙江到黑龙江到山东,甚至可以买浙江到广东再飞回山东,只要能回山东,啊我的大葱。

他可以接受1号出发,2号出发,3号出发,5号出发,10086号出发,只要能出发。

这就代表了谁也不知道需求的流量会是多么的突发,购买的内容会是多么复杂。我再举一个例子大家就懂了,微博厉害吧?每天这么大的流量,这么多的关注度。但是为什么经常突然一个明星出轨或者结婚或者负面新闻,微博就要挂掉?是没有技术实力还是服务器资源不够?

都不是,是因为这种流量是突发性的,谁也不知道会突然出现这种爆炸增长,所以服务器就挂掉了。

这就和泼水节上大家都做好了心理准备,但是你泼开水一样。

这谁遭得住啊。

所以建议所有明星出轨之前,先微博报备一下,这样他们出轨的放心,我们吃瓜吃的也安心。

他好,我也好。

4
第三,电商业务不是一个一次性要完成所有流程的业务,但是12306必须一次性完成,这进一步加大了难度。大家思考一下,电商购物,实际上是并不是一次性的。一个典型的电商购物流程是,浏览,和商家撕逼价格,下单,和商家撕逼运费以及快递,物流发货,买家收货,和商家撕逼售后。

即使排除撕逼这些事情,电商购物流程也是有很多节点的。

整个流程下来最快最快次日达也要24小时。

这就代表电商的数据压力没有想象中那么大,可以异步处理,完全可以先全部付款完成,然后再慢慢处理发货,然后再慢慢处理售后。就像你要刷B站,又要烧开水,你完全可以先烧开水,在烧水的过程中刷B站,这就是异步的好处,可以同时多任务并行,而且不影响用户的核心体验。你下单后3小时发货和5小时发货,不影响用户,容错率高。

而12306不一样,卖票就是要立刻完成。

从下单,到付款,到锁定票,都是一气呵成的,没有任何缓冲时间,不存在我下单一个票2天后告诉我成功或者失败这种事情,头都给消费者打爆。

所以12306等于是没有这种缓冲周期,需要直面所有的流量,在最短时间内满足所有人的所有需求,所有的业务都要在极短时间内处理完成,这就是会被一下子塞满。同样是1亿用户,4个步骤,电商可以分4个步骤淡定处理,每个步骤处理1亿流量,而且可以分多小时,多天处理。12306就只能一口气处理4亿,没有缓和,这个压力可想而知。

我们都知道,再厉害的东西,被强行塞满,都是会坏掉的。

你们不要瞎想,我说的是公路。

第四,电商业务的库存管理是相对简单的,而12306是极其复杂的,复杂到我给你简单讲讲你都会抑郁。想想看,作为电商平台,管理货物虽然也有难度,但本身的统筹不过固定产品的增删改查,有多少就是多少,付款了就减一,上量或者退货就加一,顶多出现最后一个商品被2人同时拍下的小概率事件,这都是小事儿。而12306是完全不同的难度,二者难度差别大概相当于草履虫大战那美克星人。

我举个例子,如果你是一个在北京读书的人,家在北京南边,过年要回家。

随便选一辆北京往南开的车,G65这辆高铁,北京始发终到珠海,一共17个站,共计10小时55分钟。

就这一个路线,17个站,支持随意站上车,随意站下车,会有多少种可能性?因为坐车不可能只做单站循环,就是不能北京到北京。所以是从1加到16,一共136种可能性,注意哦,电商同样的场景只有增删改查4种可能性。

这样一个线路的实时库存,做起来是非常令人头大的。

假如有人买了从北京到广州,那么对应的所有库存就要减1,但是广州到珠海的库存不减。假如有人买了从武汉到珠海,那么对应的就是武汉到珠海沿途所有线路的库存减1,但是北京到武汉不减。假如有人买了石家庄到漯河西,那么北京到保定,北京到石家庄不用变,漯河西到珠海段,不用变。

其余所有可能性都要变,因为只要经过这两个站点的路线,都受到影响。

实际业务中,这样的变动,会导致整个库存实时变动,并且是P级别的数据变动,如果对数据库稍微有所了解,都知道这种数据变动对于资源的消耗有多么恐怖,一个1GB的电子表格跑查询都能把很多高性能电脑跑崩掉,早期电子表格甚至限制在6万5千行,就是防止把电脑跑崩。

而这种级别的数据,需要消耗的资源说出来都违反广告法。

所以为什么12306夜里11点到早上要维护?这样的数据库如果不是天天维护保护缓存,早就彻底完犊子了。

每一天,12306都是拿命来奋斗。

所以之后买票的时候,要宠溺一点,温柔一点,你买的不是票,是工程师们的头发。

5
第五,业务去重需要大量的判断。电商业务其实严格来说是不需要用户实名制的,也不需要对用户的身份去重,只要你付钱,有货就发货,除非是限购商品稍微拦截一下,但是面对黄牛党,也就是象征性的挣扎一下,毕竟大家都是出来卖的,不会跟钱过不去。而12306不一样,12306的模式是,每一个人都要限购。

同路线,同时间,要限购。

就拿北京到珠海举例,12306是不允许一个人在同一天购买大量北京到珠海的车票的,这对其他人不公平,所以要限制人的出发时间和购买路线。

那么问题来了,如果要加限购,那么就要把这个人的当前购买信息,时间,全部缓存下来,这个人的每一笔交易,都要和他当前的已有行程进行去重匹配。

这对数据资源的消耗是非常恐怖的。

并且,并且,查重还有另一个现实问题,就是12306本身是允许非本人买票的,就是我可以给我的爸妈买票,我爸妈也可以给我买票,只要添加乘车人就可以了,这就代表着,同一个人的信息,完全可以在不同的时间节点被不同的买家添加,这又带来了巨大的计算压力。

这就和人生一样,太难了。

第六,和12306比流量,什么公司都没有资格。很多人真的以为双十一就是流量的巅峰的了,其实并不是,12306才是最恐怖的流量巅峰。为什么?因为电商的业务模式不会导致用户重复点击,而12306无时无刻不在被所有用户重复点击。

举个例子,你在双十一买东西,是不是买了就走了?买不到你就是骂几句,然后也走了。

一个用户的点击是有限的,你就算单身30年,给你放开了点,你能点多快?

要知道对系统而言,每一次点击,都是一次数据交换。

12306面对的点击流量,要大的多,你买票的时候,是会不断刷新操作的,你在查询余票的时候,每一次都是要跑所有的数据库来帮你同步当前的余票信息,这个负载量和计算量是天量。

而且,现在非常非常多的人在用抢票软件。

所谓的抢票软件,原理就是不停地用机器去读取12306的数据接口,机器的速度绝对是比你单身30年的手速还要威猛几十倍,一秒刷几百次,1个人用抢票软件,可以造成几千个人一起刷产生的数据压力。

各大抢票软件公司加起来用户几千万是有的,14亿人刷出几百亿人的流量都绰绰有余。

你知道12306的流量负载有多强了么?

在12306上,人人都是火影忍者,天天影分身。

6
会有人问,既然挑战这么大,12306这么不容易,那么为什么不去像国外先进技术取经?为什么不去加大投入服务器?为什么还在找借口?为什么12306不引入国外的先进技术呢?答案其实很简单,国外也罩不住啊。

早在2012年,12306就有公开招标,预算不设限,只要能解决问题,世界顶级机构都来竞标了,但是最后基本都放弃了。

因为当时的技术环境没有人能解决这个问题。

国外很多技术的确先进,但是没有一个国家或者公司,历史上接受过14亿人的数百亿级别流量的挑战,你能说出来的世界顶级公司,没有一家能承受这么强的即时交易流量。

他们有的流量更大,但就和电商业务一样,是可以异步操作,不需要身份唯一性,没有这么复杂的路线存量计算的,你们也知道国外的高铁和地铁是什么垃圾水平,我们遇到的问题他们从来没有遇到过。

这是很现实的一件事情。

全中国14亿人的出行需求面前,大家都是一样菜。

说到这里,我想到了我们行业里的一个笑话,有个脸书的早期工程师回国加入阿里巴巴,离开前,他说要去拯救阿里巴巴的数据系统,结果回来之后才发现,他在脸书遇到的数据挑战,和阿里巴巴比起来,简直是幼儿园水平。在数据挑战上,我们遇到的数据挑战绝对是世界最强梯队的,很多时候没有之一。那么为什么不加服务器呢?技术不够,硬件来凑。

加服务器面临的核心问题有3个。

第一个,加服务器只是增加了储存能力并不能解决数据库的问题,这就和一个女人生孩子要10个月,不代表你找10个女人就能在1个月内生孩子。

第二个,如何驱动这些服务器?当年阿里云领先世界的技术,就是突破了同时驱动5000台服务器,成为世界三大云之一。

要知道,阿里云面对的只是双十一,而12306的挑战要更加恐怖,需要同时驱动的服务器数量更多,这也是有技术挑战在的。

另外,阿里云也确实参与了12306的建设。

第三个,成本问题。

12306往往全年都表现良好,只有重大节假日才会偶尔出现崩溃,你为了应付一年中为数不多的重大节假日,采购了这么多高折旧率的服务器,平时根本用不上,这是一种浪费钱的行为。

中国铁路本身就是巨额亏损,国家持续补贴的,这种情况下,为了短时间的需求,投入海量的成本,这笔账不用多说吧?

你看看隔壁微博,宁可每次被流量击溃也不肯长时间维系大量服务器,微博看财报每年都是盈利的,金额都是按照亿来结算的,人家都是这个态度,你知道12306有多不容易了吧。

而且这可都是纳税人的钱。

到最后,买票问题的本质,还是供需关系。

全国这么多人,在这么短的时间内要完成这么多的出行,远远超过了铁路本身的运载能力,在这种供小于求的情况下,怎么调配资源,都没有办法解决供需问题。

东西就这么多,大家都想要,能怎么办呢?

加钱,继续扩建?

要知道很多线路只有春节才爆满,平时都空车亏损,为了满足小部分人短时间的出行,大量浪费资金投入到已经富余的路线中,并不划算的。

有这个钱,应该去投入到更多的地方。

12306这种基础设施,天然就是挨骂的,做的好,大家不会夸,做的有一点点不好,会被骂到死,这是基础设施的悲哀,所有人都有不合理的期待。

何况,12306在只花了这么少预算的情况下,做到现在这个程度,已经是超神操作了。

不考虑资金成本和技术成本张口就骂,是一种不太理智的行为。

怎么不去说人家印度火车卖挂票呢?


精选留言
  • 344
    感谢大家一直以来的支持~希望我们能走的更远~也欢迎关注B站的【硬核的半佛仙人】
  • 570
    本程序猿每年都要不遗余力的给父母亲戚解释为什么12306这么牛逼而我还是买不到票。
  • 417
    “就像一个纯洁的男孩第一次和男朋友约会……”这这这这能纯洁到哪儿去
  • 348
    12306我认为是被刷票软件和黄牛放大了N倍的负载,另外很大的流量来自于买不到票的用户的持续刷新,压力都是内卷造成的。 资源就这么多,内卷的压力不能通过技术来解决,要通过产品设计和制度来解决。 我提几个建议,也许可以给12306的产品一点启发。 1. 12306是稀缺资源,不需要获取流量,门槛你可以尽量高。退票必须本人操作,不需要人肉去车站退,用人脸视频验证就可以解决。 2. 用户可以排队候补,可以app上看到自己在候补的队列里的排名 3. 一次任务用户可以提交多条互斥候补,哪个候补上了就算任务成功,其他的就取消了 这三条基本能干掉刷票软件和黄牛,也能大幅减少用户的刷新,以他们现有的服务承载能力绰绰有余了
  • 154
    半佛老师的声音是真的...和行文风格不是一个人
    233
    作者
    其实是录音的问题,,,,由于用的麦不是很好,导致录出来gaygay的。。。。
  • 211
    中国铁路处理的难题一直都是世界级难题,不懂为什么那么多人拿着键盘就开始互动
  • 160
    这就像一个纯洁男孩第一次和他的男朋友约会,怕他不来,又怕他乱来。 我的心开始慌了…… 毕竟大家都是出来卖的,不会和钱过不去。 我的心开始乱了………
  • 136
    不说别的,就说一趟车有网上和窗口两个途径,再加上那么多站,每个订单的区间都各不一样,组合起来就有了无数种变化。我就觉得铁路很牛逼了
  • 112
    再简单的业务,用的人多了都难起来了。 我们做一个简简单单的早起打卡业务,一天500人用的时候实习生也能写,每秒有500人用的时候谁都头疼。
  • 102
    仙人,你B站视频不够骚
    57
    作者
    会一期比一期sao的~
  • 98
    12306线路没有实时库存的,确实运算量过大做不出来。每个站投多少票都是事先定好的(这就导致了中途上车的票比起点站难买),最后几天了基本变动不大了的时候再把前后的空放出来。 另外线上和线下也影响不大,线下的实质就是找工作人员帮你在线上购票,也走线上的系统。而且线上提前30天,线下提前28天,也就是说线下能买票的时候线上已经抢完了,在非整(半)点的时候不是高峰期,运算压力会远小于高峰期。 不过总体来说还是挺复杂的
  • 98
    国外的很多火车都不支持任意站上下调整库存的,据我所知德铁就是 一段行程有人坐了下车后该座位就不再售卖了
  • 91
    看到最后的挂票给我整乐了哈哈哈哈哈哈哈哈哈哈,说真的我觉得我国的铁路系统真的非常牛逼了,速度快安全系数又高。你瞅瞅印度的挂票,之所以能挂上去,因为他们的火车是真的慢啊要是我们的动车你挂一个试试?
  • 15
    B站的截图里显示 投稿数量为5 。嗯,还有俩没放出来吗
    77
    作者
    我骚话太多总是过不了审。。。。
  • 75
    作为一个程序员,当然知道这样系统的复杂度不是一般的大
  • 14
    我觉得是不是没使用大数据技术啊,某个身份证号经常哪些时间走哪条线之类的,酱婶儿的预判应该能猜中一大盆的吧
    64
    作者
    阿里云承载了一部分12306.。。。。并不是没有用最先进的技术。。。。
  • 61
    哈哈哈哈哈哈哈哈好搞啊哈哈哈哈哈哈哈哈 怪不得每天都要维护,好苦,我之前还以为是偷懒23333
  • 9
    能不能用超级计算机来处理一部分问题?
    54
    作者
    超算的应用场景不是这个,,,,用不上
  • 52
    这处理这个量级和频次的数据问题上,已经是无人区,没有经验可以借鉴
  • 43
    购票访问量高度不均衡。。。
  • 8
    我就想问问你怎么做的B站答题刚好60的
    42
    作者
    答题到60分了就退出了呀。。。。
  • 27
    恭喜恭喜仙人100JUMP!祝能10086JUMP!仙人板板!
  • 27
    昨夜刷b站,看到这篇文章对应的视频hhhh
  • 26
    前俩天还和同事讨论过这个问题 12306目前最大的问题不是崩溃和抢票困难的问题,而是对人力、物力等资源的极大浪费,比如每年有7-10天,上亿人为了回家,每天的工作效率至少减少50% 我给出的方案是,把实时同步变成延时异步 对于国庆和过年这种相对集中的出行需求,首先收集所有的出行需求,后台抽签,异步出结果,抽中回家,抽不中哈哈
  • 25
    虽然情况确实这样,但铁道部也应该想想优化业务流程。比如不需要当场确定座位,而是类似航班,后续发短信才给座位
  • 23
    确实很难。 可以考虑高考报名的第1、2、3、N志愿方式(第一志愿北京到广州直达,第二志愿广州到武汉+武汉到北京、第三志愿广州到天津+天津到北京),报名叫定金后,系统慢慢给排队,排上哪个志愿算哪个。 然后变成秒杀系统,不过秒杀时只接受报名和支付定金操作。后面慢慢排队通知结果。
  • 20
    哈哈哈哈哈骚话满篇,我喜欢最后那句,虚寒问暖,不如一笔巨款
  • 16
    关于商品类型,我这有个很简易的设计,大致思路是“空间换算法复杂度”:把每个座位看作商品:1. 每个座位当被售出某一地理区间时,分裂出一个或两个新商品(with区间属性),至多分裂成8个被订,8个预留;2. 当某一区间被退票时,合并或重组成新商品。 这样的话,因为用户买票的时候会选定车次、日期、座位等级,所以只需要做一次至多600行的查询,一次至多16个区间的查询,一次订票操作,一次库存更改。 现在业内算力&存储充沛、算法优化困难,且场景容量固定单一(发车车次是固定的),再外加本身就有留票,所以每次合并&拆分区间的票并不急于再次“可被访问”,直接one in one out,放出一张预留票的名额,实现异步处理。 整体容积则可以考虑目前比较新的弹性解决方案,而“空间换复杂度”的思路下,空间需要更加可预见。 抛砖引玉下,大佬们品一品?
  • 15
    做技术的,比较同意4、5、6点,1、2、3感觉有点没说到点 第一点:线上业务跟线下业务用的同一个系统,其实线上也可以抽象为线下,线上浏览=线下找售票员查询余票,线上下单=线下找售票员买票,只是看这个比例怎么分配。所以,拥有线下业务并不会影响12306的复杂 第二点:双十一貌似只有今年付定金比较常见,而且只有小部分商品采用定金这种方式,加上库存销售额锁定,这些并不代表着双十一是高确定性的。照样不可知,你并不知道用户要买什么、买多少,就像不知道用户买票去哪里,怎么中转,只知道双十一活动期间流量很大。这跟12306是一样的,只知道在春节抢票期间流量很大。所以关于这点,我认为说的很牵强吧。 第三点:除去撕逼价格、撕逼运费以及快递、撕逼售后。电商购物流程其实是:浏览、下单,整个流程不需要24小时(要这么说,乘坐列车到达目的地=收货的话,那完成的周期不知道比双十一长多少)。所以双十一跟12306一样流程也是:浏览、下单。为什么没有发货、收货,因为下单以后,就像仙人说的会异步去处理。这不能算在双十一整个系统的复杂度里面,所以双十一跟12306又是一样的,问题复杂关键都在:浏览、下单,并没有12306必须一次性走完这一说,显得12306好像干了很多事。 PS:自己的一点愚见,如有错误麻烦仙人能够指点一二,毕竟身为技术,对12306的业务也只是靠猜测。
  • 11
    只要放开"限购",就可以把运算复杂度成几个数量级的减少。 那么为什么要限购呢,目标是防黄牛,做到提供运力与需求运力尽量匹配。所以,购票运算的复杂度是和购买统计的复杂度对立的。 而12306搞的招标,本质上是要求用相对固定的技术手段来对抗迭代升级的购票行为,这个逻辑不改,我认为再怎么升级服务器也没用。 我提一个观点,禁止退票,严格实名上车,放开限购。这就能解决黄牛问题了。但是这可能导致铁路系统的实坐率下降,购票率下降,这就不知道铁路的领导能不能接受了。
  • 7
    单身三十年的手速应该有多快?五分钟还是半小时?

作者: RESSRC

个人资源站

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据