Nginx底层设计与源码分析
上QQ阅读APP看书,第一时间看更新

2.3 Nginx事件驱动

Nginx全异步事件驱动框架是保障其高性能的重要基石。事件驱动并不是Nginx首创的,这一概念在计算机领域很早就出现了。它指的是在持续的事件管理过程中进行决策的一种策略,即跟随当前时间点上出现的事件,调动可用资源,执行相关任务,使不断出现的问题得以解决,防止事务堆积。通常,事件驱动框架主要由3部分组成:事件收集器、事件发生器、事件处理器。顾名思义,事件收集器专门负责收集所有的事件。作为一款Web服务器,Nginx主要处理的事件来自网络和磁盘,包括TCP连接的建立与断开、接收和发送网络数据包、磁盘文件的I/O操作等。事件分发器则负责将收集到的事件分发到目标对象中。Nginx通过Event模块实现了读/写事件的管理和分发。事件处理器作为消费者,负责接收分发过来的各种事件并处理。通常,Nginx中每个模块都有可能成为事件消费者。当模块处理完业务逻辑之后立刻将控制权交还给Event模块,进行下一个事件的调度与分发。由于消费事件的主体是各HTTP模块,事件处理函数在一个进程中完成,因此只要各HTTP模块不让进程进入休眠状态,整个请求的处理过程是非常迅速的。这是Nginx保持超高网络吞吐量的关键。当然,这种设计增加了编程难度,开发者需要通过一定的手段(例如异步回调的方式)解决阻塞问题。

不同操作系统提供了不同事件驱动模型,例如Linux 2.6系统同时支持epoll、poll、select模型,FreeBSD系统支持kqueue模型,Solaris 10系统支持eventport模型。为了保证其跨平台特性,Nginx的事件驱动框架完美地支持各类操作系统的事件驱动模型。针对每一种模型,Nginx设计了一个Event模块,包括ngx_epoll_module、ngx_poll_module、ngx_select_module、ngx_kqueue_module等事件驱动模块。事件驱动框架会在模块初始化时选取其中一个作为Nginx进程的事件驱动模块。对于大多数生产环境中Liunx系统的Web服务器,Nginx默认选取最强大的事件驱动模型epoll,这部分知识我们将在第7章进行详细讲解。