关于12306网站和清华某院长的微博言论,我做了一个小回复,说这玩意不难,2个人2周,40台服务器可以搞定。

下面详细解释一下大概的思路。免费share一下,看看靠谱不靠谱。

别人看到的是流量,我先看结构,这里的数据结构是相当简单的,主要满足的需求是

1.车次查询(最常见的是起点站,终点站查询 和车次直接输入查询)+余票显示

所谓的用户刷页面,绝大部分应该在这里。日均10亿pv(这个数字我先质疑一下,不过么关系,后面再说怎么处理),估计主要落在这个查询上。

2.注册,登陆。每天过千万人次是有的

3.下单,也就是日成交订单量,可能存在下单失败,约几百万次。

这里基本不涉及复杂的关系操作,不涉及推拉结构,和新浪微博,facebook这样的应用场景相比,在数据关系上简直毫无难度,这也才是我敢说大话的原因。

因为不涉及复杂的关系操作,不涉及个性展示(不同用户搜索同样的条件,结果一致),那么缓存化就是最佳途径。

1.存储key-value化, 推荐redis

基本上查询都是直线式的,所以key-value就是很好的工具;因为出票可能需要找一下车次,座位,只能一一对应的查询就不好用;弄个redis带个列表结构(dict or zset ,哪个结构更合适?问问新浪架构师杨卫华吧,这事估计对他太简单了)进去就可以了。春节放票总共多少张?又不是一次放出来,每张票对应一个key,一个value,能吃多少内存?后面跟个数据库做同步,这点数据量对于现在的服务器来说根本不是问题。

注册登陆也可以在 mysql基础上弄个redis挂在前头响应,这种查询速度,biu.

根据不同车次分几台服务器,响应速度根本不是问题。

2.将所有查询结果缓存化,静态化

首先明确一下查询的步骤,实际上主要查询分两步

第一步是查询符合要求的车次,第二步是查询余票。

缓存也就分两步做,起始地,目标地查询 - 常见查询目标(如北京到成都)全部预制缓存。非常见查询目标,基于第一次查询的结果缓存,这样查询车次基本上无压力。

查询有票状态就更简单了,因为票数只有有票,无票两个状态,某日某车次作为一个key-value类型存储(仍用redis即可)。某类车票发生从有到无或从无到有的变化,才通知缓存更新。更新是后台通知的,而非基于用户查询。比如某车次硬卧票售完,通知一次更新,硬座售完,通知一次更新,软座售完,通知一次更新。以此类推,这样的缓存更新次数极少。而且可以给前端返回甚至静态结果(基于查询条件生成静态结果,是个Seoer都会的,后台在票数变化时通知更新,这样结构上就与前端查询无关了,而且一样可以保持实时性)。

如果你较真说,其实一个车次在不同区间也存在有无票的不同,的确,不过按照同样思路,结构多做一层死不了人的。毕竟这只是概述。但是核心思路不变,缓存的变更次数远少于查询请求次数,这就够了。

3.前端缓存处理

很多人被10亿请求数吓到了,其实这里水分很大,最多的是重复刷新和外挂工具,那么如果你做到基于2的查询结果缓存化,这一步就简单了;直接参见这个文章 http://blog.sina.com.cn/s/blog_466c66400100bi2y.html 大量的用户重复刷新根本不是问题。 想知道实际效果,看这里 http://blog.sina.com.cn/s/blog_466c66400100cfrj.html 1小时20亿的刷新都不怕,还怕你一天10亿刷新?

4.i/o优化

其实我甚至觉得用了redis都不需要做i/o优化了,如果用户单据需要数据库保存,一天200万单嘛,搜一下 淘宝技术专家余锋分享的qcon讲座文档,顺便读一下他历来新浪微博分享的文字,这个需求简直就是小儿科了。 大不了狠狠心买几块ssd硬盘做raid1/0,对于我这样的穷架构师来说,都属于大手笔了,至于昂贵的fusion-io,我真觉得,这个场景用不着,实在用不着。

这里关键点,是查询结果的静态化和前段缓存的利用

查询怎么可能静态化?

因为

1:重复查询的频度远远大于数据更新的频度(即便是票数的更新,也是500:1,更不用说是有无的变化)

2:静态化不代表不动态更新,在订票成功后,如果发生了票数状态的改变(是状态改变,而不是数字改变),服务端更新或删除该静态结果(下一次查询重新生成静态结果)

至于为什么说2人2周,别搞花的,别图好看,就把这些结构捋清楚,代码能有多少行?这玩意没什么工作量。

此外,有人说,你肯定没考虑神马神马神马神马;您说对了,我还真没考虑这么多,毕竟铁道部没给我1000多万,不过真要是给了我1000多万,我用三天时间考虑清楚,肯定比这不到1个小时整理的东西详细,您觉得呢,剩下一周半干活足够完工了。

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

做个简要总结,该方案所适应场景

1:查询请求频次远大于数据更新频次。

2:所有人同一时刻查询同一条件返回结果一致。

在二者条件满足的情况下,查询结果可以静态化,静态化不代表不动态更新

更新通过服务端的数据变化触发,而非通过用户请求触发。这样就可以保证静态化发布和动态化更新。

静态化发布后,利用杨建的 前端优化技巧,设计输出header。

根据公开数据粗略估计,10亿pv请求,90%+甚至95%会落到前端缓存里,根本不会带来服务器负载!连cdn都省下了!

