如果 12306 依赖反转 —— 都给劳资消停点,谁也别来找我,我会去找你们的

简介:
一说起12306,大家总爱和淘宝、谷歌、京东之类的高访问量网站比较。 他们真的一样吗?我们来分析一下:
先分析谷歌。假如同一时间我谷歌“苹果”,从服务器 A 得到数据,你谷歌“橘子”,从服务器 B 得到数据,他同样谷歌“苹果”,却是从服务器 C 得到数据。这就是所谓的分布式架构。
再来分析淘宝,你买一件衣服,我买一双鞋子,业务请求很可能是从不同的服务器处理的。
淘宝、谷歌这类的网站,他们的特点是: 每个用户的操作和其他用户的相关性不大;也可能相关性可能很大,但是从时间上来说却不需要立刻处理。在这个前提下,才有可能进行分布式架构。
12306的核心车票数据可以分布吗?我们再来分析一下:
你购买了一张北京到广州的车票,同一时间我也购买了一张北京到广州的车票。
假如系统是分布式的,会出现什么情况呢。

服务器 A 给你出了一张票,服务器 B 给我出了一张票,结果等车的时候发现,我们两个人的票是同一个座位,撞车了!

如何解决这个问题呢?那就是设置一个中心服务器!
外围分布式服务器可以处理一切和车票无关的业务,比如说注册、登陆、身份验证、购票请求、款项支付等等等等,因为这些数据只和你自己相关,和任何其他人都没有关系,这些数据可以用类似谷歌、淘宝之类的架构设计处理。
但是唯独车票数据例外,因为 任何一张车票的数据发生了变化,系统必须立刻知道,并在紧接着的下一笔购票业务中反映出来,否则就会出现混乱。
会出现什么可怕的情况,大家想象一下。
真正可怕的不是一瞬间上亿的访问量,真正可怕的是 上亿的访问在同一时刻必须依赖同一个“核心”!
对,就是一个“核心”。这个核心可能是一台服务器,也可能是几千台服务器。无论多少, 从逻辑上看,他们就是一个核心
现在问题很清楚了, 购票的业务逻辑必然导致一个依赖核心!而上亿的访问同一时刻 依赖同一个“核心”必然导致崩溃!
似乎崩溃是必然的,但是如果我们将依赖反转过来就发现一切问题迎刃而解。
打个比方吧,大家电脑里都有一个中心处理器 ,即CPU ,他是一个核心。假如我们让几万个运算任务同一时间去抢 CPU 的控制权,CPU 必然会发呆的,给谁好呢? 
CPU 想了一下发话了,大家都别抢了,都给劳资消停点!所有人,都把数据准备好:放到磁盘、内存、一二三级缓存中,然后等着。
你们谁也别来找我,我会一个一个找你们的,每人一个时间片,只要劳资还能运转,大家的任务都能完成。
本来是海量请求依赖一个核心,现在成了核心主动去收集任务,依赖反转了。
12306 完全可以这样架构,外围的分布式系统处理一切和车票无关的非核心业务,同时接受购票请求并将购票请求缓存起来。而“核心”对外围分布式服务器进行时间片轮转通讯,收集购票请求,并根据即时情况进行处理。秩序恢复了,高速公路终于不是停车场了。
当然了,无论怎么架构,总还是有很多人买不到票,但是秩序恢复了,这不正是我们要追求的吗!


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


目录
相关文章
|
5月前
thymeleaf如何迭代遍历,如何判断
thymeleaf如何迭代遍历,如何判断
|
3月前
|
算法 编译器 程序员
C++为什么有参数依赖查找(ADL)?
为什么在限定名称查找和非限定名称查找之外,C++还要提供参数依赖查找这样的机制呢?它其实是在规范的查找框架下,提供了一种灵活性的补充
|
3月前
|
传感器
循环依赖问题之Bean循环依赖的定义是什么
循环依赖问题之Bean循环依赖的定义是什么
循环依赖问题之Bean循环依赖的定义是什么
|
3月前
|
Java Spring
Spring循环依赖问题之构造器内的循环依赖如何解决
Spring循环依赖问题之构造器内的循环依赖如何解决
|
3月前
|
存储
业务系统架构实践问题之倒置依赖和非倒置依赖有什么区别
业务系统架构实践问题之倒置依赖和非倒置依赖有什么区别
|
3月前
|
存储 缓存 Java
Spring循环依赖问题之循环依赖异常如何解决
Spring循环依赖问题之循环依赖异常如何解决
|
5月前
|
Java 测试技术 Spring
什么是循环依赖,如何解决?
在 Spring 应用中,循环依赖指的是两个或多个 Bean 之间相互引用,造成了一个环状的依赖关系。举例来说,如果 Bean A 依赖于 Bean B,同时 Bean B 也依赖于 Bean A,就形成了循环依赖。这种情况下,Spring 容器在创建这些 Bean 时会陷入无限循环,导致应用启动失败或者出现其他不可预测的问题。
84 1
|
5月前
|
Java 测试技术 Spring
什么是循环依赖,如何解决
什么是循环依赖,如何解决
|
5月前
|
Java 测试技术 Spring
什么是循环依赖,并如何解决
在 Spring 应用中,循环依赖指的是两个或多个 Bean 之间相互引用,造成了一个环状的依赖关系。举例来说,如果 Bean A 依赖于 Bean B,同时 Bean B 也依赖于 Bean A,就形成了循环依赖。这种情况下,Spring 容器在创建这些 Bean 时会陷入无限循环,导致应用启动失败或者出现其他不可预测的问题。
109 0
|
5月前
|
存储 缓存 Java
ioc循环依赖怎么解决
ioc循环依赖怎么解决
60 0