【Nginx】事件驱动框架和异步处理

Nginx对请求的处理是通过事件触发的,模块作为事件消费者,只能被事件收集、分发器调用。这与传统的Web服务器是不同的。传统的Web服务器下,一个请求由一个进程消费,请求在建立连接后将始终占用着系统资源,直到连接关闭才会释放资源。这样做有以下缺点:

  • 进程数增加会增加进程间切换的负担,影响系统整体性能。
  • 当某个进程要等待事件发生而处于阻塞状态时,该进程仍然占用内存资源直到该请求结束,造成资源极大浪费。

在Nginx中,接收到一个请求时,不会产生一个单独的进程来处理该请求,而是由事件收集、分发器(进程)调用某个模块,由模块处理请求,处理完后再返回到事件收集、分发器,如下图所示:

左侧按序号收集事件,右侧按序号调用消费者模块。从图中可以看出这种设计的一个弊端:当某个消费者模块阻塞而无法返回到事件收集、分发器,使得后者无法继续监听事件,最终导致其它事件得不到及时响应。所有,时间消费者的代码中不能有阻塞行为!

说到事件驱动机制,就要联系到异步处理了,因为两者是密切相关的:多阶段异步处理只能基于事件驱动框架实现。一个HTTP请求包含多个阶段,每个阶段在什么时候发生是不确定的,这就造成了异步性。每个阶段的发生都会触发事件驱动框架,然后交由事件消费者处理。也就是说一个事件消费者只是处理了一个请求中的一小部分。Nginx采用这样的设计,降低了进程休眠的几率,从而提高网络性能、降低请求延时。所以,Nginx的这种设计服务器的并发连接数能够达到十万甚至百万级别。

参考:

《深入理解Nginx》 P263-P267.

【Nginx】事件驱动框架和异步处理,布布扣,bubuko.com

时间: 2024-10-18 07:23:06

【Nginx】事件驱动框架和异步处理的相关文章

【Nginx】事件驱动框架处理流程

ngx_event_core_module模块的ngx_event_process_init方法对事件模块做了一些初始化.其中包括将"请求连接"这样一个读事件对应的处理方法(handler)设置为ngx_event_accept函数,并将此事件添加到epoll模块中.当有新连接事件发生时,ngx_event_accept就会被调用.大致流程是这样: worker进程在ngx_worker_process_cycle方法中不断循环调用ngx_process_events_and_time

Nginx——事件驱动机制(惊群问题,负载均衡)

事件框架处理流程 每个worker子进程都在ngx_worker_process_cycle方法中循环处理事件,处理分发事件则在ngx_worker_process_cycle方法中调用ngx_process_events_and_timers方法,循环调用该方法就是 在处理所有事件,这正是事件驱动机制的核心.该方法既会处理普通的网络事件,也会处理定时器事件. ngx_process_events_and_timers方法中核心操作主要有以下3个: 1)  调用所使用事件驱动模块实现的proce

【nginx】【转】Nginx启动框架处理流程

Nginx启动过程流程图: ngx_cycle_t结构体: Nginx的启动初始化在src/core/nginx.c的main函数中完成,当然main函数是整个Nginx的入口,除了完成启动初始化任务以外,也必定是所有功能模块的入口之处.Nginx的初始化工作主要围绕一个类型为ngx_cycle_t类型的全局变量(cycle)展开. ngx_cycle_t结构体类型: typedef struct ngx_cycle_s ngx_cycle_t; struct ngx_cycle_s { voi

Nginx Http框架的理解

HTTP框架是Nginx基础框架的一部分,Nginx的其它底层框架如master-worker进程模型.event模块.mail 模块等. HTTP框架代码主要有2个模块组成:ngx_http_module和ngx_http_core_module: 我们编写的HTTP模块需要注册到HTTP框架上,才能融入HTTP请求的处理流程中. 当在nginx.conf中存在一个http{...}的配置时,即启用了HTTP框架代码,在nginx配置解析时,就已经为框架建立好了各种数据结构(尤其是HTTP模块

nginx学习笔记七(nginx HTTP框架的执行流程)

之前已经介绍过nginx的事件框架.那么,对于client发出的一个http的请求,nginx的http框架是如何一步步解析这个http请求?http框架又是如何和之前介绍过得epoll事件模块结合起来的,下面来简要介绍下. 注:我手头上的nginx工程是nginx-1.9.14的,与<深入理解nginx>的版本不一致,在http框架这块的代码上也有着较大的区别. 一.ngx_http_init_connection 在http框架初始化的时候(参见<深入理解nginx>第10章)

Python Twisted网络编程框架与异步编程入门教程

原作出处:twisted-intro-cn 作者:Dave 译者:杨晓伟 luocheng likebeta 转载声明:版权归原作出处所有,转载只为让更多人看到这部优秀作品合集,如果侵权,请留言告知 感 谢:感谢 杨晓伟 luocheng likebeta 为国内Twisted Coder做的里程碑级贡献 其 它:能访问到Github的童鞋,请访问出处链接.因为出处排版相当棒! 1.Twisted理论基础 2.异步编程初探与reactor模式 3.初次认识Twisted 4.由twisted支持

Tornado 框架中异步与非阻塞编程代码说明

在tornad官方文档的Docs>User's guide>Asynchronous and non-Blocking I/O部分,文中提供了几段示例代码: a.同步请求代码 from tornado.httpclient import HTTPClient def synchronous_fetch(url):     http_client = HTTPClient()     response = http_client.fetch(url)     return response.bo

Nginx学习之十一-Nginx启动框架处理流程

Nginx启动过程流程图 下面首先给出Nginx启动过程的流程图: ngx_cycle_t结构体 Nginx的启动初始化在src/core/nginx.c的main函数中完成,当然main函数是整个Nginx的入口,除了完成启动初始化任务以外,也必定是所有功能模块的入口之处.Nginx的初始化工作主要围绕一个类型为ngx_cycle_t类型的全局变量(cycle)展开. ngx_cycle_t结构体类型: typedef struct ngx_cycle_s ngx_cycle_t; struc

Nginx+PHP框架laravel状态码500错误解决!

我们先来看下报错 状态码是:==500== 通常是服务器那的错误. 然后 Emmmmmm..... 测试1 先修改了 index.php 的代码 在代码最前面加上了: echo "1111"; exit(); 看下返回结果: 可以看到,服务器可以正常解析. 然后我们看一下Nginx报错日志: ① 来到Nginx的日志目录下 cat error.log 我们看下返回结果: ==signal process started== ==是系统发出的通知,并非产生错误== 后来经过检查,发现数据