明白嘛?不明白的仔细去看杨建的博客。

至于订单系统,一天200万,数据库随便分一下库,还需要多少解释?看看余锋的微博和Qcon分享文档,200万请求算毛事情,不至于唧唧歪歪吧。

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

转载于:https://blog.51cto.com/feihsueh/853514

铁路订票网站个人的设计浅见相关推荐

  1. 12306铁路订票网站个人的设计浅见

    关于12306网站和清华某院长的微博言论,我做了一个小回复,说这玩意不难,2个人2周,40台服务器可以搞定. 下面详细解释一下大概的思路.免费share一下,看看靠谱不靠谱. 别人看到的是流量,我先看 ...

  2. 铁路订票网站 12306.cn 官方推出手机订票客户端

    感谢nobita的投递 中国铁路客户服务中心订票网站12306.cn今天低调推出手机客户端, 目前支持iOS和Android两大系统,目前下载页面已经上线完毕 (实际上只有Android能用,iOS版 ...

  3. 基于jsp的电影订票网站的设计与开发

    技术:Java.JSP等 摘要: 在这高新技术发展的今天,因特网的高速发展给人们带来了极大的便利,使人们的生活丰富多彩,人们在生活中通过网络可以享受到之前没有的生活享受.电影订票网站给人们带来了极大的 ...

  4. Java、JSP电影订票网站的设计与开发

    技术:Java.JSP等 摘要: 在精神文明建设越来越被人们重视的今天,电影行业的市场也越来越好,电影的种类和数量也随之越来越多.然而客流量增大同时也导致影院的管理难度增大,为了应对这种情况,设计并开 ...

  5. 电影订票网站的设计与开发

    技术:Java.JSP等 摘要: 随着科技的发展,时代的进步,互联网已经成为了人们生活中不可缺少的一部分,网上购物已然是一种时代的象征.纵观市场,电影行业的发展尤为迅速,电影种类和数量的增多导致客流量 ...

  6. 【转载】12306铁道部订票网站性能分析

    写的不错,推荐给大家. 12306.cn 网站挂了,被全国人民骂了,以这个事来粗略地讨论一下网站性能的问题.这是一篇长文,只讨论性能问题,不讨论那些UI,用户体验,或是是否把支付和购票下单环节分开的功 ...

  7. 12306铁道部订票网站性能分析

    转载]12306铁道部订票网站性能分析 写的不错,推荐给大家. 12306.cn 网站挂了,被全国人民骂了,以这个事来粗略地讨论一下网站性能的问题.这是一篇长文,只讨论性能问题,不讨论那些UI,用户体 ...

  8. 淘宝网和铁道部订票网站采用什么技术架构来实现网站高负载的呢

    12306火车票购票系统,逢假日必瘫痪,引发了强烈反响.在国庆前后,搜狐IT"问诊12306"做了系列报道.当时,铁道系统的答复是,购票人数太多,数据量过大.但是,在前不久淘宝双1 ...

  9. html在线设计,快速建站 20个设计优秀的HTML网站模板(免费)

    在这个互联网时代,很多企业或是个人都搭建有自己的网站,用于宣传营销或个人网站博客等用途.而对于小企业.个人或不懂设计网站的用户来说使用网站模板将是最好的建站方式,设计达人网致力分享高品质免费素材,所以 ...

最新文章

  1. Freescale 车身控制模块(BCM) 解决方案
  2. Web.py Cookbook 简体中文版 - 用cherrypy提供SSL支持
  3. linux c嵌入汇编语言,Linux 下的C和Intel 汇编语言混用
  4. 机器学习:SVM训练,SMO算法描述,启发式选择样本或变量
  5. 产品经理,你来自江湖
  6. intel ssd toolbox 绿色单文件_你想要的大容量来了!影驰擎GA-E 16TB SSD上手:速度喜人-SSD,固态 ——快科技(驱动之家旗下媒体)-...
  7. java读取yaml数据_Java类读取Yaml内罐
  8. Count on a tree SPOJ - COT
  9. 我也说说刘谦在2010年春晚上的魔术作假
  10. codeblocks修改MINGW位置使它能编译Build
  11. win10下载java软件,下载适用于Windows 10的最新Java版本[32位,64位]
  12. 浏览器引擎系列:Webkit
  13. 11.uniapp的环境搭建
  14. 深入理解计算机系统03——程序的机器级表示
  15. 基于51单片机的超声波测距
  16. 投资理财(待更新,仅供个人使用)
  17. C语言中的TRUE和FALSE
  18. 十年学会程序设计(十年磨一剑)
  19. 2023江西理工大学计算机考研信息汇总
  20. 音乐是我们日常生活中不可缺少的

热门文章

  1. 一个球从10米高空落下,每次落下跳回到原来的一半,再落下,求第10次落地时,共经过多少米?
  2. Eclipse使用SVN进行代码提交的步骤
  3. STM32 经过TM1637驱动四位数码管
  4. AI Studio 飞桨 零基础入门深度学习笔记4-飞桨开源深度学习平台介绍
  5. 手把手教你写复制U盘文件神器(一)
  6. Excel批量创建带超链接的工作表目录
  7. javascript数组遍历
  8. 通过控制台输出各种颜色的字符——ANSIConsole、JANSI
  9. Java程序设计练习题7集合与泛型
  10. TennisWorld