从12306上线给广大网民带来了福音,我们足不出户就可以买到火车票了,而且实名制购票让票贩子失去了生存的土壤(至少是很大一批票贩子),但也引来了不少争议,一方面温州农民工上书国务院表示农民工网络购票难;另一方面网络购票推广到所有车次后,刚好赶上2012元旦高峰期,导致系统频繁宕机。关于网络购票的公平性问题已经引起了广泛的讨论, 作为互联网的技术从业人员,我这里想谈一下12306网站架构的问题,细数一下如果让我来设计,如何扛住元旦、甚至春节高峰期。
最新消息12306在全球的Alexa排名已经升至106位,在国内电子商务网站内排名11位,更有新闻报道1月1日-7日的日平均点击高达10亿次。
“本报讯 昨天是春运第一天,国务院新闻办公室举行新闻发布会,邀请国家发展改革委、铁道部、交通运输部、民用航空局等部门相关负责人介绍2012年春运形势。铁道部副部长胡亚东介绍,网络售票和电话订票每天已经达到了200万张,从1月1日至8日,网上订票“12306”网站日均点击次数超过10亿。”
2012年1月10日补充:12306网站硬件投资1685万
太极股份2011年中报披露,上半年公司签订了铁道部互联网售票系统等一批重要的行业信息化应用与服务项目。截至目前,公司只有12306网站这一个合同与铁道部有关,这1685.89万元就是该合同一期的金额。”太极股份董秘办人士向记者证实。
http://tech.sina.com.cn/i/2012-01-10/00266619782.shtml
面对这样的互联网需求,你会怎样做出设计决策呢?
一、需求分析
- 投资方:铁道部
- 承建单位:铁道部科学研究院
- 建设周期: 2011年6月1日正式上线,在高铁和动车购票上进行试运行;2011年12月上旬,全面推行网络售票,C字头城际、D字头动车、G字头高铁、Z字头直达、T字头特快以及K字头所有列车均可购买。
- 遗留系统问题:开放互联网售票之前,铁道部已经在全国范围内代售点和火车站联网售票;其他第三方系统接口(有网友提到网络购票系统实名制需要接入公安系统做接口进行身份认证)公安系统、网银支付系统等;
- 功能需求:用户注册、余票查询、车票预订、网络支付、取票;
- 非功能需求:注册用户数(1000万-1亿-10亿);每天发售车票(100万-200万,铁路每天的客运能力384万);可用性(购票期间稳定运行);安全性(保障用户资金安全);
- 客户特点:运力不足的现状导致:用户饥饿抢票,登陆不见去,我就不断地刷新页面,直到发现票已售完,一个人登陆不进去,就会发动10个亲朋好友一起帮助点击抢票,不怕买多了,就怕买不到;
如果不看最后一条的话,就是一个普通的电子商务网站,200万的日成交量充其量也就算是中型规模;但要是考虑最后一条需求的话,这个系统简直就是一个秒杀系统(日成交量200万的秒杀系统)。
面对这样的需求,你会做出怎样的架构决策呢?
二、分析设计
先来说说第三方接口:
1、公安系统接口
需求:用户在购买火车票时需要调用公安系统的接口,进行身份信息验证,屏蔽不合法的身份信息(如身份证和用户名不匹配),同时还能够帮助公安系统通缉犯罪分子,维护列车的治安。
这个接口调用会带来多大的压力?关键取决于调用的策略。
如果用户在提交订单时进行身份验证,压力如何?
考虑接口调用平均耗时1秒,公安系统能够支撑1次并发接口调用(仅仅为支持网络购票系统,需要隔离其他业务,避免购票系呕吐能够压力过大影响正常公安业务系统),那么公安系统可以为购票系统提供每秒1万次的身份验证请求。整体系统的最大处理能力将会限制的公安系统的处理能力。
如果订单处理的平均耗时也是1秒,那么每次订单提交耗时2秒,时间延长的一倍;
考虑到通过互联网订票的用户,身份信息99.9%以上都是正确的,那么为了识别不到0.1%的非法用户信息,需要系统增加一倍的处理能力。
如果在本地对公安系统的数据进行短期缓存,每次接口调用都直接查询本地缓存,避免跨系统接口调用,2台PC服务器每秒支撑20万接口调用不是问题。
如果将身份信息验证放到“添加常用联系人”呢?购票时根本不需要调用公安系统接口。
真的有必要调用公安接口么? 退一万步,如果用户采用非法的信息定到了票,他能在线下换到票么?考虑到逐步实行的实名制验票,他进得了火车站么?
2、网银支付接口
进入支付流程后,和网络购物并无太大差别,相信各大银行对自己的网银都很有信心。而且经过淘宝等电子商务企业多年的培养,尤其是双11等促销活动,网银支付系统支撑12306每天几百万的订单完全没有问题。
再来说说遗留系统的问题:
做软件的人都明白维护别人的代码要比重新写代码难得多;做系统解决方案的都明白,重新构建一套系统要比改造升级一套系统省心得多。这也正是个人比较担心的地方。
需求分析中提到,铁道部已经建立在全国范围建立了超过5万个代售点(660个城市,平均每个城市设立80个代售点), 全国联网售票系统已经运行多年。
那么互联网订票系统会不会是在原有系统上做了一次“封装 ”,就推向了公众呢?我不敢说是,因为12306网站的压力和访问方式在全国电子商务网站中是独一无二的,能在短短几个月的时间站在全球Alex排名106名,这个在世界范围内都是独一无二的;也很难说不是,因为面对网友的质疑:“你们做个系统的性能评估么?
你们做过系统的压力测试么?”,如果是系统化重构的系统,对每个环节面临的新的挑战和压力也会比较清楚,也就不会认为经过了动车组、高铁售票试运行后,就能自然而然地所有车次开放;就不会认为平时正常运行的系统,在元旦、春节全国客流高峰期能够扛住压力。
2012年1月13日更新:
清华王津的一篇《今天你买到票了吗?——从铁道部12306.cn网站漫谈电子商务网站的“海量事务高速处理”系统》http://blog.csdn.net/m13666368773/article/details/7191736,一石激起千层浪,现在sina微博上讨论热火朝天,除去不必要的谩骂,我还是看到很多业界大佬对系统设计的看法。
风云的bolog:《铁路订票系统的简单设计》提成ticket的排队思路,跟放翁在微博中提成的思路类似。
http://blog.codingnow.com/2012/01/ticket_queue.html#more
caoz的和谐blog:《铁路订票网站个人的设计浅见》
http://hi.baidu.com/caoz/blog/item/f4f1d7caee09b558f21fe780.html
摘:“很多人被10亿请求数吓到了,其实这里水分很大,最多的是重复刷新和外挂工具,那么如果你做到基于2的查询结果缓存化,这一步就简单了;直接参见这个文章 http://blog.sina.com.cn/s/blog_466c66400100bi2y.html 大量的用户重复刷新根本不是问题。 想知道实际效果,看这里 http://blog.sina.com.cn/s/blog_466c66400100cfrj.html 1小时20亿的刷新都不怕,还怕你一天10亿刷新? ”
这些都是干货,收下了,也看到自己设计的一些差距。加油!
分享到:
相关推荐
在设计12306的数据库时,可能采用了像PostgreSQL这样的高级数据库管理系统,利用其数组、范围类型等特性优化数据存储和查询。排他约束用于保证购票的唯一性,防止重复售票。大数据分析用于预测和优化流量,而广告...
基于python的12306网站抢票与GUI展示系统+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于python的12306网站抢票与GUI展示系统+源码,适合毕业设计、...
在12306网站的模拟设计中,JSONP允许客户端(浏览器)向不同源的服务端发送请求并获取数据,这对于构建分布式系统或Web应用是非常重要的。它的基本原理是服务端提供一个动态生成的JavaScript函数,并将需要的数据...
基于python开发的12306网站抢票系统+源码+开发文档+代码解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 项目简介: 通过阅读12306网站的源码和进行HTTP协议...
标题中的“12306Bypass.zip”表明这是一个与12306网站相关的程序或工具,可能是为了绕过某些限制或者优化购票体验而设计的。12306是中国铁路客户服务中心的官方网站,主要用于火车票的查询、预订和购买。在节假日或...
12306数据库系统设计报告主要探讨了中国铁路客户服务中心12306网上车票订票系统的构建,旨在提供便捷、快速且完善的在线订票服务。该系统设计涉及了用户需求分析、功能模块划分、数据库设计以及关键流程制定。 在...
12306标签则表明项目是围绕中国铁路12306网站的购票服务展开的,涉及到网络请求、数据解析、UI设计等多个技术点。 【压缩包子文件的文件名称列表】:"12306-master" 这个文件名通常代表了GitHub上的一个项目仓库,...
12306网站提供了RESTful API服务,我们需要根据官方文档或通过抓包工具(如Wireshark或Charles)来了解API接口的URL、请求方法(GET或POST)、参数以及请求头信息。通常,登录验证和请求身份信息可能需要使用到...
在深入探讨系统的技术细节之前,让我们先了解一下12306网站及其接口的重要性。12306是中国铁路官方售票平台,为旅客提供购票、退票、改签等服务。由于其庞大的用户基数和实时性需求,12306的余票查询系统需要具备...
【12306订票助手源码】是一款专门针对中国铁路客户服务中心12306网站设计的辅助购票软件的源代码。12306是中国铁路官方的在线购票平台,用户可以通过它来预订火车票、查询时刻表以及进行退票、改签等操作。12306订票...
基于Python的12306网站抢票与可视化系统的设计与实现+详细文档+全部资料(高分毕业设计).zip基于Python的12306网站抢票与可视化系统的设计与实现+详细文档+全部资料(高分毕业设计).zip 【备注】 1、该资源内项目...
【12306 抢票助手 - Java版】是一个基于Java编程语言开发的应用程序,设计用于帮助用户更高效地在12306中国铁路官网进行火车票预订。Java是一种广泛使用的跨平台编程语言,以其“一次编写,到处运行”的特性著称,...
12306订票助手合集是一组用于辅助用户在12306中国铁路客户服务中心网站上更高效地进行火车票预订的程序。这些助手通常由编程爱好者或者开发者编写,旨在解决12306官网在高峰期可能出现的访问拥堵、抢票困难等问题。...
本项目“模仿12306火车票APP”是基于微信小程序平台,为开发者提供了一整套源码,旨在帮助他们创建类似中国铁路12306官方APP的用户体验,让用户能够方便地查询、预订火车票。 1. **微信小程序开发**: 微信小程序...
设计一个用户友好的网页是至关重要的,尤其是在像12306这样高流量的网站上。设计应简洁明了,便于用户快速找到所需信息,如车次查询、购票、退票和改签等功能。这通常意味着清晰的导航菜单、直观的布局和易识别的...
本项目是基于Java的12306购票辅助后端服务设计源码,包含99个文件,其中65个Java文件、8个YML文件、7个Python文件、2个Markdown文件、2个XML文件、2个HTML5文件、2个Pyc文件、2个TXT文件、1个Gitignore文件和1个...
12306订票助手.NET是一款专为解决中国铁路12306官网购票难问题而设计的辅助工具。作为.NET框架下的应用程序,它充分利用了.NET平台的优势,提供了便捷、高效的火车票查询、预定和抢票功能,旨在帮助用户在繁忙的购票...
而“12306Booking.js”则是一个专门为12306网站设计的网页操作助手应用插件,它利用了JavaScript这一强大的客户端脚本语言,以提升用户在购票过程中的体验和效率。 一、JavaScript脚本基础 JavaScript,简称JS,是...
标题中的“12306购票辅助工具”指的是一个基于C# .NET 2008框架开发的应用程序,设计用于帮助用户自动化处理12306官网的火车票购买流程。这个工具的核心功能包括自动登录12306网站以及实时监控并提醒用户有无可用的...
3. **12306 API交互**: 12306是中国铁路客户服务中心的官方网站,提供了API接口供开发者调用,获取火车票数据。在本项目中,需要理解并使用12306的API,通过发送HTTP请求来获取车次、余票、价格等相关信息。这涉及到...