如何建设一个靠谱的火车票网上订购系统

  

  昨天,2012年1月11日,网友 @fenng 写了一篇文章,批评铁道部火车票网上订购系统,http://www.12306.cn [1]。同时在新浪发了一条言辞激烈的微博,“去你妈的‘海量事务高速处理系统’”,引起热议 [2]。

  春节将到,大家买不着车票,赶不上大年三十与家人团聚,急切心情可以理解。但是拍桌子开骂,只能宣泄情绪,解决不了实际问题。

  开发一套订票系统并不难,难在应对春运期间,日均 10 亿级别的洪峰流量。日均 10 亿级别的洪峰请求,在中国这个人口全球第一大国,不算稀罕,不仅火车票订票系统会遇到,而且电子商务在促销时,也会遇到,社交网站遇到新闻热点时,也会遇到。

  所以,能够在中国成功运行的云计算系统,推广到全球,一定也能成功。但是在美国成功运行的云计算系统,移植到中国,却不一定成功。

  如果我们能够设计建造一套,稳定而高效的铁路订票系统,不仅解决了中国老百姓的实际问题,而且在全球高科技业界,也是一大亮点,而且是贴着中国标签的前沿科技的亮点。

  于是软件工程师们献计献策,讨论如何改进 12306 网上购票系统 [3]。其中比较有代表性的,有两篇 [4,5]。

  网友的评论中,有观点认为,[4] 利用“虚拟排队”的手段,将过程拉长负载降低,是网游的设计思路。而 [5] 利用缓存技术,一层层地降低系统负荷, 是互联网的设计思路。

  个人认为,[4] 和 [5] 并不是相互排斥的两种路线,两者着重解决的问题不同,不妨结合起来使用,取长补短。下面介绍一下我们的设计草案,追求实用,摈弃花哨。抛砖引玉,欢迎拍砖。

  

  图一。12306.cn 网站系统架构设想图。

  Courtesy http://i879.photobucket.com/albums/ab351/kan_deng/12306.png

  图一是系统架构图,典型的“展现层”/ “业务层”/ “数据层”的三段论。

  用户接入有两类,一个是运行在电脑里的浏览器,例如 IE,另一个是手机。

  无论用户用电脑浏览器,还是手机访问 http://www.12306.cn 网站,用户请求首先被网站的负载均衡器接收。负载均衡器连接着一群门户服务器,根据各个门户服务器的负载轻重,负载均衡器把用户请求,转发到某一相对清闲的门户服务器。

  门户服务器的任务类似于收发室老头儿,它只读每个用户请求的前几个 bytes,目的是确定用户请求的类型,然后把请求投放到相应类型的队列中去。门户服务器的处理逻辑非常简单,这样做的好处,是让它能够快速处理大批量用户请求。

  根据 [5] 的分析,12306 处理的用户请求,大致分为三类,

  1. 查询。用户订票前,查询车次以及余票。用户下订单后,查询是否已经订上票。

  2. 订票,包括确定车次和票数,然后付款。用户付款时,需要在网银等网站上操作。

  3. 第一次访问的用户,需要登记,包括姓名和信用卡等信息。

  三类请求的业务处理过程,被分为两个阶段,

  1. 运行于缓存中的任务队列。设置队列的目的,是防止处理过程耗时太长,导致大量用户请求拥塞于门户服务器,导致系统瘫痪。

  2. 业务处理处理器,对于每一类业务,分别有一群业务服务器。不同业务的处理流程,各不相同。

  

  图二。12306.cn 网站查询和订票业务流程设想图。

  Courtesy http://i879.photobucket.com/albums/ab351/kan_deng/12306-1.png

  图二描述了查询和订票,两个业务的处理流程。登记业务流程从略。

  查询的业务流程,参见图二上半部,分五步。这里有两个问题需要注意,

  1. 用户发出请求后,经过短暂的等待时间,能够迅速看到结果。平均等待时间不能超过 1 秒。

  2. 影响整个查询速度的关键,是“查询服务器”的设计。

  查询任务可以进一步细化,大致分成三种。

  1. 查询车次和时间表,这是静态内容,很少与数据库交互,数据量也不大,可以缓存在内存中。

  车次和时间表的数据结构,不妨采用 Key-Value 的方式,开发简单,使用效率高。Key-Value 的具体实现有很多产品,[5] 建议使用 Redis。

  这些是技术细节,不妨通过对比实验,针对火车票订票系统的实际流量,以及峰值波动,确定哪一个产品最合适。

  2. 查询某一班次的剩余车票,这需要调用数据库中不断更新的数据。

  [5] 建议把剩余车票只分为两种,“有”或“无”,这样减少调用访问数据库的次数,降低数据库的压力。但是这样做,不一定能够满足用户的需求,说不定会招致网友的批评讥讽。

  [4] 建议在订票队列中,增加测算订票队列长度的功能,根据订票队列长度以及队列中每个请求的购票数量,可以计算出每个车次的剩余座位。如果 12306.cn 网站只有一个后台系统,这个办法行之有效。

  但是假如 12306.cn 网站采用分布式结构,每个铁路分局设有子系统,分别管理各个铁路分局辖区内的各个车次。在分布式系统下,这个办法面临任务转发的麻烦。不仅开发工作量大,而且会延长查询流程处理时间,导致用户长久等待。

  3. 已经下单的用户,查询是否已经成功地订上票。

  每个用户通常只关心自己订的票。如果把每个用户订购的车票的所有内容,都缓存在内存里,不仅非常耗用内存空间,内存空间使用效率低下,更严重的问题是,访问数据库过于频繁,数据量大,增大数据库的压力。

  解决上述分布式同步,以及数据库压力的两个问题,不妨从订票的流程设计和数据结构设计入手。

  假如有个北京用户在网上订购了一套联票,途经北京铁路局和郑州铁路局辖区的两个车次。用户从北京上网,由北京铁路局的子系统,处理他的请求。北京铁路局的订票服务器把他的请求一分为二,北京铁路局的车次的订票,在北京子系统完成,郑州铁路局的车次在郑州子系统完成。

  每个子系统处理四种 Key-Value 数据组。

  1. 用户ID:多个 (订单ID)s。

  2. 订单ID:多个 (订票结果ID)s。

  3. 订票结果ID: 一个 (用户ID,车次ID)。

  4. 车次ID:一个(日期),多个 (座位,用户ID)。

  北京订票服务器完成订票后,把上述四个数据组,写入北京子系统的数据库,同时缓存进北京的查询服务器,参见图二下半部第6步和第7步。

  郑州订票服务器完成订票后,把上述四个数据组,写入郑州子系统的数据库,同时缓存进北京的查询服务器,而不是郑州的服务器。

  让订票服务器把订票数据,同时写入数据库和查询服务器的缓存,目的是让数据库永久保留订票记录,而让大多数查询,只访问缓存,降低数据库的压力。

  北京用户的订票数据,只缓存在北京的查询服务器,不跨域缓存,从而降低缓存空间的占用,和同步的麻烦。这样做,有个前提假设,查询用户与订票用户,基本上是同一个人,而且从同一个城市上网。

  但是这里有个缺陷,某用户在北京上网订了票。过了几天,他在北京上网,输入用户ID和密码后,就会看到他订购的所有车票。可是又过了几天,他去了郑州,从郑州上网,同样输入用户ID和密码,却看不到他订购的所有车票。

  解决这个缺陷的办法并不麻烦,在用户查询订票信息时,需要注明订票地点,系统根据订票地点,把查询请求转发到相应区域的子系统。

  另外,每次订票的时候,网站会给他的手机发送短信,提供订票信息,参见图二下半部第8步和第9步。

  以上是一个初步设计,还有不少细节需要完善,例如防火墙如何布置等等。这个设计不仅适用于单一的集中式部署,而且也适合分布式部署。

  或许有读者会问,为什么没有用到云计算?其实上述架构设计,为将来向云计算演变,留下了伏笔。

  在上述架构设计中,我们假定每个环节需要用多少服务器,需要多大容量的数据库,预先都已经规划好。但是假如事先的规划,低于实际承受的流量和数据量,那么系统就会崩溃。所以,事先的规划,只能以峰值为基准设立。

  但是峰值将会是多少?事先难以确定。即便能够确定峰值,然后以峰值为基准,规划系统的能力,那么春运过后,就会有大量资源冗余,造成资源浪费?

  如何既能抗洪,又不造成资源浪费?解决方案是云计算,而且目前看来,除了云计算,没有别的办法。

  Reference,

  [1] 海量事务高速处理系统。

  http://www.douban.com/note/195179318/

  [2] 去你妈的‘海量事务高速处理系统’。

  http://weibo.com/1577826897/y0jGYcZfW

  [3] 火车订票系统的设想。

  http://weibo.com/1570303725/y0l9Y2mwE

  [4] 铁路订票系统的简单设计。

  http://blog.codingnow.com/2012/01/ticket_queue.html

  [5] 铁路订票网站个人的设计浅见。

  http://hi.baidu.com/caoz/blog/item/f4f1d7caee09b558f21fe780.html

  题图来自 Designyoutrust

