原创:谈谈12306铁路客运售票系统的架构问题(二)
作者:刘常军(2014-01-10)
就一个软件系统而言,业务需求是根本,是软件系统的基因和灵魂。
下面我们来简要的分析一下铁路客运售票系统和道路客运售票系统的主要业务需求。
首先,铁路客运售票系统的业务需求主要有:(1)要建一个全国集中式的铁路客运售票系统,要把全国所有火车站及票务资源都要收入其中。(2)单次运输载客人数较多。以动车组为例,短编组的动车组有8个车厢,610个座位,长编组的动车组有16个车厢,1220个座位。(3)路途较长,途径站点多,区间段内上下客多。(4)铁路客运售票系统的车票库必须支持动态生成,要能够根据旅客购票情况实时拆分、动态生成。举例来说,一列从广州开往北京的动车组,在正式售票前,票务库里可能只有1220张“广州-北京”的车票。当然,实际情况更可能是为沿线的几个大站预先生成若干车票,这样乘客购票时系统可以直接出售而无须拆分,只有短途票、或者在一些小站发车、或者预先生成的票全部售完等情况才需要动态生成,这里为了举例说明而做了简化处理。现在我们来分析一下车票是怎样动态拆分的。假设有A旅客买了一张“广州-长沙”的票(一端为起点),那么票务库应当立刻取一张“广州-北京”的票将其一拆为二,一张是“广州-长沙”,卖给A旅客,另一张是“长沙-北京”,保存到车票库里。假设有B旅客买了一张“武汉-郑州”的票(中间段),那么票务库应当立刻取一张“广州-北京”的票将其一拆为三,一张是“武汉-郑州”,卖给B旅客,其余两张“广州-武汉”及“郑州-北京”的票则保存到车票库里。实际在拆分时还会涉及到很多优先级算法,例如旅客要买短途票,那么系统是优先拆长途车票、还是优先拆短途车票?旅客要买长途票,但车票库里已经没有符合条件的长途票,只有一些很零碎的车票了,那么能不能把几张很零碎的车票拼起来卖给旅客?……诸如此类,要考虑很多细致的算法,这样才能保证将尽可能多的车票卖出去,降低列车座位的空座率,减少浪费。
而道路客运刚好相反,(1)立足本市建设道路客运售票系统,只要把本市的汽车站和票务资源收录其中即可。(2)单次运输载客人数较少。一般大型客车的核载人数不超过45人,比火车动辄数百上千人要少很多。交通运输部门对营运车辆的超载行为抓得很严,车站卖票不可能卖的比座位数还多。(3)路途长短不一,有省际客运,也有省内客运,但多数都是直达车,经停某站并上下客的比例很少。所以每辆车的车票数量是有限的(不超过核定载客数),车票的起讫站是固定的并且起点站均为本市客运站,客车票是静态的,根本不需要拆分和动态生成,完全可以在售票之前由系统自动生成好。
从以上业务需求中我们可以看出来,集中式的铁路客运售票系统要比分布式的道路客运售票系统,在系统设计上要复杂的多。而且这些让人一看就头大的业务需求,显然使用集中式架构进行开发的工作量要稍小一些。现在我们假设12306.cn是采用道路客运那样每个市建一个数据库,那实现起来要考虑的问题就太多了!除了程序算法以外,还必须要考虑全国三四百个城市中的数据库与12306.cn的联网问题。最起码要搞一个“部省联网工程”吧,光是这一个工程建设就得两三年。连上之后,出于对实时性的考虑,售票系统必须要能实时连接全国这三百多个数据库,旅客买一张票,售票系统就得立即连接到始发站所在城市数据库进行操作,拆分生成的新车票还要插入另一个始发站城市数据库,这些城市数据库跟12306.cn之间的网络链接是否可靠?带宽及性能如何?
如何保证事务一致性?网络通道的安全性如何?……很多现实的技术问题从一开始就摆在所有人面前,工程竣工遥遥无期。所以为了系统能尽快上线,选择集中式架构进行建设,可能也是迫不得已的一种选择。
很多人拿“双11”期间的淘宝、京东、腾讯等平台跟春运期间12306.cn比,并以此为依据批评12306.cn铁老大作风,这里我要替12306.cn说一句公道话。众所周知,淘宝、京东、腾讯等电商平台从最初上线发展到今天,都已经有十余年的历史了。十年前它们最初上线时根本没多少用户量,系统里可销售的商品数也有限,那个时候也没有什么“双11”和“秒杀”的概念,它们都是从小到大一点一点逐渐成长起来,数据量级也都是从万级到百万级再到亿级这样一步一步走过来的,历史留给了他们不断向上、不断完善的时间。但12306.cn没有,几乎是从它诞生那一刻起,就面对了全国的用户,没有一个逐渐发展的过程。并且电商平台也没有这么动态分分合合的复杂业务逻辑,一件商品与另一件商品数据之间几乎没有关联,数据量虽大,但可以采取各种技术手段将其水平拆分,分布到多台服务器上。所以拿电商平台与12306.cn直接比较,对后者而言并有失公平。尽管如此,12306.cn仍然要努力加快自身的改造,毕竟这个平台关系到广大旅客的切身利益,人民群众热切盼望你们能够超常规发展啊!
那么12306.cn的架构有没有可以优化的地方呢?有,具体如何优化,请看下文《原创:谈谈12306铁路客运售票系统的架构问题(三)》。