一边双十一几亿人同时购物疯狂败家剁手都没有问题,为什么12306一出手,就是炸穿裤衩的用户体验?
明明只是一个简单的卖票软件,怎么搞成这个鬼样子,人家QQ微信几亿人同时在线聊天,激情互动,还有各种小视频。
让硬核的半佛老师来给你们科普一下。
12306到底面临多大的业务压力和挑战。
你们这么多人一拥而上,他们当然受不了,谁受得了呢。
虽然本篇文章会有大量极为硬核的技术术语,但是我会说的尽量简单,大家一定要认真听,多记笔记,过年在饭桌上吹牛的时候,这都是王炸,不用谢我了。
不是说你看了这篇文章就能买到票,实际上买票是一个玄学。
只是说,能死的明白点。
很多人拿12306和双十一来比较,认为双十一这么多订单都能撑住,12306就撑不住,显然是因为技术水平不到位。
这一开始就走了弯路了朋友,12306的业务模式和双十一是有本质不同的。
这种不同,就导致了12306的难度要比双十一大的多的多的多多多~
如果说双十一的难度是人间模式,那么12306差不多相当于是地狱十八层,还要再挖个坑的难度。
第一,双十一的流量再大,也只不过是纯线上业务
,什么叫纯线上业务?所有用户都是在网页或者APP下单,整个数据其实是闭环的。
这就导致双十一其实只是一个纯粹的线上流量问题,解决起来相对纯粹,就像一个单纯的小朋友一样好欺负。
而12306不是,12306不是只有一个APP和网站的朋友,所有人在线下售票厅以及线下机器里产生的交易,也会影响整个12306的数据系统。
实际上现实生活中非常多的买火车票返乡的人,例如辛苦的农民和工人朋友,很多都是不会线上操作的,他们只会线下彻夜排队,非常辛苦,所以12306也必须照顾他们的感受,不能断掉线下业务。
这就导致了12306本身是一个线下与线上同享数据的复杂业务,复杂度要高出双十一一个数量级的。
和纯粹简单的双十一相比,12306就像一个饱经社会摧残的老油条,你永远不知道他们会什么时候会出现什么幺蛾子。
这就像一个纯洁男孩第一次和他的男朋友约会,怕他不来,又怕他乱来。
第二,抛开线上线下不说,毕竟这是欺负12306,我们谈谈业务本身的计划性和可预测性。
如果认真思考,你会发现,双十一是一个有明确计划和操作节点的业务,而12306不是。
双十一活动并不是只有11月11号当天,其实是一个月前甚至几个月前就已经开始了,大量的用户都已经支付了定金,大量的商家也已经锁定了库存和销售额,只不过最终的结算是在11月11号当天进行的而已。
这就代表着,双十一面对的是一个高确定性的任务,只要有确定性,流量再大也不是特别难的问题。
当你知道困难会在什么时候发生的时候,这个困难就不再困难了。
真正的困难,在于不可知。
什么叫不可知?12306就是不可知。
因为你永远不可能测算出会有多少人在哪一天去哪一个地方,一个从浙江回山东的人,他为了回家,选择的线路和时间会非常诡异多变。
他可以买浙江到山东,可以买浙江到上海到山东,可以买浙江到南京到山东,可以买千岛湖到山东,可以买浙江到北京到山东,可以买浙江到黑龙江到山东,甚至可以买浙江到广东再飞回山东,只要能回山东,啊我的大葱。
他可以接受1号出发,2号出发,3号出发,5号出发,10086号出发,只要能出发。
这就代表了谁也不知道需求的流量会是多么的突发,购买的内容会是多么复杂。
我再举一个例子大家就懂了,微博厉害吧?每天这么大的流量,这么多的关注度。
但是为什么经常突然一个明星出轨或者结婚或者负面新闻,微博就要挂掉?是没有技术实力还是服务器资源不够?
都不是,是因为这种流量是突发性的,谁也不知道会突然出现这种爆炸增长,所以服务器就挂掉了。
这就和泼水节上大家都做好了心理准备,但是你泼开水一样。
这谁遭得住啊。
所以建议所有明星出轨之前,先微博报备一下,这样他们出轨的放心,我们吃瓜吃的也安心。
他好,我也好。
第三,电商业务不是一个一次性要完成所有流程的业务,但是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都是拿命来奋斗。
所以之后买票的时候,要宠溺一点,温柔一点,你买的不是票,是工程师们的头发。
第五,业务去重需要大量的判断。
电商业务其实严格来说是不需要用户实名制的,也不需要对用户的身份去重,只要你付钱,有货就发货,除非是限购商品稍微拦截一下,但是面对黄牛党,也就是象征性的挣扎一下,毕竟大家都是出来卖的,不会跟钱过不去。
而12306不一样,12306的模式是,每一个人都要限购。
同路线,同时间,要限购。
就拿北京到珠海举例,12306是不允许一个人在同一天购买大量北京到珠海的车票的,这对其他人不公平,所以要限制人的出发时间和购买路线。
那么问题来了,如果要加限购,那么就要把这个人的当前购买信息,时间,全部缓存下来,这个人的每一笔交易,都要和他当前的已有行程进行去重匹配。
这对数据资源的消耗是非常恐怖的。
并且,并且,查重还有另一个现实问题,就是12306本身是允许非本人买票的,就是我可以给我的爸妈买票,我爸妈也可以给我买票,只要添加乘车人就可以了,这就代表着,同一个人的信息,完全可以在不同的时间节点被不同的买家添加,这又带来了巨大的计算压力。
这就和人生一样,太难了。
第六,和12306比流量,什么公司都没有资格。
很多人真的以为双十一就是流量的巅峰的了,其实并不是,12306才是最恐怖的流量巅峰。
为什么?因为电商的业务模式不会导致用户重复点击,而12306无时无刻不在被所有用户重复点击。
举个例子,你在双十一买东西,是不是买了就走了?买不到你就是骂几句,然后也走了。
一个用户的点击是有限的,你就算单身30年,给你放开了点,你能点多快?
要知道对系统而言,每一次点击,都是一次数据交换。
12306面对的点击流量,要大的多,你买票的时候,是会不断刷新操作的,你在查询余票的时候,每一次都是要跑所有的数据库来帮你同步当前的余票信息,这个负载量和计算量是天量。