作者:邓侃 美国卡内基梅隆计算机机器人专业博士

http://blog.sina.com.cn/s/blog_46d0a3930100yc6x.html

时间: 2024-10-05 22:42:41

如何建设一个靠谱的火车票网上订购系统的相关文章

建设一个靠谱的火车票网上订购系统

昨天,2012年1月11日,网友 @fenng 写了一篇文章,批评铁道部火车票网上订购系统,http://www.12306.cn [1].同时在新浪发了一条言辞激烈的微博,"去你妈的'海量事务高速处理系统'",引起热议 [2]. 春节将到,大家买不着车票,赶不上大年三十与家人团聚,急切心情可以理解.但是拍桌子开骂,只能宣泄情绪,解决不了实际问题. 开发一套订票系统并不难,难在应对春运期间,日均 10 亿级别的洪峰流量.日均 10 亿级别的洪峰请求,在中国这个人口全球第一大国,不算稀罕

网上订购能否解决火车票“一票难求”?

本报记者 蒋秀娟 打破砂锅 近日,铁道部与中国银联在北京签署战略合作协议,这意味着用手机.电话.互联网.自动售票机等新兴支付方式买火车票将成为可能.铁道部财务司副司长刘洪润对外表示,今年有望实现网上购票.请关注-- 随着"两节"的临近,火车票又开始出现"一票难求"的局面.而不久前,铁道部运输局综合部主任李军对外透露,铁路网络订票项目已进入实质性推进阶段,今后所有铁路客票都可以在网上销售,铁路系统也会出电子票,像民航机票一样,人们可以直接从电脑打印出来拿电子票乘车.

