24

为什么12306时不时要崩那么一下?

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzI5MTE2NDI2OQ%3D%3D&%3Bmid=2247487856&%3Bidx=1&%3Bsn=1766a6477f5806bf34361223c5c6a214
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

这是仙人JUMP的第100篇原创

2019年即将过去,过年回家的火车票,你们买到了吗?

我知道你们很多人都没有买到,我能感受到你们内心的绝望。

前几天12306崩了,很多人在痛骂12306,还有很多人在我公众号的后台问我为什么12306总是动不动就崩溃,和大姨妈一样不给力。

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

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

nqeMvaa.gif

让硬核的半佛老师来给你们科普一下。

12306到底面临多大的业务压力和挑战。

你们这么多人一拥而上,他们当然受不了,谁受得了呢。

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

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

只是说,能死的明白点。

rIryyae.jpg

很多人拿12306和双十一来比较,认为双十一这么多订单都能撑住,12306就撑不住,显然是因为技术水平不到位。

这一开始就走了弯路了朋友,12306的业务模式和双十一是有本质不同的。

这种不同,就导致了12306的难度要比双十一大的多的多的多多多~

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

URbM7rZ.gif

第一,双十一的流量再大,也只不过是纯线上业务,什么叫纯线上业务?所有用户都是在网页或者APP下单,整个数据其实是闭环的。

这就导致双十一其实只是一个纯粹的线上流量问题,解决起来相对纯粹,就像一个单纯的小朋友一样好欺负。

而12306不是,12306不是只有一个APP和网站的朋友,所有人在线下售票厅以及线下机器里产生的交易,也会影响整个12306的数据系统。

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

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

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

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

JBZviya.gif

第二,抛开线上线下不说,毕竟这是欺负12306,我们谈谈业务本身的计划性和可预测性。

如果认真思考,你会发现,双十一是一个有明确计划和操作节点的业务,而12306不是。

双十一活动并不是只有11月11号当天,其实是一个月前甚至几个月前就已经开始了,大量的用户都已经支付了定金,大量的商家也已经锁定了库存和销售额,只不过最终的结算是在11月11号当天进行的而已。

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

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

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

FRNv2un.jpg!web

什么叫不可知?12306就是不可知。

因为你永远不可能测算出会有多少人在哪一天去哪一个地方,一个从浙江回山东的人,他为了回家,选择的线路和时间会非常诡异多变。

他可以买浙江到山东,可以买浙江到上海到山东,可以买浙江到南京到山东,可以买千岛湖到山东,可以买浙江到北京到山东,可以买浙江到黑龙江到山东,甚至可以买浙江到广东再飞回山东,只要能回山东,啊我的大葱。

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

NRrI3ae.gif

这就代表了谁也不知道需求的流量会是多么的突发,购买的内容会是多么复杂。

我再举一个例子大家就懂了,微博厉害吧?每天这么大的流量,这么多的关注度。

但是为什么经常突然一个明星出轨或者结婚或者负面新闻,微博就要挂掉?是没有技术实力还是服务器资源不够?

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

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

这谁遭得住啊。

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

他好,我也好。

UbuIBbz.gif

第三,电商业务不是一个一次性要完成所有流程的业务,但是12306必须一次性完成,这进一步加大了难度。

大家思考一下,电商购物,实际上是并不是一次性的。

一个典型的电商购物流程是,浏览,和商家撕逼价格,下单,和商家撕逼运费以及快递,物流发货,买家收货,和商家撕逼售后。

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

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

rMV73yB.gif

这就代表电商的数据压力没有想象中那么大,可以异步处理,完全可以先全部付款完成,然后再慢慢处理发货,然后再慢慢处理售后。

就像你要刷B站,又要烧开水,你完全可以先烧开水,在烧水的过程中刷B站,这就是异步的好处,可以同时多任务并行,而且不影响用户的核心体验。

你下单后3小时发货和5小时发货,不影响用户,容错率高。

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

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

yquUZne.gif

所以12306等于是没有这种缓冲周期,需要直面所有的流量,在最短时间内满足所有人的所有需求,所有的业务都要在极短时间内处理完成,这就是会被一下子塞满。

同样是1亿用户,4个步骤,电商可以分4个步骤淡定处理,每个步骤处理1亿流量,而且可以分多小时,多天处理。

12306就只能一口气处理4亿,没有缓和,这个压力可想而知。

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

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

RVrQBbA.jpg!web

