在从属于东亚农耕文明的中国人眼中,家既是港湾更是归属。而对于离家在外辛苦打拼的人来说,只有春节这张车票和远方那一顿热闹的年夜饭才是对这一岁辛劳最好的慰藉。
年关将至,除了在各大电商平台欢天喜地的置办年货之外,很多人最关心的莫过于那张回家的车票了。
中国的春运是全世界最大规模的周期性人口迁徙运动,包括火车、飞机、汽车、轮渡在内的各种交通工具要在每年春节的短短的半月之内承担近30亿人次的长短途出行,压力和紧张感可想而知。
这种层层传递的压力表现在客运战线上便是春运期间的7 x 24小时连轴转,而表现在旅客身上则是放票那一瞬间的惊心动魄。
一次失败的抢票
作为一个人口大国,我们永远不缺市场。一些人的痛苦总能成就另外一些人。
2019年1月5日中午,懒洋洋的冬日阳光透过一家无名饭馆的玻璃窗落在餐桌上。饭馆提供的免费高碎还在杯子里冒着热气,北京某互联网公司的中层管理人员老王却无暇顾及这年尾难得的惬意。
13点整,集齐桌上三个人的四台手机,老王本以为这次腊月二九去广州老丈人家过年的车票已经十拿九稳,但现实当中既没有神龙,也没有车票……退而求其次的老王只能拿出备选方案,好在他抢到了大年三十从北京到广州的火车票。
虽然要在大年三十经历10小时以上的舟车劳顿,但想到还能赶上老丈人家的年夜饭,此时的老王也算是放下了一件心事,开始吃起那已有些凉了的18元一荤两素套餐。
老冯所经历的事情并不鲜见,而老冯的失落在很多人眼里甚至是喜悦。在1月5号的前后几日,有多少人因为一张车票而频繁变更着自己的计划,有多少人因为一张车票而错过最重要的一场团圆,又有多少人因为一张车票而彻夜无眠。
经历过网络购票的欢喜和失落,很多人便开始寻找购票的其他途径,抢票软件的火爆也就变得不难理解了。
如火如荼的“抢票”市场
对于中国互联网市场来说,即便是法律法规相对健全的今天,整个行业仍无法彻底摆脱“野蛮生长”的论调。
在这块领域,即便是资本逐渐遇冷的2018年,中国互联网精英们仍旧处在亢奋和创新过剩的状态。
这种创新过剩反应在好的方面便是市场整体的高速增长和对技术及商业模式的快速更新;而反应在不好的方面则是很多竞争或产品突破了普通人对公平的理解。显然,互联网抢票领域的快速发展便是一种相对不公平的存在。
伴随改革开放,越来越多的中国人开始离开祖辈生活的土地,试图在经济更发达的东部地区追寻自己的梦想和存在。而前人命运的成功改变则让更多人踏上了外出打工谋生的道路。
每次年关将至,外出打工的人会陆续回到家中,缓解一年的疲惫,与家人分享一年的收获。春运也便因此形成。
每个中国人都会懂得这样一个道理:任何小数乘以12亿都是一个大数,而任何大数除以12亿则都会变成一个小数。
春节来临,数以亿计的异乡人涌向车站,春节的车票便会成为最稀缺的资源。而当这种面相公众发售的资源变得稀缺,黄牛的出现也就顺理成章。
12306,被视为解决春运车票黄牛问题的最有力解决方案,从整个网站的IT基础架构来看绝对是IT技术的巅峰之作。但无奈的是,12306虽然可以满足千亿级别的访问需求,但其背后所代表的铁路资源却并非是无限的。
各类抢票软件、浏览器和APP如秋后蝗虫般的迅速出现,他们之中,有些是为了蹭热点,有些是为了搭售或宣传自家的其他产品,有些是江湖骗子,有些是简单的抄袭,有些则是技术流。
但无论是哪种存在,辅助抢票软件的出现又让这个通过巨大努力建立起来的公平购票环境面临了巨大的挑战。
对于12306来说,日常工作之一便是寻找并识别这些来自刷票软件访问,并通过技术手段降低其排序优先级,试图让所有人重新站在同一起跑线上。当然,抢票软件也会在第一时间更换IP,让12306之前的操作统统失效。
就像游戏运营方与外挂之间的此消彼长一样,这场关于抢票软件与12306之间的战争永远也不会终结,甚至连胜者都不可能出现。
但就如同我们对游戏外挂和办事走后门会进行自然的鄙视一样,虽然抢票需求的确存在,但并不是每一种需求都应该被市场力量所满足。这些抢票、刷票软件的存在就是这些企业社会道德面前的主动沦陷。
正如同多年以前,阿里将通过漏洞购买内部员工福利商品的技术大咖进行开除处理一样;技术本身无所谓道德和底线,但人和公司应该有。
互联网抢票的技术基础
抛开对于道德的讨论,我们不妨来分析一下抢票软件的运行原理并试着分析一下为何你充了值还是抢不到票。
但首先,我们需要明确铁路部门的车票发售机制。
1、 所有的车票对于不同的出票渠道来说是有固定配额的:例如:某车次有1000个座位,那么12306可能会分得其中的400张,拥有票务贩售资质的第三方售票渠道会分得300张,而铁路系统的线下售票窗口及售票机会分得余下的300张;每个渠道的票源不同,相互独立(此比例为虚构,具体数值不详)。
2、 对于12306这个渠道来说,PC端和手机端也是相互独立的渠道,原理同上。
3、 12306有自己的查询刷新机制,目前是每个用户id每5秒可以刷新一次。这是底层机制,即便是刷票软件也无法逾越。
4、 不同的售票渠道会有自己的放票机制,分时、分目的地的放票可以减轻售票渠道的压力。
在了解这些机制之后,抢票软件的运行原理就变得容易理解了。
这些所谓的抢票软件无非就是一些运行在本地或云端的网页脚本,通过不断向12306发出刷新请求(同样是5秒一次,只不过相对人力,机器会更持久,对时间点的把控也更精准)来获取余票信息,一旦出现余票便进入发起购票请求、识别验证码、提交购票人信息、支付的后续流程。
而所谓的充值加速,也仅仅是在这些抢票平台内部提升用户的优先级,在刷出余票之后优先填写充值用户的身份信息。
在了解其原理之后你可能会鄙视这种将用户分为三六九等的行为,但对于一家主动降低道德底线推出抢票产品的公司来说,用户和社会的鄙视根本一文不值。
另一方面,一些抢票平台也会优化自身的服务器,通过代码优化、内部系统优化、CDN加速等一系列操作降低自身访问12306接口的延迟,从而让自己更有机会在放票的第一时间刷出余票并完成购买。
那么各类刷票平台是否真的完全无用呢?并非如此。
普通PC如果通过家庭路由的wifi链接网络,那么仅wifi就会带来10-30ms的延迟,而这还不算网络本身和浏览器的延迟以及操作时间。
而如果是利用手机平台通过4G网络来抢票的话延迟只会更高。因为受限于信号条件,4G网络本身通常会有几十到几百毫秒的网络延迟。
就事论事的讲,各大抢票软件在实现方式上大体相同,在现有规则和框架下他们能做的优化也相当有限。通过软件抢票只能给你一个更高的起点,但究竟能不能抢到票还要看运气。
但如果回到不得不谈的道德问题,使用抢票平台或为这些平台充值本身就会助长这种不正之风,让好不容易建立起来的公平机制失效。而机制失效所带来的混乱则最终只能由全体旅客来承担。
题外话1:12306系统到底水平如何?
如果只用一句话来形容的话,12306网站及其背后的系统是当今顶尖IT技术的集大成者,全球独一无二的存在。
故事要从2010年12306刚刚上线时说起……
12306在上线之前曾被所有的媒体和返乡者寄予厚望。但从实际的效果来看,2010年春运一役无疑是一次彻底的失败。网站失去响应、登录失败、查询失败、支付失败……一连串的失败让12306的口碑跌入谷底。
虽然当时的决策者对于网站的巨大压力已经有所准备,并制定了分期放票、每日定点维护的策略,但美妙数以千万计的访问还是无情的压垮了12306的整个系统。
在12306整个系统构建之初,技术人员为最核心的票务数据库系统配备了几十台Superdome小型机并使用了Sybase数据库,这在当时已经是非常豪华的配置了。这套配制一来有着顶级的单机性能,二来在高可靠方面有着普通x86服务器无法比拟的优势。当然,现实彻底击碎了这套系统构建的逻辑,逼迫12306重新思考系统构建的思路。
之后为了构建一套能够承载庞大数据库压力的基础架构,12306向当时全球实力最强的IBM、Oracle、阿里、SAP、DELL等软硬件产品提供商发出了邀请,希望获得对应的方案。但面对这样一套压力水平全球独一无二的系统,即便是叱诧风云行业大佬所能提供的帮助也极其有限。
最终,12306核心系统采用了十余台英特尔至强处理器的四路/八路服务器组成集群,并利用VMware完成了硬件虚拟化。当然,面对庞大的交易、查询以及数据一致性压力,普通的数据库在性能上是无论如何也无法满足要求的。
为此,12306大胆的采用了当时最先进的Gemfire分布式内存数据库,通过将数据库全部加载到内存中进行读写操作的方法来提高性能。
而在这一过程中,阿里则根据自身在双十一运营过程中的经验为12306提供了关键的排队机制算法帮助(当然,12306并不能直接套用阿里的排队算法,因为业务模式并不相同)。
当然,除此之外,系统还配备了强大的网络传输、负载均衡设备,并构建了高规格的双活系统。自此,12306才算是一步步走过了困难时期,变成了今天的模样。
而现在,12306还在持续的购进最新IT系统,提升自身的服务能力,为每一个归家心切的人提供最可靠的服务。
题外话2:为什么不请阿里团队来做12306?毕竟他们连双11都能挺过去
12306和淘宝、天猫的双11看上去大致相同,都是短时间内交易量的急剧上涨,需要保证登录、查询、购买流程的通畅。但仔细分析一下,二者面临的压力其实并不一样。12306的需更复杂,阿里团队现有经验能带来的帮助有限。
从两套系统的应用特点来看
双11:
首先,淘宝和天猫有上百万的商家,几千万件产品。双11流量看似恐怖,但如果分摊到每个商品上,处理压力会小很多。
其次,双11消费对数据库的操作压力并不如12306大,消费者每购买一件产品只需在对应数据库中的商品库存栏中进行减一操作即可。一旦库存归零,商品状态即为不可售。
而为了分摊压力,不同的商家或类型的商品还可以分别建立不同的数据库。即便真的出现超售现象(在实际的操作中,多数电商会将订单和数据库减1操作设置为异步,也就是说这两个操作并不会同时进行,因此,在出现海量并发购买请求时就会出现超售现象。
这种设置会极大的降低系统负载,降低系统设计的复杂性),商家也可以通过客服安抚、发放公告等方式来让消费者等待并积极联系补货或生产即可;对消费者影响相对较小。
12306:
首先,绝大多数列车会途径不同站点,一旦旅客购买了从始发站到终点站的车票,那么对应座位在所有站点中的状态均会变为不可售,这会产生大量的排列组合问题,并对数据库产生更多的读写操作,进一步提升压力。而铁道部对于车票发售的总体规则是优先保证远途旅客的出行。
举个例子:以A为起点,设置一辆途径B,到达终点站C的列车,车上只有一个座位。如果系统同时收到两个请求,请求1为A到C,请求2为B到C,那么系统会优先保障A到C的出行,将车票判给请求1。当然,在现实中这套机制会复杂百倍。
其次,为了保证信息的一致性,12306很难采用多个数据库分担压力的做法;所有车票和站点信息必须放在同一个数据库中进行处理,并为进程加锁,防止出现任何超售所带来的法律和社会问题。而这无疑会让数据库的体积和负载变得非常巨大,系统构建难度可想而知。
所以无论是从压力水平还是系统构建难度来看,12306能够像现在这样保证持续运行都是非常难能可贵的,足以证明12306架构的成功和运维的高水平。