B2C购物网站网上支付系统建设要素

1.支持多种付款方式 对于B2C销售网站来说.面对的消费者在互联网上,而互联网突破地域的特点使得消费者可能来自五湖四海,他们的购物心理和支付习惯也是多种多样的.例如在美国,网上直接信用卡购物非常普遍,在日本很多人习惯手机支付,而在中国则习惯于使用借记卡.在第三方支付的偏好方面也会有所不同,如美国喜欢使用PayPal,欧洲人喜欢使用MoneyBookers,中国人喜欢使用支付宝.又如,对于某些区域市场的B2C网站,他们经常自己组织物流,采用货到付款的方式,对于某些提供金额较大的商品或提供批发业务的

网上考试系统编制中的随机抽取试题的四种算法

算法|随机 因为教学的需要,我决定编写一个asp+ms sql2000的网上考试系统,其功能主要为:实现判断题.单项多项选择题和填空题的在线自动答题.改卷:并将学生的错误答案记入数据库,供教师分析.在编写从题库中随机抽取试题这一模块的算法上,却颇费了一番周折,现将解决过程记录如下,以供大家参考. 为了便于说明问题,文中提供的代码中的变量pd为从题库中要抽取出来考试的试题数量,数据库表名与字段名我都使用了中文,并仅以判断题为例. 算法一 由于不知道如何实现从题库中随机抽取试题的sql语句,我在网上

php-一个较老的PHP网上购物系统有大神帮我调一下吗有重酬

问题描述 一个较老的PHP网上购物系统有大神帮我调一下吗有重酬 好头疼啊,因为太老了很多代码都没有配置好,麻烦大神帮我一下下应该不需要费多少时间的,Q464337528

购物网站的网上支付系统解析

一.购物车和付款系统 对于一个购物网站来说,网上支付系统就是给消费者提供的不同付款方式所组成的方便消费者支付的系统.网上支付系统的不同支付方式通常集成在网站购物流程的最后一个页面,也就是支付页面上.这些支付方式一般有第三方支付.银行汇款.支票.货到付款等.普通的购物网站支付流程如图1所示. 具体功能模块描述如下. 1.购物车(Cart方式):在产品订购页面上,选择产品,点击链接购买,则此产品就被放到了购物车内,弹出窗口显示当前购买情况.在购物车里允许随时对购物车内的产品数量进行增.删.改. 2.

程序员怎样才能找到一个靠谱的创业公司

现在移动互联网已经进入了下半场,虽然是下半场,但是移动互联网的前途还是光明的,但是今年所谓的"资本寒冬"让大部分创业公司举步维艰,步履艰难,很多创业公司在此时此刻原形毕露,问题凸现,以至于纷纷倒闭.程序员是我们互联网发展的主力军,乃至中流砥柱,选择一个靠谱的创业公司不仅有利于拓展自己的能力,还能使我们更加全面乃至全栈.那该如何选择一个靠谱的创业公司呢?我认为需要从以下几点来判断. 项目前景 面试公司之前,要首先从网上搜集该公司有关的新闻和资料,大致了解一下公司所做的项目,面试的时候和经

火车票网上预售仅在上海试行:暂不惠及北京

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 晨报讯 (记者 陈琳) 铁路部门首次推出火车票网上预约售票,昨天11点至20点,登录中国铁路客服网站(www.12306.cn)可预约国庆黄金周期间上海-武汉.郑州.南昌.成都等方向的42趟列车的车票.记者从铁路部门获悉,这一预约方案只在上海地区部分线路试行,暂时不涉及北京地区. 铁路部门表示,此举是为了避免高峰期网上购票登录难等情况.记者登

中小企业和个人如何快速建设一个外卖订餐网站

中介交易 SEO诊断 淘宝客 云主机 技术大厅 如今,方便快捷的网上订餐成为"上班族"叫外卖的新时尚,网上订餐业务也逐渐流行起来.随着互联网的影响日益深远,传统餐饮服务业有向与互联网相结合的方向发展.目前红火的网上订餐,让不少人红了眼,部分餐饮人士跃跃欲试,都想加入这一新潮业务模式之中.一些实力强大的餐厅聘请专业的网络技术员重金打造网上订餐平台.那么一些中小企业及想投入网上送餐业务的个人如何快速建设起自己的外卖订餐网站来呢? 要建设一个外卖订餐网站,首先要了解一下外卖订餐网站的组成.外