12306 居然又被拿出来讨论了,我想发表一些自己的见解

2023-01-05 21:13:47 +08:00
 epis2048

首先说一下,我才疏学浅,技术能力并不过关,技术方面我能讨论的不多。

不过这些年我对铁路的了解应该在这个论坛里比大部分人多,我想说一说我了解的铁路方面的事,以及 12306 的一些细节。

  1. 12306 只是一个前端网站,他的作用是将售票核心网的接口暴露出来,供除了车站售票处之外的其他旅客调用。

  2. 铁路现在是各个路局各自为政,每趟旅客列车都是有所属路局的,售票核心网的服务器其实是在各个路局内。举个例子:郑州水灾的时候郑州局所辖列车票务业务短暂中断过一段时间,因为郑州局的机房在-1 层,被水淹了。而快速恢复则是因为铁科院内部对各个路局的设备都有一套备份,所以切过去就好了。

  3. 目前铁路单纯售票业务计算压力并不大,因为一趟车他就那么几千的座位,而每趟车之间在售票业务上没有什么关联,可以加服务器简单解决。而且售票核心网事实上已经很多年没有大改过了,这些年实名制、电子客票、积分兑换,都是修修补补级别的。

  4. 12306 最大的压力在查询余票,因为这个功能直面旅客,相当于被 DDOS 了。这个确实是靠多级缓存+云服务等实现的,至于技术是阿里还是铁科院提供,我不能确定。想必各位都有这样的经历:在买票时,明明显示有票提交后却报无票 or 自己显示没票,别人就显示有票。这个恰好能说明在这种量级下,保持缓存一致性是很困难的。(车站售票窗口以及车站自动售票机应该是可以直连售票核心网的,如果是想买临近要出发的列车,可以尝试在人不多的售票窗口让他给你刷一刷,或者在自动售票机上刷,比自己在手机上刷有用的多)

  5. 铁路在售票不联网之前,每趟车会为其经过的车站提前分配票额 /位置的,这个机制至今仍在沿用。这种机制就造成了所谓的区间限售(一趟北京南到上海虹桥的车,你搜全程有票,搜天津南到上海虹桥就没票,实际上就是预先把大部分票额分配给了北京南)以及很多人感受附近的人似乎一起下车等。这种区间限售,客观上减缓了售票系统计算的压力,也提高了铁路的利润率(还是比如北京南到上海虹桥的车,如果天津南到上海虹桥被买走了,那这个座位北京南到天津南就很难被卖出去),当然客观上会造成对短途旅客以及出发 /目的为小站的旅客的不便。( PS. 以前区间限售几乎都是开车前 24 小时解除,不过现在似乎这个时间变的随机了,就像退票随机延迟返回票池一样)

  6. 售票最大的压力还是来自于刚起售的时候,等到解除限售之后,虽然牵一发动全身的情况会很严重,但是这个请求量并不大。我个人推测,解除限售时间的动态变动,其实应该和售票系统压力与票卖的好不好都有一些关系。不过这两个原因之间本身就是关联的。

  7. 铁路关于减缓售票压力所做的努力,其实除了技术之外还有很多行政方面的手段。比如之前提到的区间限售就是一种,还有大家可见的不同站起售时间不同、候补购票以及购票等候队列等。12306 的成功是多管齐下的结果。

  8. 现在 12306 我个人觉得软件还算好用,当然前提是不要打开 F12 看 Ajax 请求,不然可能发现在同一个请求下,变量能有好几种命名方式及传递方式(这段话和主题无关,纯粹是看见之后感到有些惊奇)

也许这个帖子可能会让一些人觉得我认为 12306 没什么技术难度。但是我想说,我无法判断他到底有多难,我只知道他既不像有些人说的那么简单,也不像有些人说的那么难。(好像是句废话)

其实我发这个帖子,主要是觉得大家关于 12306 技术的讨论好像和我了解到的不太一样。希望大家能平和讨论,无论对方持什么观点,尽量不要人身攻击。

4678 次点击
所在节点    程序员
31 条回复
wolfie
2023-01-05 23:19:33 +08:00
复杂,但并不觉得很难。
好多人进入一个误区,不恰当的例子 不清楚国足厉害不厉害,反正吹国足就对了。
terrytw
2023-01-06 09:18:54 +08:00
很多人其实都有一个误解,把这个事情当成一个纯技术的问题在讨论
或者说没有明白需求方是谁

你看那个帖子里有前员工的答复

1. 全局性事务
现阶段最难的是全局性事务, 因为保密原因, 不能说太多, 一句话概述就是整个系统存在事务问题导致的性能低下
2. 流量压力
众所周知
3. 前置检查
你买一张票的前置检查多到你无法想象, 目前的做法是线性检查, 提过并行检查的意见, 被否了
属性 /规则 /()保密)上的检查
4. 车票区段售卖
其实车票不是 12306 卖的, 实际卖票的是 18 个铁路局, 12306 只是一个售卖平台.
12306 只是拿到票然后根据用户提交的席位来分配这些票.

其中除了第 2 条是用户导致的
134 其实绝大多数时候都是各级 gov 的行政要求导致的复杂性

12306 从来都不是一个以解决乘客需求为第一优先的平台,乘客的体验当然不好
terrytw
2023-01-06 09:21:47 +08:00
总有人讨论 12306 开发的时候,如何计算余票
你有没有想过,计算余票的逻辑,根本不是公平公正的,不是以让有需求的乘客买到票为目的的
计算余票的逻辑,首先要考虑领导的意见(看到前员工说的保密了嘛?),各铁路局的利益

复杂的点在这里,你头上有一堆爹,但是乘客不属于其中之一
yaphets666
2023-01-06 09:54:21 +08:00
和我在体验上反推的推测是一样的,售票算法并不智能。
napsterwu
2023-01-06 09:58:11 +08:00
这几年抢票其实一直有一个疑惑,还请有知道的大佬不吝赐教。
问:A->B 站的票,真正起售时间是什么呢?是 A 站起售时间吗?还是列车始发站起售时间?还是列车途径所有站点中,最晚的起售时间?
比如深圳北( 9 点起售)往汕头,大多数列车是广州南( 10 点)始发,途径惠州( 8 点 30 ),潮汕( 14 点)。这样的列车是不是 14 点之后才会开始放票?
wttx
2023-01-06 10:03:01 +08:00
@terrytw 毕竟对于 12306 ,只要运能满足不了,就总有人买不到票,需要抢票时,并不缺乘客,🤣
AyaseEri
2023-01-06 15:31:06 +08:00
@napsterwu 我记得是按出发车站,与车次没关系。
xiaotianhu
2023-01-06 16:41:39 +08:00
说起来大家对这玩意这么有兴趣,真希望有哪个参与了的大神写一下这玩意的技术优化原理啊。hhh
epis2048
2023-01-06 20:35:29 +08:00
@xiaotianhu 我觉得 这个压根不是一个技术问题,所以才导致网络上争论很多,谁也无法说服谁
epis2048
2023-01-06 20:38:02 +08:00
@napsterwu A->B 的车票,只取决于 A 站的起售时间,与车次、目的地、经由等全无关系。至于起售时间,12306 可以查询

事实上,在刚开始放票的时候,车票是严格遵守配额的,所以每个车站起售时间不同,也不会影响抢票的公平性。
Nnq
2023-01-08 07:18:42 +08:00
架构上以及算法上都比较难的一个实例,一部分要保证 HA 同时还要有运筹学来保证最优解, 目的地是多个,相比航空两点或者三点,这个难度更大。 航空公司都经常有超售的情况

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/906853

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX