09 Reactor模式
目前存在很多的网络通信库从C的libevent库到Java的Netty框架再到python的Twisted库等目前主流的网络库使用的都是Reactor模式中文译作 反应器模式或反射器模式。那么到底什么是Reactor模式呢Reactor模式有什么优点Reactor模式英文解释如下The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to the associated request handlers.翻译成中文的意思就是反应器设计模式(Reactor pattern)是一种事件处理设计模式该模式可以将一个或多个IO请求服务并发地传递给服务处理器即当IO处理请求抵达后服务处理程序使用多路复用技术然后同步地派发这些请求至相关的请求处理程序。流程图如下从流程图上来看这个设计模式看起来很简单其背后却蕴含着不简单的设计思想。那么上图中到底蕴含着什么样的思想奥妙呢它解决了计算机世界中普遍存在的一个问题即请求太多资源太少。也就是说一个对外服务程序其接收的各种输入输出请求的数量可能是非常多的然后由于处理能力有限其处理这些请求的资源数量是有限的。诚然大千世界也是这样如一个公园的游客容量是有限的而游客数量可能是无限的一个饭店的座位是有限的而顾客可能是无限的一个国家的领土是有限的其人口可能是无限增长的。所以上图中输入输出请求数量之和一般会远远大于处理程序数量而多路复用器IO Demultiplexer将这些数量众多的输入输出请求分发给有限的处理程序。所以一个Reactor模式结构一般包含以下模块资源请求事件Resource Request多路复用器与事件分发器IO Demultiplexer Event Dispatcher事件处理器EventHandler我们以目前大多数饭店的运营模式这样一个生活中的例子来说明一下reactor模式顾客去饭店吃饭由于客户较多饭店的服务员数量有限所以饭店都是某个服务员负责某几桌客户当顾客有需求时点菜、结账等可以把需要告诉服务员由服务员去把这些需求再转发给其他相关人员点菜转发给厨房结账交给收银。如此操作在即使饭店顾客爆满时靠几个服务员也能有条不紊地运转着整个饭店。这是很简单的生活例子却有着最朴素的思想在对应具体的服务器程序技术上来说以socket的读写为例输入输出请求就是socket上有数据可读或者需要往socket上写入数据而IO复用器就对应着操作系统的相关APIWindows 操作系统上有select技术函数Linux 上有 select 函数、poll函数、epoll技术实际对应epoll_wait。关于这几个函数的用法在第四章已经介绍过了。使用这些IO复用技术之后Reactor模式对应的流程图就变成了如下结构注意实际在处理socket可写事件即如何发送数据还有有一些重要的细节需要注意我将在本专栏第五节介绍。