首先说一下,我才疏学浅,技术能力并不过关,技术方面我能讨论的不多。
不过这些年我对铁路的了解应该在这个论坛里比大部分人多,我想说一说我了解的铁路方面的事,以及 12306 的一些细节。
12306 只是一个前端网站,他的作用是将售票核心网的接口暴露出来,供除了车站售票处之外的其他旅客调用。
铁路现在是各个路局各自为政,每趟旅客列车都是有所属路局的,售票核心网的服务器其实是在各个路局内。举个例子:郑州水灾的时候郑州局所辖列车票务业务短暂中断过一段时间,因为郑州局的机房在-1 层,被水淹了。而快速恢复则是因为铁科院内部对各个路局的设备都有一套备份,所以切过去就好了。
目前铁路单纯售票业务计算压力并不大,因为一趟车他就那么几千的座位,而每趟车之间在售票业务上没有什么关联,可以加服务器简单解决。而且售票核心网事实上已经很多年没有大改过了,这些年实名制、电子客票、积分兑换,都是修修补补级别的。
12306 最大的压力在查询余票,因为这个功能直面旅客,相当于被 DDOS 了。这个确实是靠多级缓存+云服务等实现的,至于技术是阿里还是铁科院提供,我不能确定。想必各位都有这样的经历:在买票时,明明显示有票提交后却报无票 or 自己显示没票,别人就显示有票。这个恰好能说明在这种量级下,保持缓存一致性是很困难的。(车站售票窗口以及车站自动售票机应该是可以直连售票核心网的,如果是想买临近要出发的列车,可以尝试在人不多的售票窗口让他给你刷一刷,或者在自动售票机上刷,比自己在手机上刷有用的多)
铁路在售票不联网之前,每趟车会为其经过的车站提前分配票额 /位置的,这个机制至今仍在沿用。这种机制就造成了所谓的区间限售(一趟北京南到上海虹桥的车,你搜全程有票,搜天津南到上海虹桥就没票,实际上就是预先把大部分票额分配给了北京南)以及很多人感受附近的人似乎一起下车等。这种区间限售,客观上减缓了售票系统计算的压力,也提高了铁路的利润率(还是比如北京南到上海虹桥的车,如果天津南到上海虹桥被买走了,那这个座位北京南到天津南就很难被卖出去),当然客观上会造成对短途旅客以及出发 /目的为小站的旅客的不便。( PS. 以前区间限售几乎都是开车前 24 小时解除,不过现在似乎这个时间变的随机了,就像退票随机延迟返回票池一样)
售票最大的压力还是来自于刚起售的时候,等到解除限售之后,虽然牵一发动全身的情况会很严重,但是这个请求量并不大。我个人推测,解除限售时间的动态变动,其实应该和售票系统压力与票卖的好不好都有一些关系。不过这两个原因之间本身就是关联的。
铁路关于减缓售票压力所做的努力,其实除了技术之外还有很多行政方面的手段。比如之前提到的区间限售就是一种,还有大家可见的不同站起售时间不同、候补购票以及购票等候队列等。12306 的成功是多管齐下的结果。
现在 12306 我个人觉得软件还算好用,当然前提是不要打开 F12 看 Ajax 请求,不然可能发现在同一个请求下,变量能有好几种命名方式及传递方式(这段话和主题无关,纯粹是看见之后感到有些惊奇)
也许这个帖子可能会让一些人觉得我认为 12306 没什么技术难度。但是我想说,我无法判断他到底有多难,我只知道他既不像有些人说的那么简单,也不像有些人说的那么难。(好像是句废话)
其实我发这个帖子,主要是觉得大家关于 12306 技术的讨论好像和我了解到的不太一样。希望大家能平和讨论,无论对方持什么观点,尽量不要人身攻击。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.