12306 火车订票网站的改进方案(专家讲解)
我在这里抛砖引玉啊,纯yy,不喜勿拍砖。
很多人都在讨论这个订票系统,但是其实大部分讨论的人都不了解这个系统的需求有多大,比如有多少班次,多少票,然后多少人订票,还有就是有没有黄牛,有没有人恶意刷票等等具体的数据大家都不关心,就关心一个所谓的流程。我们应该明白,就算很简单的问题,如果规模乘以一亿倍,要求你一秒钟解决,那你也会很头痛。所以具体的数据应该先了解好,才能做分析,这才是合理的。而不是一下子就套自己的想法进去。
第二,很多人也不了解铁道部设计的网站的流程是什么。既然如此,怎么能够发现他的问题所在呢?怎么能够通过对比来说明你的方案更加优胜呢?所谓没有调查就没有发言权,很多人都不了解这个道理。
不幸的是,本人还是执意要yy,见笑啦。
这个系统的难点在于高度并发,并且有资源的冲突。假设想订票的人是实际座位的3倍,而有些人又要求要坐什么豪华座,什么卧铺,这样可能会导致局部的冲突达到7,8倍,而那些买不到票的人,又会继续抢下一班的火车,结果就越滚越大,越来越挤,可能到最后几十人抢一个座位,这里面的冲突判断够复杂的。
座位只有一个,再多人抢也只能满足一个人,所以人数多少没影响,关键是要站在售卖者的角度,管你谁买到票,我卖出去就行了,不服气又怎样!谁让票少人多呢。因此我设想,应该反客为主,你们想订票可以,说说你想定去哪里的票,有什么特殊要求,如果我满足不了,你有什么备选方案,等客户都写清楚了,我再来慢慢发票,随机抽取其中一个幸运者。
我想大部分订票的人,首先是要求要回去某某地方要求某个时间段,其次是要求某某列车,再次是要求某种等级的座位,然后是某某车卡,要求联票之类的。我是卖票的,才不管你有多少要求,我就根据我自己的情况看看能不能分配给你,分配不了就请你坐飞机,不要来烦我。
假如有3亿人需要做火车,我只有1亿的座位,那么很明显,就是清理2倍的人出去而已,并不会演变成几十人抢一个座位的复杂情况。当然有些人最后系统给他分配了票,他又不喜欢,不想付钱,那么我就可以把它拉进黑名单,然后将剩余的票继续卖给其他人。
我这个方案的好处就是,我不检测到底有没有票,我只负责登记你的意愿,等我登记的差不多了,我再序列化的处理一批出票程序,通知你回来交钱,不交钱我就拉你进黑名单,让你失去继续买票的资格。这样可以持续的降低规模,同时简化系统的检测和出票流程。
-------------------------------------------
补充一下:
当前订票系统的问题在于它是基于乘客抢票的,也就是先到先得,每一个乘客都要经过一系列的判断逻辑,避免冲突等等,这个有点类似淘宝的秒杀活动。秒杀活动设计的目的就是让客户去争夺,这样有商业因素的考虑。而火车票不需要这种炒作,火车票对于所有想买的人来说,都应该是机会均等的,不是你先来一秒钟就是你得,而是抽签大家看谁中奖。现实生活中,我们无法做到这种公平性,因为不经济,而恰恰相反的事,在网站中这种公平性反而更加经济。
当然也不可能等所有人都填好表格再出票,而是有秩序的分配出票的时间点,比如半个小时出一次票,那些填写好意愿的客户,我们提醒他不要刷新,耐心等待,以免加重服务器的负担。而没有填写的可以继续填写,用来做下一次出票的准备。
假设第一次出票时一千万,那么还有2.9亿的客户在准备填写意愿,一千万客户在等待刷新。这一千万出票后,如果有8成满意,进去对应的付费流程,其余两百万合并在未分配票的队伍中,而8成买票中又有10万人以各种原因没有买到票的,放到错误处理队列中。一轮处理后,那么这种问题就缩小了。
重复这个流程,问题会越来越小,而我们可以控制处理问题的规模,应对复杂的环节(比如网上支付),比如一次出一千万的票,还是一百万的票,根据系统负载进行设定。