请别总是站在程序员的角度思考问题!!!谈优化12306网站!!!<转载>

             这几天各大站几乎都围绕着一个很好玩的命题,即12306的优化。CSDN,园子里,51CTO很多地方的大牛们都给出了‘优化方案’。说的最多的还是‘分布式’,‘海量访问’.....  等等。

            本来我也同各位菜鸟一样抱着学习的心态板着板凳来围观各位大牛们的解答。可今天在CSDN上看到这篇文章,却有着严重的被骗的感觉。

            原来12306最大的问题不是什么海量访问或者还不让人想吐的界面,而是业务流程。只要简单的改变业务流程才是解决12306网站访问的最终解决之道。

            个人感觉作者也不是啥技术大牛,只是一个长期要买火车票的码农。

            我突然觉得,任何好的作品,那些‘架构师’的夸夸奇谈往往就是狗屎。一个好系统一定要站在用户的角度思考问题。尽量多用普通使用者的角度思考问题,而不是程序员的角度。

 

         ----------------------------------------------------------------------------------------------------------------------------------------------------------

 

不知道是前台问题还是后台系统的问题。原来只是售票点加火车站,对于后台来说现在量急剧上升,做好改造了吗?

再说网站的问题,老早就想说了,元旦前第一次网购买票的时候就想说了,今天上csdn来就写出来分享一下,不过没准已有人发表了。当时看到锁定30分钟提示的时候,仿佛就看到一个让我觉得可以让系统必定垮掉的问题----一个业务级别的超级长的事务!!当时看到网站的做法是下订单就把票先锁定,然后再付款,超过30分钟不付款再把座位返回,愚蠢的是,为了减少购票不成功导致退票的问题,铁道部把解锁时间由原来的30分钟改为45分钟,目前很多人是第一次网购,对网银支付还不熟悉的情况下,这就导致更多的人更长地处于等待状态,不断刷新,需要更多的系统处理。还造成另一个跟严重的问题,就是有大量的票被网站锁定,火车站都买不了,我的这第一次也是目前唯一的一次网购经历就是去售票点买不了,去火车站买,被告知票都被网络锁定了,只能去网站买,于是立刻用手机当网络马上拨号,花了半小时才买到。但是,这锁定的做法对去火车站的极为不公平!电脑可以重新刷新,火车站可不能让你一直占用队列重复刷新啊,就算你愿意重新来,那也得回到队尾重新排啊!

建议去掉锁定机制,改为付款成功才出售座位,与售票点同样的地位就可以了。想到的一种简单方法就是可以让大家先冲值到网站,如果冲完发现没票,则允许转出,如有票,则直接用网站余额购票,就不需要先锁定操作,由于少了锁定时间,很明确当时是否有票,不会存在一会票被锁定,等待超时再放票出来这样重复的事情。这样的话,自然就减少大量pv,而且客户体验会好不知道多少倍。

现在的问题是,好像没看到过银行提供联机转回的功能,转回去都是批量的,但如果用批量的,必然造成普通百姓不理解,但我想这还是值得,以铁道部的风格,不需要大家的理解,也不需要解释,说15天退就是15天,更何况如果批量,可能也就一两天就退回了。所以以更多的退款换来更好的客户体验和更小的系统压力完全值得!而如果不废除这种机制,再加硬件,再并发,算法再优化也是白费劲。

 

----------------------------------------------------------------------------

2012.1.8 补充总结一下,具体就是把订单锁定机制取消,流程就是:

 
1、下单选车次,给出需要交费的金额,转入缴费界面进行冲值,但此时不锁定任何座位。
2、用户缴费完成,再去确认订单,扣冲值的钱同时把座位分配给他。(量大的话可以批量,按缴费时间先后看看都有哪些客户成交)
3、对于缴费完,但由于时间比较晚的,买不到票的情况,允许他把冲值的钱做转出请求。(你们可以晚上批量转出给银行,第二天就能回到客户银行卡上了)
 
这样好处很明显,不再需要锁定,付款和退款是一个模块,而且可以提前完成,压力就分散掉了。而分配座位是一个模块,可以短时间而且可以批量完成。流程清晰,系统压力小,客户体验好。

 

这么简单的业务流程不优化,搞什么海量啊分布式啊,什么高并发,什么数据库啊软件啊,都是浮云。别被这些自己都没买过票的,惯性思维的所谓技术大牛们给骗了。

-----------------------------------------------------------------------------

2012.1.8 晚 ,再给大家补充两种图吧,形象一点,不过我不是铁道部的,所以图只用于表示我的意思,不一定完全准确。从图上也可以看到其实修改的东西不多,改的很容易但我想效果是看得见的。

 

现有购票流程图:因为先锁定,所以大家都要等着是否还有没支付成功的退回来的,剩下一点点就跟秒杀似的,搞死你系统。而且一旦锁定,连火车站都没得买了,因为售票窗口可不能一直刷新,他必须处理其他人的买票要求,这就导致在票没有完全卖完的情况下,可是在火车站就是买不到票了。

 

我建议的流程图,可以看到去掉了现有流程中的锁定操作,就不会出现票被网上锁定(实际又没卖出去)。买的时候有就有,没有就没有,大家就不会狂刷网站。支付的时候还可以慢慢来,一点都不急,这样你就可以选择任何空闲时间段来先进行下单支付(当然要提前几日的,不然票没有了就没了)。而且在出票阶段,可以用批量,还可以选择各种优先策略,比如车站优先多少,之类的,以起到公平的作用,因为这个时候就是纯出票,处理逻辑很简单,业务就可以更灵活,性能就可以更好。

 

 

 

 

原文地址http://blog.csdn.net/dragonimp/article/details/7184319

 

----------------------------------------------------

写了这么一大堆,突然想到那句话“也许一个复杂问题的解法简单得出乎意料”。
所以我也厚颜无耻地提个我认为可能的解决方法,关键词是身份证实名制、配额。
1. 可以提前一个月或两个月(比如11月1号开始,11月31号截止。所订购的车票必须是12月15号到2月15号之间的),让大家在线提交订票申请,比如我要订一张上海到北京的1月28号的学生票。但是这样可能会导致某段时间客流量超载,所以系统在收集订单后,对订单进行分析处理(比如一周时间),然后得出一个优化的调度方案,当然如果某些天的客流量实在太高,可以给某些人发邮件,提供调到其他天的要求。如果客户接受最好,不接受的话那就通过传统渠道去买票吧。
2. 根据第一步收集整理分析得到的数据,铁道部发票,客户凭借身份证在发车前领取车票即可。
当然最核心部分是调度算法。必须保证不能满足某些客户的订票要求时得及时邮件通知。这种方案的优点显而易见有:
1.一定程度上遏制黄牛党的盛行
2.只要有身份证,基本能保证春运期间买到票
当然传统的购票方案作为辅助以应对其他一些偶然性、突发性的乘车问题。

posted @ 2012-01-08 22:35  银光小子  阅读(5816)  评论(54编辑  收藏  举报