Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0dfdc3f

Browse files
committed
img
1 parent 4715a66 commit 0dfdc3f

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

posts/ch4-reactor.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
Channel与Reactor模式
1+
Netty那点事(四)Channel与Reactor模式
22
--------
3+
![Reactors][1]
34

45
## 一:Netty、NIO、多线程?
56

@@ -15,7 +16,7 @@ Reactor是一种广泛应用在服务器端开发的设计模式。Reactor中文
1516

1617
那么,Reactor模式究竟是个什么东西呢?这要从事件驱动的开发方式说起。我们知道,对于应用服务器,一个主要规律就是,CPU的处理速度是要远远快于IO速度的,如果CPU为了IO操作(例如从Socket读取一段数据)而阻塞显然是不划算的。好一点的方法是分为多进程或者线程去进行处理,但是这样会带来一些进程切换的开销,试想一个进程一个数据读了500ms,期间进程切换到它3次,但是CPU却什么都不能干,就这么切换走了,是不是也不划算?
1718

18-
这时先驱们找到了事件驱动,或者叫回调的方式,来完成这件事情。这种方式就是,应用业务向一个中间人注册一个回调(event handler),当IO就绪后,就这个中间人产生一个事件,并通知此handler进行处理。*这种回调的方式,也赢到了“好莱坞原则”(Hollywood principle)-“Don't call us, we'll call you”,在我们熟悉的IoC中也有用到。看来软件开发真是互通的!*
19+
这时先驱们找到了事件驱动,或者叫回调的方式,来完成这件事情。这种方式就是,应用业务向一个中间人注册一个回调(event handler),当IO就绪后,就这个中间人产生一个事件,并通知此handler进行处理。*这种回调的方式,也体现了“好莱坞原则”(Hollywood principle)-“Don't call us, we'll call you”,在我们熟悉的IoC中也有用到。看来软件开发真是互通的!*
1920

2021
好了,我们现在来看Reactor模式。在前面事件驱动的例子里有个问题:我们如何知道IO就绪这个事件,谁来充当这个中间人?Reactor模式的答案是:由一个不断等待和循环的单独进程(线程)来做这件事,它接受所有handler的注册,并负责先操作系统查询IO是否就绪,在就绪后就调用指定handler进行处理,这个角色的名字就叫做Reactor。
2122

@@ -39,17 +40,18 @@ Java中的NIO可以很好的和Reactor模式结合。关于NIO中的Reactor模
3940

4041
前面提到了Proactor模式,这又是什么呢?简单来说,Reactor模式里,操作系统只负责通知IO就绪,具体的IO操作(例如读写)仍然是要在业务进程里阻塞的去做的,而Proactor模式则更进一步,由操作系统将IO操作执行好(例如读取,会将数据直接读到内存buffer中),而handler只负责处理自己的逻辑,真正做到了IO与程序处理异步执行。所以我们一般又说Reactor是同步IO,Proactor是异步IO。
4142

42-
关于阻塞和非阻塞、异步和非异步,以及UNIX底层的机制,大家可以看看这篇文章[IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)](http://blog.csdn.net/historyasamirror/article/details/5778378),以及陶辉(《深入理解nginx》的作者)《高性能网络编程》的系列。
43+
关于阻塞和非阻塞、异步和非异步,以及UNIX底层的机制,大家可以看看这篇文章[IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)](http://blog.csdn.net/historyasamirror/article/details/5778378),以及陶辉(《深入理解nginx》的作者)[《高性能网络编程》]((http://blog.csdn.net/russell_tao/article/details/17452997))的系列。
4344

4445
## 三:由Reactor出发来理解Netty
4546

4647
Reactor可以认为是设计模式的一种。我认为设计模式有两个好处,写的时候,可以指导程序设计,别人读的时候,也按照既定的模式来分析代码。
4748

4849
Netty中的Reactor模式其实是一种多线程的Reactor模型。Doug Lea大神(不知道Doug Lea?回头看看JDK集合包和并发包的作者吧)在《Scalable IO in Java》中提到了这种模式,借用一下图:
4950

50-
![Multiple Reactors][1]
51+
![Multiple Reactors][2]
5152

52-
[1]: http://static.oschina.net/uploads/space/2013/1125/130828_uKWD_190591.jpeg
53+
[1]: http://static.oschina.net/uploads/space/2014/0208/164000_EQQb_190591.jpg
54+
[2]: http://static.oschina.net/uploads/space/2013/1125/130828_uKWD_190591.jpeg
5355

5456
## 合:由Reactor出发来理解Netty
5557

@@ -60,4 +62,6 @@ Netty中的Reactor模式其实是一种多线程的Reactor模型。Doug Lea大
6062
* Reactor pattern [http://en.wikipedia.org/wiki/Reactor_pattern](http://en.wikipedia.org/wiki/Reactor_pattern)
6163
* Reactor - An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events [http://www.cs.wustl.edu/~schmidt/PDF/reactor-siemens.pdf](http://www.cs.wustl.edu/~schmidt/PDF/reactor-siemens.pdf)
6264
* 高性能网络编程6--reactor反应堆与定时器管理 [http://blog.csdn.net/russell_tao/article/details/17452997](http://blog.csdn.net/russell_tao/article/details/17452997)
63-
* IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)[http://blog.csdn.net/historyasamirror/article/details/5778378](http://blog.csdn.net/historyasamirror/article/details/5778378)
65+
* IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)[http://blog.csdn.net/historyasamirror/article/details/5778378](http://blog.csdn.net/historyasamirror/article/details/5778378)
66+
67+
题图来自:[http://www.worldindustrialreporter.com/france-gives-green-light-to-tokamak-fusion-reactor/](http://www.worldindustrialreporter.com/france-gives-green-light-to-tokamak-fusion-reactor/)

0 commit comments

Comments
 (0)