关于铁道部网站的业务流程改进建议,可减少大量并发请求。

 原帖内容进行了整理,请访问:http://blog.csdn.net/dragonimp/article/details/7184319

以下内容为原贴本来的内容,仅留存,不开评论。要评论请阅读原帖整理的内容后再发表看法。 

 

原文标题:铁道部网络购票网站存在的一个大问题----一个大大的事务!!!  

 

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

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

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

 

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

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

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

 

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

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

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

 

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

 

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

 

 

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

一些问题的解释:

1、关于事务/锁。我承认这个标题那是标题党的做风,但意思只是业务级的"事务"。但从来没有说他们实现用真的数据库事务或锁去锁这个,我想天下没有一个SB会这样做。俺也是写程序的,不会SB到认为铁道部用数据库锁去锁定这条记录或者整个过程是一个数据库事务,就是想要做成数据库的事务,还真不知道这么多页面跨下来怎么实现呢,你们谁见过或实现过?
2、充值的问题。这只是一个概念思路。你可以说是对这个订单进行支付,而不是提前充值。只是在流程上换个位置而已。原来是"出票-支付-不成功退票",现在是"支付-出票-不成功退钱"。注意,现在的锁定你可以看成是出票,因为占据了额度了,效果一样,只不过等会可以退票。
3、这样做法是不得已,避免不必要的压力。因为如果每人只来一次的话,就没有必要在这边刷,系统压力小。现有做法肯定是“以客户为中心”来设计的,但导致了其他的逻辑问题和不必要的并发需求。有的人说如果有多少选择,会付了很多钱也买不到票,这个问题提得好啊。但你系统可以把这个单据标志为退款,同时这个钱退到网站“账户”,还可以直接用来定其他的单子,不需要再次支付啊,当然如果定上,这个钱就不用退了。办法总是有的,不要急于否定。
4、总的思想就是把不必要的访问都减少到最低,分散系统压力。昨天还没人关注,今天至少有人关注了,但不管是赞同还是批评,希望i大家都认真看好内容和我要表达的意思,然后再做评论。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值