说到12306,很多人都十分无奈,想到12306的丑陋的界面,难用的UI,动不动失效的网页,还有自己买的票在订单里半天找不到等各类问题。
做好一个系统本身并不容易,但是12306是花了2亿多块钱建设的。作为一个技术人员,可以评估一下其技术难度。

对于12306的用户规模来讲,其实算是挺大的。但是应对用户规模的增涨来说,其实已经有很多成熟的方案了,现在秒杀活动,动不动上千万的并发。12306按这些方案走就不会有大的问题。

12306的商品

12306的商品只有一种:火车座位

不管是那一趟车,还是那个时间的车,它只卖位置。

计费性质可以看成商品租用

所以跟车站结合起来,就相当于他卖时间的商品。

因此我们将站与站之间的位置看成是一个商品租用即可。

假设是从上海到北京的火车,中间有几个站,就是几个商品租用。

如果是从上海到济南有三个站与站的间隔,就相当于是买了三个商品租用。就相当于按时计价的商品。去过游乐园的同学都应能理解。

定价系统

所以通常对于任何一趟车,都会有规定站与站之间的票价。这就是定价系统。定价系统是完全人工设定的系统,所以我们不在这里深入的讨论。

有了定价系统后,当用户选择完起始位置,我们就知道出票时的价格了。
所以对于我们来说,出票的过程就是占用时间段的问题。

车次与车上人员信息是一个固定大小的二维表

640

所以如果有一个站点与位置的二维表的话,很容易就能描述完成一趟车的车票信息。
并且这张二维表是固定的,矢量的。一个车次下,一种车型下,所有的信息都是固定的。
不固定的只是占用这张二维表的位置的用户。
所以对于这趟车的所有信息,我们只需要根据这张死的表来计算就可以获得全部的信息了。

火车票业务难吗?

际上火车订票系统是一个静态的商品的系统。只是购买者可以一次买多个连续部分。就相当于是一个填坑系统。你来了,我给你填上,你走了,你空出来让另外的人来填。

所以基本的火车订票系统是很简单的。

一旦搞清楚了这个基本的逻辑,那么我们还可以提供更加复杂的附加系统。比如如何优化上座率,如何预测用户等。如何优化火车车次等。

12306的问题

1、界面很丑
最早的时候似乎是拿jquery mobile做的,界面很丑。
2、网站的https证书是一直没有被认证过的。
3、访问量大的其实是静态部分,对于对态的部分的查询其实是相对要小很多。
4、如果将每个车次分到不同的服务器上,那么处理的动态订单量是很小的。并且可以保证每次处理的数据都是有很高的缓存命中率的。
5、用户体验很差,找订单,支付,查询都是很难的。

12306的网站是一个访问量很大的网站,是有技术挑战的。但是业务本身并不是很复杂的。比综合性电商网站的业务其实是要简单很多。零售电商是最复杂的系统,而12306只是零售电商商品中的一个极小的分支。是属于订票系统里的一个分支,跟电影院的订单基本是一样的,都是卖位置的系统。

因此12306的技术挑战主要来源于规模化,而不是业务上。

但是你会发现12306很多的基本业务流程都做的很渣,有时候找个订单都非常麻烦,这绝对不是因为业务复杂造成的。

订单按时间先后列表出来,难道很复杂吗?

对于很多开发团队来说,任何业务都是有难度的,但是12306是花了几个亿的项目,必定是选择顶级人才建设的。所以再扯到难度的话,不是对自己的看不起吗?别人几百万的风投就能搞几亿的用户的系统,你几个亿还没有能搞好?

所以相对于2亿多块钱来讲,12306不能称为难。