Skip to content

事件驱动与高性能服务器

事件驱动的实质,即通过主循环加事件触发的方式来运行程序

异步I/O不仅仅应用在文件操作中。对于网络套接字的处理,Node也应用到了异步I/O,网络套接字上侦听到的请求都会形成事件交给I/O观察者。事件循环会不停地处理这些网络I/O事件。如果JavaScript有传入回调函数,这些事件将会最终传递到业务逻辑层进行处理。利用Node构建Web服务器,正是在这样一个基础上实现的。

An image

下面为几种经典的服务器模型,这里对比下它们的优缺点。

  • 同步式:对于同步式的服务,一次只能处理一个请求,并且其余请求都处于等待状态。
  • 每进程/每请求:为每个请求启动一个进程,这样可以处理多个请求,但是它不具备扩展性,因为系统资源只有那么多。
  • 每线程/每请求:为每个请求启动一个线程来处理。尽管线程比进程要轻量,但是由于每个线程都占用一定内存,当大并发请求到来时,内存将会很快用光,导致服务器缓慢。

每线程/每请求的扩展性比每进程/每请求的方式要好,但对于大型站点而言依然不够。

每线程/每请求的方式目前还被Apache所采用。Node通过事件驱动的方式处理请求,无须为每一个请求创建额外的对应线程,可以省掉创建线程和销毁线程的开销,同时操作系统在调度任务时因为线程较少,上下文切换的代价很低。这使得服务器能够有条不紊地处理请求,即使在大量连接的情况下,也不受线程上下文切换开销的影响,这是Node高性能的一个原因。

事件驱动带来的高效已经渐渐开始为业界所重视。知名服务器Nginx,也摒弃了多线程的方式,采用了和Node相同的事件驱动。如今,Nginx大有取代Apache之势。Node具有与Nginx相同的特性,不同之处在于Nginx采用纯C写成,性能较高,但是它仅适合于做Web服务器,用于反向代理或负载均衡等服务,在处理具体业务方面较为欠缺。Node则是一套高性能的平台,可以利用它构建与Nginx相同的功能,也可以处理各种具体业务,而且与背后的网络保持异步畅通。两者相比,Node没有Nginx在Web服务器方面那么专业,但场景更大,自身性能也不错。在实际项目中,我们可以结合它们各自优点,以达到应用的最优性能。