从程序员角度看看铁路局和 12306
到年关了,对于在北上广奋斗的人们,最困难的事情几乎就是回家的车票问题了,谁不想回家啊(不想回家的忽略我这一句).
于是乎,市场需求(大城市的外来人口的流动性注定了一票难求)决定了市场供应,各种各样的抢票软件应需而生.
当然,对于铁路局以及它的网站12306的一大波吐槽也随之而来.确实,春运的嘈点是很多,但是各位看官别急啊,我先带你们从程序员的角度看看铁路局和12306,你们再'喷'不迟(反正你们'喷'了也改变不了现状).起初,这种'知识类'的文章真的难倒我了,根本不擅长啊.
后来想想,写程序的时候,别人客户说什么你也得做什么,写文章的时候,反而挑三拣四的,不带这样矫情的,超市里面五花大绑的螃蟹还知道从18.6的冰柜里往28.6的冰柜里面爬呢(这一幕看得我内流满面).
你看到的12306和程序员看到的12306有什么不同?
一说到12306,你肯定想到的是它那毫无美感的界面和极差的用户体验,好吧其实你说的都在理,这一点真的无可厚非.但是重要的是,经常有人吐槽12306的程序员垃圾啊,都是靠关系进去的,都在坐着喝茶,烧纳税人的钱(铁路局虽然是国企但是根本资金根本不是政府财政,这点要搞清楚),这项目给几千块,大学生都能做.
诸如此类的批判,我在各大媒体,朋友圈,知乎,微博等等看过不少,就差把12306的程序员绑上十字架烧死了,讲道理,虽然我不是12306的程序员,但是我还是要给他们正正名.
12306的最要命的业务量远远比淘宝的双十一复杂,这话真的不是搪塞各位乘客
个人感觉两者同属于重量级的网站业务,双11在业务规模上更有挑战,而12306则在业务复杂度上更高。根据官方公布的数字,有人统计了一下:需要数千个pv,才能出一张票。这个说法并不能得出“出票效率低”的结论,但是恰恰很形象的说明了查询量的巨大。
为什么12306查询量会这么大呢?因为淘宝的秒杀抢不到就算了,运气不好下次再来过;火车票的购票心理则不同,“求之不得,梦寐思服”,特别是高峰期的票。而买到票的人也不一定满意现在的车次、时间。总之,就是一个字:刷!刷!刷!
当然各种抢票工具的泛滥,也是让查询量猛增的原因之一。不过,从另一个角度看,能让这些工具都被用户用起来,这也证明了系统处理能力的大幅提升。
有人拿这个系统和奥运会的票务系统比较。我觉得还是不一样。虽然奥运会的票务系统当年也一上线就废了。但是奥运会用的是抽奖的方式,也就是说不存在先来先得的抢的方式,而且,是事后抽奖,事前只需要收信息,事前不需要保证数据一致性,没有锁,很容易水平扩展。
订票系统应该和电子商务的订单系统很相似,都是需要对库存进行:1)占住库存,2)支付(可选),3)扣除库存的操作。这个是需要有一致性的检查的,也就是在并发时需要对数据加锁的。B2C 的电商基本上都会把这个事干成异步的,也就是说,你下的订单并不是马上处理的,而是延时处理的,只有成功处理了,系统才会给你一封确认邮件说是订单成功。我相信有很多朋友都收到认单不成功的邮件。这就是说,数据一致性在并发下是一个瓶颈。
铁路的票务业务很变态,其采用的是突然放票,而有的票又远远不够大家分,所以,大家才会有抢票这种有中国特色的业务的做法。于是当票放出来的时候,就会有几百万人甚至上千万人杀上去,查询,下单。几十分钟内,一个网站能接受几千万的访问量,这个是很恐怖的事情。据说 12306 的高峰访问是 10 亿 PV,集中在早 8 点到 10 点,每秒 PV 在高峰时上千万。
多说几句:
库存是 B2C 的恶梦,库存管理相当的复杂。不信,你可以问问所有传统和电务零售业的企业,看看他们管理库存是多么难的一件事。不然,就不会有那么多人在问凡客的库存问题了。(你还可以看看《乔布斯传》,你就知道为什么 Tim 会接任 Apple 的 CEO 了,因为他搞定了苹果的库存问题)
淘宝要比 B2C 的网站要简单得多,因为没有仓库,所以,不存在像 B2C 这样有N个仓库对同一商品库存更新和查询的操作。下单的时候,B2C 的网站要去找一个仓库,又要离用户近,又要有库存,这需要很多计算。试想,你在北京买了一本书,北京的仓库没货了,就要从周边的仓库调,那就要去看看沈阳或是西安的仓库有没有货,如果没有,又得看看江苏的仓库,等等。淘宝的就没有那么多事了,每个商户有自己的库存,库存分到商户头上了,反而有利于性能。
数据一致性才是真正的性能瓶颈(各个渠道的票价的共享)。有人说 nginx 可以搞定每秒 10 万的静态请求,我不怀疑。但这只是静态请求,理论值,只要带宽、I/O够强,服务器计算能力够,并支持的并发连接数顶得住 10 万 TCP 链接的建立的话,那没有问题。但在数据一致性面前,这 10 万就完完全全成了一个可望不可及的理论值了。
我说那么多,我只是想从业务上告诉大家,我们需要从业务上真正了解春运铁路订票这样业务的变态之处。
再从铁路运营的角度回答一下。
1、介绍一下席位复用。就是一趟北京到上海的车,你从北京坐到了济南,你定的那个席位北京到济南区间就没票了,始发/终到站在北京—济南区间的也没票了,但是济南到上海的车票仍然有售,此为席位复用。请问哪种淘宝商品有这种性质?
2、再说说限售区段。比如北京到上海的直达车,主要承担的客流是远途客流,如果短途客流所占的比例过大,会影响远距离输送的能力,所以会限制短途客流购买长途车次的车票,因此会出现北京到上海有票,同车次北京到天津却没有票的情况,这是我们有意为之。请问哪种淘宝商品有这种性质?
3、再说说席位共用。比如甲乙丙三个人同时在车站窗口、电脑和手机客户端上查看车票,但是这是三个不同的系统!你不能直接把售票员看到的信息给互联网订票的乘客看对不对,就像你不能直接把银行柜台工作人员看到的信息显示在ATM机上一样。而车票是实时查询实时更新的,如何消除中间这个接口的延迟,就够很多一流的程序员优化很久了。
这只是铁路售票机制的一小部分,我们讲票额分配讲了几个星期才搞清楚基本原理好不好!
如果一个人对数据库稍微有一些了解,或者对铁路的售票机制稍微有一些了解,TA都不会说出12306交给阿里就一定能做好这种话。(其实马云已经接了12306的云计算)
这时候就有人说了,难倒现有的互联网技术不能解决铁路部门的难题,实在不行外包嘛?可以的,但是你忽略了一个问题,铁路部门是国企.在互联网售票之前,网点售票已经实施多年。换句话说,铁路售票实际上一直有一个相当庞大且复杂的、跨多个路局的信息系统在支撑,而且可以追溯到80或90年代,维护至今。这个系统也许不仅支持了售票,可能还包括调度等核心业务。那这里就有一个问题:在做互联网售票的时候,是否要重构一下原有的系统呢?
这个问题值得反复掂量。大家应该知道,彻底重构一个运行数十年的系统的开销和风险吧,粗略一想涉及到各种业务逻辑、软硬件供应商、版本与维护协议等等。
绝大多数的互联网技术同僚应该会倾向于在现有系统上做web前端,先让系统“用起来”,然后再集中技术力量逐步优化整套系统架构。这也是当时12306的选择,这就导致有很多历史的包袱,还要考虑线下售票系统。先不说票少人多的问题,12306从早期一直到现在最大的问题就是遗留系统,也就是原来的火车站和售票点的那套,这套系统部署在铁路内部专网,而且票务数据也都留在各个铁路局,所有最早的12306系统在查票和买票的时候都会通过专用网闸和防火墙去又慢又不爽的各个铁路局去查余票和改余票,这样子过防火墙在两个网络间查询有多慢,大家看最早的版本(2012年春节)就知道了,查询一旦稍微高一点就挂,后来把查票单独分离出来做了缓存处理,但是一直到现在的购票处理也都是要去铁路内网的各个数据库去改数据的。最后貌似做了预处理,把票放在一个票池子里,提前分配,一少部分进入车站和网点,大部分到12306的网站,回流的退票也到票池子里经过重新计算车次以后过段时间再重新放出来。就算这样实际上也比较慢,因为数据是分散在不同的铁路局(铁路内网)的,这点铁总也想把票都收到一起,到时候这个改进就是利益相关的扯皮了。
而且别把BTA三大巨头扯进来,这真的快烫手山芋,就马云接了一下云计算的盘,而且还没要钱,结完之后说了句:以后这事别找我.
12306近几年的最大的嘈点:图形验证码!!!
关于图形验证码,我相信一大波嘲讽可以淹死铁路局的领导们,是谁作出这无聊又特么难为乘客的验证的.其实12306这么搞,是为了防止黄牛囤票。验证码技术这么多年,数字、英文、汉字几种验证码形式随着图片识别技术的日趋成熟都已经能被轻松攻破。一项新技术的产生有可能是幸事,也可能是一场规则破坏,当然用户才不管这些,谁给买到票就给谁点赞。没办法,12306被逼无奈只能自创一套根据问题选图的验证码,机器学习再牛逼始终不能代替人去思考,确实很有有效,但是同时也把人难住了不过,验证码的问题永远是道高一尺,魔高一丈.刚好在AWS上有mxnet,模型直接用了在imagenet上(2万个标签和1400万样本)预训练的Inception_BN增强版本。模型每个图的处理需要15M内存,g2.2xlarge上时间大概在 0.2 - 0.3秒 之间。说白了,虽然能解决但是慢,尤其是12306的渣画质,其实也不怪,12306,图片处理技术还带着并发问题,庞大的数据库,还有带宽,你能让它怎么办呢?
关于铁路局是否盈利?
我曾经也天真的认为,铁路局是盈利的,毕竟高客运次数在那儿.实际上截至今年3月末,中国铁路总公司的资产总额6.35万亿元,较上年末增加1.65%;负债总额为4.14万亿元,较上年末增1.2%,较去年同期的3.75万亿元,增0.39万亿元,同比增加10.4%;3月末负债率为66.28%,较上年末的65.57%略有下降。
首先,我们关注两个大点:资产和负债,从数据可以看出,铁总的负债率在65%左右,处于一个比较好的区间,是一个可以接受的数字,而这个中国经营报呢,估计是觉得65%的负债率也许不够有冲击力,想了想,诶,把资产刨掉,我单说负债不就好了,一出来一看,哇,4万亿,多可怕,多腐败,多XX,就像是一个路人,指着街边亿万富豪的房子,说,这个富豪啊,在外面欠了好几百万呢。。。。
再来看第二段。
2015年全年,铁总还本付息的金额为3385.12亿元,其中利息为779.16亿元,还本付息金额比2014年增加2.52%,比2013年增加56.91%。值得一提的是,铁总2015年全年税后利润仅为6.81亿元,远远低于其给银行的利息。
而且铁路局烧的也不是纳税人的钱,朝银行贷的款,所以大部分的收入都来给银行喂了利息.谈谈目前的铁路票价。很多人觉得高铁贵了,误认为铁路涨价了,其实真正了解的人都知道,中国铁路普速客运从95年?(大概就是94-97期间)以来,从未调整过票价体系。随便举个例子,上海-北京,无空调普速硬座88元,硬卧179元,有空调快速以上(包括特快、直达特快)硬座179元、硬卧327元、软卧499元,这个15年来从没涨价。只是,高级的坐席越来越多,如软卧、动车软卧,再到现在的高铁、一等座商务座等等,便宜的票少了这不否认,高价的票多了,但是你所享受到的服务、速度、舒适性也是提升的。你不能要求用88元的25小时无空调硬座的标准拿来喷5小时555元的高铁吧?从建设成本和运营成本来看,绝大多数的高铁也是亏损的(除了京沪高铁)
在谈谈国外,欧洲国家的票价是0.5元/km(大概是这个具体数值不给了),而中国的票价一直是0.05元/km,很多人抱怨铁路局从来不做优惠活动,实际上这种票价就是优惠活动了,当然欧洲票价是可以生日打折,小孩也可以打折.
综上所述,铁路局的社会福利性还是大于它的盈利性的
关于铁路局的灰色利益?
其实我不是特别想写这段,我只能告诉你们有,因为我就曾经享受过,但是现在逐年减少了,监管力度打了啊,不好混了.
就说到这里把,码字码了一下午,我也只是针对大家可能不了解的部分做了些解释,我也不是给铁路局洗白的,下次不更这种文章了,查资料太累,祝大家早日抢到车票回家.
文/可惜我只是个诗人
关键字:产品经理, 铁路局
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!