从另一个角度看Reactor

Posted Cool Coding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从另一个角度看Reactor相关的知识,希望对你有一定的参考价值。


什么是Reactor

从另一个角度看Reactor

Reactor(反应器)模式是高性能网络编程在设计和架构层面的基础模式。著名的高并发通信服务器框架,例如Netty、nginx等都是基于Reactor模式实现。

只有了解Reactor的原理和实现,才能轻松地学习和掌握高并发通信服务器和框架。

从另一个角度看Reactor

Reactor的重要性

从另一个角度看Reactor

Reactor的重要性可以从两个方面来阐述:
  1. 从业内普及率来看。到目前为止,高性能网络编程都绕不开Reactor模式,许多著名的框架诸如Nginx、Redis等都是基于Reactor模式的。
  2. 从技术人员的角度来看,要完成和胜任高性能的服务器开发,该模式是必须熟练掌握的。在许多大型互联网公司面试过程中,这也是一个热点的面试问题。

从另一个角度看Reactor

沃伦·巴菲特

从另一个角度看Reactor

其实我并不打算从技术的角度来阐述它的原理,这也正是这篇文章的标题意义所在,我希望从另一个角度来理解Reactor。

相信大家都知道沃伦·巴菲特,他就是大名鼎鼎的“股神”。人们都被他丰富的投资经验和成功的投资履历所折服。

在我们羡慕他的同时也许曾问过自己:是什么的因素造就了这样的巴菲特呢?

世界上还存在着这么一个人,这个人影响了巴菲特的一生,没有这个人或许就没有现在的巴菲特。

他是巴菲特的导师,是朋友,同样也是巴菲特的商业伙伴。他俩的组合堪称投资界内传奇的组合,这个人就是查理·芒格。

巴菲特曾经列出过自己选择合伙人的建议:

1. 首先要找比你更聪明、更具有智慧的人。找到他之后,别炫耀他比你高明,这样你就能够因为许多源自他的想法和建议的成就而得到赞扬。

2. 在你犯错的时候,他既不会事后诸葛亮,也不会生气。

3. 同时他还应该是一个慷慨大方的人,会投入自己的钱并努力为你工作而不计报酬。

4. 最后这位伙伴会在漫漫长路上结伴同游时给你源源不断的带来快乐和惊喜。


全部符合我这些特殊要求的人只有一个,他就是查理。-- 沃伦·巴菲特

从另一个角度看Reactor

查理·芒格

从另一个角度看Reactor

查理 热爱读书和学习 ,他的儿女都称他为行走的书本

查理自学了经济学、心理学、人文地理、数学、物理、化学等不计其数的知识,掌握了上千种的模型。并将其综合运用到投资分析中。

他建议利用各个学科的理论,秉持着多想几步的原则,多元化的角度分析事情的根因或者评估企业的价值。正是这种世界上独一无二的分析方法,造就了查理的传奇一生。
如果我们试图理解一样看似独立存在的东西,到最后我们将会发现它和宇宙间的其他一切都是密切的联系。  -- 查理·芒格

从另一个角度看Reactor

开一家餐馆

从另一个角度看Reactor

回到Reactor的主题中。我们以生活中餐馆的运作模式这个角度来阐述Reactor。

假如你刚开张了一个小餐馆,只有你自己一个人。那你会是一个怎样的工作状态呢?

初期可能是这么一个状态:你站在门口招呼客人,一旦来了一个人,你先安排他入座,然后客人向你点菜。

拿到客人菜品需求的你便转身进入厨房开始制作,直到把菜品做好,你把菜端来客人桌子上,客人享用美食。周而复始。

但是你在厨房的时候,来了其他客人,这时候就没有人来招呼他们了,客人可能就会离开去别的餐馆。

或者你招待了多个客人,但是你还是得一份份的做菜。这其实是一个很大的问题。 这也正是传统单线程阻塞IO的困境,效率低下。

于是你觉得这样不行,叫来了自己的小伙伴,现在你的店里加上你有5名员工了。你们能同时接待5个客人了。

但是来了更多的人,你还能无限制的增加自己的员工吗?

如果一个员工类比为一个线程,那么这就是 多线程阻塞IO的工作方式。但是线程资源很珍贵,并且创建销毁成本很高,因此在高并发(高客流量)的场景下并不适用。

发现问题的你决定去看看别人餐馆是怎么运作的,最基础的学习就是模仿,你希望从别人那里学到一些不错的经验。

从另一个角度看Reactor

一家饭店

从另一个角度看Reactor

你来到了一家中等规模的饭店,发现这里员工的工作状态是这样的:

有一个专门的前台来接待客人进入饭店并安排入座;

有2-3名服务员负责点菜和传递菜品;

有好多名厨师在厨房制作菜品。

大家各司其职,饭店的运作一切都井然有序。

从另一个角度看Reactor

一家酒楼

从另一个角度看Reactor

你又来到了一家更大的酒楼,发现这里和饭店的模式差不多。

只是前台变成了多名,有了更多的服务员和厨师。就是这种简单的数量增加,却能接待服务更多的客人。

而期望接待更多的客人,只需要适当的增加对应的人员即可。

从另一个角度看Reactor

Reactor的原理

从另一个角度看Reactor

其实饭店和酒楼的运作模式就是Reactor的运作模式。

Doug Lea在「Saclable IO in JAVa」中对Reactor的模式定义如下:
Reactor模式由Reactor线程、Handler处理器两大角色组成,他们的职责分别如下:

  1. Reactor:负责响应IO事件,并且分发到Handlers处理器。 
  2. Handler:非阻塞的执行业务处理逻辑。

在饭店和酒店的运作模式中,前台就是Reactor处理器,负责接待客人,交付给对应的服务员。

服务员和厨师共同组成了Handlers处理器,来完成服务客人、为客人制作菜品的职责。

非阻塞在于前台将客人交付给对应的服务员以后就可以接待其他客人,而不必等着这个客人离开饭店。

同样的,服务员也可以同时服务好几桌的客人。最后对比下来,这种模式比起传统的小饭店模式效率上提高了好几倍。

从另一个角度看Reactor

结尾


查理·芒格的多元化的思维方式带给我的启发是无限的。

虽然Reactor的原理十分简单,但是我们可以运用我们所学不同学科的知识,尝试从不同的角度来看待它。

这个过程将会是一个充满思考、充满快乐和惊喜的过程。

最后提出一个有趣的问题,如果把外卖的场景或者其他学科的模型结合到其中,能否产生出效率更高、能支持更大并发量或者更为便捷的网络通信框架呢?


The    end
Cool Coding
喜欢就关注我,和我一起玩吧~

以上是关于从另一个角度看Reactor的主要内容,如果未能解决你的问题,请参考以下文章

从另一个角度看大数据量处理利器 布隆过滤器

从另一个角度组件保存相关数据时刷新角度组件

换个角度看 JS 的 Event Loop

如何通过以角度从另一个模板调用来重置文本字段

如何从另一个组件返回到另一个组件而不以角度重新加载组件?

角度应用程序正在获得访问权限,但从另一个系统调用时未访问 webapi,但在服务器内尝试工作。为啥?