论坛首页 Java企业应用论坛

火车订票系统设计

浏览 6474 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (4) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-01-19   最后修改:2012-01-19
呵呵,我花了2个小时终于买到票了!
痛恨之余我也在考虑如何建立铁路售票系统,以下是我一些分析,见笑了!

一切系统设计从业务出发:

1、铁路售票系统极限压力极大(春节、10.1等期间),而平时压力并不大。所以我们还是建立廉价且可插拔水平扩展的系统,这样就不用平时也维系这样庞大的系统;

2、售票业务本身并不是很复杂,主要包括注册、登录、查询车次、查询订单、买票(预订票、确认支付并订票、发邮件短信);

3、业务量大小依次可能是买票(系列),查询车次,订单,登录,注册等。但春节期间瞬间访问量是几万甚至10W,所以确保处理这样的系统,单从技术角度将是比较困难而且费用很高。

4、业务中最重要是买票(系列)业务,所以必须要保证买票中预订、支付、确认的事务性,这样不仅提高软件效率,也提高客户体验度,否则发生一系列后续不必要的业务压力(退钱、重复购买、重复支付、重复确认,重复查询等等)!


比较理想的方案:有序、有效的排队处理所有业务。
排队系统:--春节时期启用
1、访问买票网站,填写姓名和手机后,提示用户排队,并等待手机通知。将这一信息以手机号码Hash值保存到内存缓存中(Memcache redis等),有过期限制,不允许重复登陆,可以控制队列长度;
2、但队列处理到当前用户时,给用户手机发送授权码,用户凭此完成登录,买票等一系列操作。
3、当用户完成买票时,退出系统,并且在队列中清除该信息。
4、其实,排队系统也是一个可插拔、水平扩展的系统,能实现负载均衡、failover等功能。
买票系统:--处于一个完全可控的状态
1、由于排队系统,后端的买票系统不会出现超过容量的访问,所以对他的设计是简化了很多,游刃有余!
2、设计可水平扩展的系统,便于在分布式扩展:缓存技术和异步技术(邮件通知等)--具体参见方案二
3、确保买票(系列)业务的事务性,提高效率和客户体验度。

方案二:极致的海量数据处理方案--构建分布式、水平扩展的系统
任何系统都是妥协需求和设计的结果--我们不太可能设计出简单、功能超强、不出错、廉价且能满足任何极限情况的系统。我们要处理的技术问题是:超大访问导致的超大业务处理能力,超大访问导致的数据库处理能力跟不上。我们的技术手段有分布式集群服务、缓存、业务水平分割和异步;
1、分布式集群服务:最简单的的方式就是硬件--F5等设备(当然也可以采用LVS),由于购票业务相对简单,可以把前台服务功能在一个Application中完成,这样扩展集群服务也相对简单--加大开启新一台服务器,不过还是可以在软件结构上做一定的改进。
2、缓存和水平分割
a、对象--12日内所有火车、时间、站点信息(要处理成数字化),大致是5000趟火车*12天*2000座位(一列火车)和区间是否已订信息,对于Memcache也应该是不大的。
b、使用--依据站点和时间查询车次和余票情况;买票时先锁定本Memcache,进一步提交给Oracle RAC完成真实买票动作,完成后async同步所有Memcache服务器。
c、水平扩展--开启新一台Memcache,注意需要实现在线变更Memcache集群并通知LoadBalance设备。
3、异步
a、异步Memcache同步。
b、异步的买票成功通知--邮件和短信。
4、Oracle RAC--还是值得使用的,尤其是巨量访问情况下,保持稳定和安全,不过交给DBA吧。
   发表时间:2012-01-21  
LZ没有考虑原有的售票系统的兼容问题,就是原来的所谓的“网络售票系统”,就是那个火车站售票窗口和代售点的原有系统,这个应该是在另外一套网络中(肯定不在互联网上,而且肯定数据都会在原有系统中,是基于Sybase的,这个可以从度娘查出来),怎么搞定两个系统的互联互通通讯?
0 请登录后投票
   发表时间:2012-01-27  
售票系统的复杂度基本上没有点到
0 请登录后投票
   发表时间:2012-01-29  
楼上的有点激动,别人写的不对,你怎么不写一个出来,
我决定楼主的手机信息排队还是可取哦,
0 请登录后投票
   发表时间:2012-01-29  
排队还是不错的,把紧缺的资源独立出来,比如售票接口什么的,做个线程轮询或等待就可以了,其他具体的资源,用于排队上的,慢慢设计就可以了,把写锁那些关闭掉,该缓存的缓存,该优化的优化,尽量协调就可以了,毕竟谁没事都整个和淘宝那种一样前台到后台上万台服务器,结构和架构超复杂的系统是不现实的。能顶过去就可以了
0 请登录后投票
   发表时间:2012-01-30  
我觉得改进订票系统没什么用,如果不增加火车,降低高铁票,不管你怎么优化购票系统,tmd就是没有票。

交通工具有多种,铁路,大巴,飞机,自驾,要拓展多种交通渠道,分流春运回家的人群。

假如现在每天有4列火车,总共才这么多张票和站票,优化网站有个屁用啊,只不过是谁坐票,谁站票,谁晚回去,谁回不去呗。

万恶的铁道部。
0 请登录后投票
   发表时间:2012-01-30  
排队的建议很不错,魔兽世界服务器压力大的时候就采取的这种措施。
0 请登录后投票
   发表时间:2012-01-30  
改变经济布局,平衡地区经济,不要让太多的人都流入到北、上 、广为核心的地带可解决人和物资运输、电力传输等各方面的瓶颈问题。

问题不在于增加铁路运力,而是在于改善经济的布局结构。专为出口打造的经济模式,发展过头了就是卖国。
0 请登录后投票
   发表时间:2012-01-30  
ltian 写道
改变经济布局,平衡地区经济,不要让太多的人都流入到北、上 、广为核心的地带可解决人和物资运输、电力传输等各方面的瓶颈问题。

问题不在于增加铁路运力,而是在于改善经济的布局结构。专为出口打造的经济模式,发展过头了就是卖国。


说的好!
0 请登录后投票
   发表时间:2012-01-31  
没有新意,其实就是中央缓存+数据库集群+服务器集群,老套
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics