Reactor模式究竟是个什么东西呢?这要从事件驱动的开发方式说起。我们知道,对于应用服 务器,一个主要规律就是,CPU的处理速度是要远远快于IO速度的,如果CPU为了IO操作(例 如从Socket读取一段数据)而阻塞显然是不划算的。好一点的方法是分为多进程或者线程去进 行处理,但是这样会带来一些进程切换的开销,试想一个进程一个数据读了500ms,期间进程 切换到它3次,但是CPU却什么都不能干,就这么切换走了,是不是也不划算?
这时先驱们找到了事件驱动,或者叫回调的方式,来完成这件事情。这种方式就是,应用业务 向一个中间人注册一个回调(event handler),当IO就绪后,就这个中间人产生一个事件, 并通知此handler进行处理。这种回调的方式,也体现了“好莱坞原则”(Hollywood principle)-“Don’t call us, we’ll call you”,在我们熟悉的IoC中也有用到。看来软件开发 真是互通的!
好了,我们现在来看Reactor模式。在前面事件驱动的例子里有个问题:我们如何知道IO就绪 这个事件,谁来充当这个中间人?Reactor模式的答案是:由一个不断等待和循环的单独进程 (线程)来做这件事,它接受所有handler的注册,并负责先操作系统查询IO是否就绪,在就 绪后就调用指定handler进行处理,这个角色的名字就叫做Reactor。
Reactor的3种版本:单线程模式、多线程模式、主从多线程模式