第四,电商业务的库存管理是相对简单的,而12306是极其复杂的,复杂到我给你简单讲讲你都会抑郁。

想想看,作为电商平台,管理货物虽然也有难度,但本身的统筹不过固定产品的增删改查,有多少就是多少,付款了就减一,上量或者退货就加一,顶多出现最后一个商品被2人同时拍下的小概率事件,这都是小事儿。

而12306是完全不同的难度,二者难度差别大概相当于草履虫大战那美克星人。

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

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

IRZbmeI.jpg!web

就这一个路线,17个站,支持随意站上车,随意站下车,会有多少种可能性?

因为坐车不可能只做单站循环,就是不能北京到北京。

所以是从1加到16,一共136种可能性,注意哦,电商同样的场景只有增删改查4种可能性。

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

EJNVFbu.jpg!web

假如有人买了从北京到广州,那么对应的所有库存就要减1,但是广州到珠海的库存不减。

假如有人买了从武汉到珠海,那么对应的就是武汉到珠海沿途所有线路的库存减1,但是北京到武汉不减。

假如有人买了石家庄到漯河西,那么北京到保定,北京到石家庄不用变,漯河西到珠海段,不用变。

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

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

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

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

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

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

UfIVbyQ.jpg!web

第五,业务去重需要大量的判断。

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

而12306不一样,12306的模式是,每一个人都要限购。

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

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

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

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

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

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

RnauM3Z.jpg!web

第六,和12306比流量,什么公司都没有资格。

很多人真的以为双十一就是流量的巅峰的了,其实并不是,12306才是最恐怖的流量巅峰。

为什么?因为电商的业务模式不会导致用户重复点击,而12306无时无刻不在被所有用户重复点击。

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

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

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

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

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

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

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

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

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

uYzQR3U.gif

会有人问,既然挑战这么大,12306这么不容易,那么为什么不去像国外先进技术取经?为什么不去加大投入服务器?为什么还在找借口?

为什么12306不引入国外的先进技术呢?

答案其实很简单,国外也罩不住啊。

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

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

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

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

这是很现实的一件事情。

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

EvQbQjJ.gif

说到这里,我想到了我们行业里的一个笑话,有个脸书的早期工程师回国加入阿里巴巴,离开前,他说要去拯救阿里巴巴的数据系统,结果回来之后才发现,他在脸书遇到的数据挑战,和阿里巴巴比起来,简直是幼儿园水平。

在数据挑战上,我们遇到的数据挑战绝对是世界最强梯队的,很多时候没有之一。

那么为什么不加服务器呢?技术不够,硬件来凑。

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

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

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

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

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

第三个,成本问题。

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

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

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

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

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

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

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

加钱,继续扩建?

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

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

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

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

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

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

3miu22B.gif

-------------纯洁的分割线--------------

本文是仙人JUMP的第100篇。

从2019年5月写的JUMP的第一篇文章,没想到能在年内达成原创100篇,真的是一种缘分。

仙人JUMP的风格,其实就是我平时讲话的语言风格,写报告的时候严肃,是半佛仙人;讲话的时候满嘴跑火车,是仙人JUMP。

写仙人JUMP的目的其实很简单,就是觉得这个世界已经够魔幻了,能够用更魔幻的文字把这些写出来,或许很有趣,就是这样。

感谢大家1年来的支持,没有你们就没有今天的我。

对了,后面我也会持续把一些内容做成B站的视频,我的B站ID是【硬核的半佛仙人】

jq67rur.jpg!web

目前已经做了3个视频了,效果说实话一般,做视频和写字是不一样的模式,录音也很蛋疼,不过目前的3个视频一个比一个在进步,我也会快速迭代的~

欢迎多多关注一个骚话UP主【硬核的半佛仙人】~

对了,B站的视频也是会摸鱼的,在评论区用随机数抽评论,给支付宝口令。

最后,嘘寒问暖,不如一笔巨款。

-----------------------

感谢你的阅读,下面是1个抽奖链接按钮,1月5日晚上19点开奖,一共 18880元 ,10个 红包,平均金额一个1888元,锦鲤又来了~感谢大 家的支持。

感谢大家一直以来的阅读、在看和转发,点我参与抽奖!点我参与抽奖!

就是点上面这个蓝字!我的每篇文章结尾都有蓝字!

E3emMjB.png!web

仙人JUMP

长按左侧二维码关注!

你将感受到一个放飞自我的灵魂

且每篇文章都有惊喜

【感谢大家,希望一起走的更远】

RNJrqeU.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK