12306 说:有时候,能排队也是一种幸福!

简介:

不知道大家发现一个现象没有,无论 12306 网站崩溃成什么样子,火车站售票大厅的售票窗口都是正常的!这说明什么呢?这说明铁道部有个内部网络, 12306 仅仅是个入口而已。如果我们把铁路内部网比作信息的高速公路,12306 网站就是高速公路上的收费站。

 

说到高速公路,这两天有很多新闻,据说很多高速公路入口处变成了停车场,有人在上面做操、有人遛狗、还有生孩子的、随地大小便的、犯心脏病的等等等等,总之是一片混乱,崩溃!但是入口处再怎么乱,进入了高速公路,基本上还是比较顺畅的。 

 

仔细看看竟然和12306的情况一摸一样,12306 就是为了防止内部网络瘫痪而设立的一道调度关卡,结果和高速公路一样悲剧,都是内部顺畅,入口处卡住了。

 

下面我们就把高速入口和12306看做一个问题,分析分析怎么解决:

 

方案一:拆分,每个车次都设立一个车票服务器。

 这个方案理论上绝对可以解决问题,但现实中根本不可能。想象一下,为全国任何两个城市之间都建设一条单独的高速公路,并设置单独的出入口,当然不会拥堵了,但是可能吗?就算不考虑成本问题,铁路公路部门从管理运营其他方面考虑,也不会同意拆分的。

 

方案二:分布式,大缓存区。

 现在很多人都没搞清楚问题的实质,一上来就是分布、缓存之类的。高速公路入口难道没有分布吗?难道没有缓存区吗?

先说分布式的问题:每个大城市上高速都不止一个入口吧,这应该是一种分布式处理吧?有人说入口不够多,其实再多的入口也没用,因为不管你分布多少入口,最终所有的流量还是要汇集到那么几条主干道上去。只要流量是一瞬间大量出现的,最终还是会堵在某个地方,只不过变成了外面不堵里面堵而已。

再说缓存的问题: 每个高速入口处都有一个小广场,停个百八十两车没问题,这不就是缓存区吗?有人说缓存区不够大,好吧,建个能停十万辆车的广场,再配套上医院、饭店、旅馆、公园之类的, 这个缓存区够大了吧,有用吗?入口处就那么几个路政人员,他二十四小时不停地发卡,结果工作人员口吐白沫手抽筋了(请查找相关新闻),这是什么?这不就是系统崩溃了吗?入口的处理能力有限,再大的缓存区又有什么用???

 

方案三:排队

现在唯一的方法可能就是排队了,但是传统的排队能解决问题吗?人的耐心都是有限的,一般人等个二三十分钟可能还行,如果让你从日出等到日落,估计任何人都崩溃了。崩溃了怎么办?有人就开始加塞抢道、有人直接上了应急车道、有人准备原地调头,有一个人做就有两个人做,然后就是一片混乱,缓存区彻底瘫痪了,进也进不去,出也出不来,所有人就塞在那里,动弹不得。和12306一摸一样。在这样一个人多、资源少、素质也不太高(比如说买一张票,几十个人一块刷)的环境中,传统的排队好像也不太现实

 

思考题:火车站进站为什么很少崩溃?

 有一个问题不知道大家想过没有,过年过节时候的火车站,也是检票进站,那人山人海的,流量可比高速公路入口大多了,为什么火车站进站很少听说有崩溃的?

秘密就在于火车票上面的那个发车时间

比如你的车票发车时间是12:00,现在是8:00,时间还早,你不会堵在检票口处死等吧!你可以先去网吧上上网、逛逛商店、吃个饭、会会网友之类的。等到时间到了,闹钟提醒你了,你再往火车站赶。

 

原先是几十万人依赖一个入口,现在是火车站和乘客都依赖一个发车时间,依赖反转了。一旦反转,就会发生很多变化:

变化1:检票系统对流量的处理就变被动为主动,原先是来多少就得处理多少;现在是通过调度,让流量按照时间一波一波的来。

变化2:原先的缓存区仅仅只有候车大厅那么大一点;现在整个城市都是火车站的缓存区,只到登车前才进入候车大厅。

变化3:原先的侯检、排队是一种混乱的、无秩序的、让人无法忍受的排队;现在虽然也是一种排队,但是是一种有秩序的、有调度的、体验良好的排队。 


 通过上面的分析,问题的症结已经很清楚了:

1、内部网络为了保证安全、稳定和统一调度,必须设置入口关卡;就像高速公路入口、火车站检票口之类的。这一点无法改变! 

2、 入口的处理能力是有限的,而且只能一个一个放行,强度大了可能还会口吐白沫、手脚抽筋(系统崩溃)。这一点也是无法改变的。

3、入口对任务的处理是被动的,来多少就得处理多少,没有调度,直到系统崩溃为止。这一点是唯一能够改变的地方。

 

解决方案:依赖反转

高速公路入口或者12306网站,他们作为入口之所以会经常瘫痪的原因就是上面的第三条:对任务的处理是被动的,来多少就得处理多少,没有调度。

既然找到了问题所在,解决起来就比较简单了。

 

先说高速公路的例子:

假如你和我两个人明天都是要9:30上高速,按照原来的流程,我们两个人会在高速公路入口处排队,当然还有很多其他人。

现在, 我们提前一天将任务提交给高速公路管理部门,第二天9:05我收到短信,告诉我可以出发了;9:13分你收到短信,可以出发了。当然,时间可能不会像你要求的那么准确,但是绝对比大家都挤到入口处等待节省时间。

 

再说 12306 的例子:

上亿次的请求被几千台外围的服务器拦截处理以后,怎么办?一块向入口挤吗?千万不要!!

把所有的请求被缓存下来,然后就啥也不用管了。千万不要向中央服务器提交,因为入口就那么几个,主干道可能就那么一条道。

庞大的流量依赖几个有限的资源,必然会造成混乱。

 

那怎么办?依赖反转啊!你们别来找我,我去找你们!中心服务器主动从外围服务器上获取请求数据,然后统一调度处理,处理完毕以后再通知用户。

 

额外的好处:用户再也不用找几十个亲戚朋友不停地刷新页面了!

为什么?因为原先刷新页面的目的是为了挤进入口去,刷的次数越多,进去的可能性越大。

现在,你刷多少次也没用,你的数据只是被缓存起来,而不会被处理。什么时候处理,由中心服务器统一调度。 

秩序恢复了,体验变好了,大家的素质看上去好像也提高了。

 

 其实,有时候,能排队也是一种幸福!

 

 本文转自左洸博客园博客,原文链接:http://www.cnblogs.com/myqiao/archive/2012/10/03/2710899.html,如需转载请自行联系原作者




目录
相关文章
|
7月前
|
NoSQL Java Redis
得不到你的心,就用“分布式锁”锁住你的人 码农在囧途
朋友,如果喜欢,就去表白吧,不要因为害羞,更不要因为自卑,如果现在你都还不敢表白,那么多年后,再回头来看的时候,你可能会为曾经的胆小而后悔,也可能会为错过一个人而心中久久不能释怀,所以,大胆一点,即使失败也无所谓,至少我们曾经做过,做过了就无怨无悔,在人生这条道路上,时光稍纵即逝,我们应该把握好眼前的一切,爱是一种力量,更是一种内心的慰藉,冲吧!不要因为钱不够,不要因为容貌不出中国,更不要因为身世不显赫,你只要足够勇敢,这一切都是附加品!
76 0
|
消息中间件 JavaScript 小程序
新来个阿里 P7,仅花 2 小时,撸出一个多线程永动任务,看完直接跪了,真牛逼!
新来个阿里 P7,仅花 2 小时,撸出一个多线程永动任务,看完直接跪了,真牛逼!
得不到的爱情
得不到的爱情
94 0
|
设计模式 架构师 Java
为什么有些蛮厉害的人,后来都不咋样了
写这篇文章目的是之前在一篇文章中谈到,我实习那会有个老哥很牛皮,业务能力嘎嘎厉害,但是后面发展一般般,这引起我的思考,最近有个同事发了篇腾讯pcg的同学关于review 相关的文章,里面也谈到架构师的层次,也再次引起我关于架构师的相关思考,接下来我们展开聊聊吧~
126 0
|
芯片
程序人生 - 手上总有静电该怎么处理?
程序人生 - 手上总有静电该怎么处理?
110 0
程序人生 - 手上总有静电该怎么处理?
万万没想到,线程居然被饿死了!
万万没想到,线程居然被饿死了!
|
缓存 Java 程序员
一篇文章带你完全了解JAVA线程池,再也不用担心被面试官问了
线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位,我们的程序最终都是由线程进行运作。在Java中,创建和销毁线程的动作是很消耗资源的,因此就出现了所谓“池化资源”技术。线程池是池化资源技术的一个应用,所谓线程池,顾名思义就是预先按某个规定创建若干个可执行线程放入一个容器中(线程池),需要使用的时候从线程池中去取,用完之后不销毁而是放回去,从而减少了线程创建和销毁的次数,达到节约资源的目的。
|
人工智能 安全 数据挖掘
这么一搞,再也不怕线程打架了
假如我们需要处理一个文本文件,里面有 100万行数据,需要对每条数据做处理,比如将每行数据的数字做一个运算,放入到另一个文件里。
121 0
这么一搞,再也不怕线程打架了
|
SQL XML 关系型数据库
mysql索引失效的问题,差点我的工作凉了
下面分享的是我在工作中遇到的一个问题。有关 mysql 索引失效的问题。 处于保密考虑,我拿一个类似的场景举例子。
mysql索引失效的问题,差点我的工作凉了
|
存储 SQL Java
一切都来得及,千万别放弃
距离2018届毕业,还有不到半年。 我是普通本科,投递Java后台开发。截至今天,本人已获得CVTE、金蝶、锐捷网络、百度上海研发中心实习生、深信服、美团、北京好未来的offer(按时间获得的先后顺序)。
1793 0