Nginx对请求的处理是通过事件触发的,模块作为事件消费者,仅仅能被事件收集、分发器调用。这与传统的Webserver是不同的。

传统的Webserver下,一个请求由一个进程消费。请求在建立连接后将始终占用着系统资源,直到连接关闭才会释放资源。这样做有下面缺点:

  • 进程数添加会添加进程间切换的负担。影响系统总体性能。

  • 当某个进程要等待事件发生而处于堵塞状态时,该进程仍然占用内存资源直到该请求结束。造成资源极大浪费。
在Nginx中,接收到一个请求时,不会产生一个单独的进程来处理该请求,而是由事件收集、分发器(进程)调用某个模块,由模块处理请求。处理完后再返回到事件收集、分发器,例如以下图所看到的:

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

说到事件驱动机制,就要联系到异步处理了。由于两者是密切相关的:多阶段异步处理仅仅能基于事件驱动框架实现。一个HTTP请求包括多个阶段。每一个阶段在什么时候发生是不确定的,这就造成了异步性。每一个阶段的发生都会触发事件驱动框架。然后交由事件消费者处理。也就是说一个事件消费者仅仅是处理了一个请求中的一小部分。Nginx採用这种设计,减少了进程休眠的几率,从而提高网络性能、减少请求延时。

所以,Nginx的这种设计server的并发连接数可以达到十万甚至百万级别。


參考:
《深入理解Nginx》 P263-P267.

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

  1. 事件驱动之Twsited异步网络框架

    在这之前先了解下什么是事件驱动编程 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结 ...

  2. Nginx:HTTP框架是如何介入请求

    参考资料 <深入理解Nginx>(陶辉) Nginx事件模块博客地址:http://www.cnblogs.com/runnyu/p/4914698.html Nginx是一个事件驱动构架 ...

  3. Nginx Http框架的理解

    Nginx Http框架的理解 HTTP框架是Nginx基础框架的一部分,Nginx的其它底层框架如master-worker进程模型.event模块.mail 模块等. HTTP框架代码主要有2个模 ...

  4. EDA 事件驱动框架

    事件代表过去发生的事件,事件既是技术架构概念,也是业务概念.以事件为驱动的编程模型称为事件驱动架构EDA. EDA是一种以事件为媒介,实现组件或服务之间最大松耦合的方式.传统面向接口编程是以接口为媒介 ...

  5. Python Web框架 tornado 异步原理

    Python Web框架 tornado 异步原理 参考:http://www.jb51.net/article/64747.htm 待整理

  6. Python web框架 Tornado异步非阻塞

    Python web框架 Tornado异步非阻塞   异步非阻塞 阻塞式:(适用于所有框架,Django,Flask,Tornado,Bottle) 一个请求到来未处理完成,后续一直等待 解决方案: ...

  7. 【Redis】事件驱动框架源码分析

    aeEventLoop初始化 在server.c文件的initServer函数中,对aeEventLoop进行了初始化: 调用aeCreateEventLoop函数创建aeEventLoop结构体,对 ...

  8. 【Redis】事件驱动框架源码分析(单线程)

    aeEventLoop初始化 在server.c文件的initServer函数中,对aeEventLoop进行了初始化: 调用aeCreateEventLoop函数创建aeEventLoop结构体,对 ...

  9. django在nginx uwsgi和tornado异步方案在项目中的体验

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://rfyiamcool.blog.51cto.com/1030776/1397495 ...

随机推荐

  1. 谋哥:搞APP,做得累的都不对!

    最近谋哥(微信viyi88)我刚加入“秦王会”,思想收到猛烈地冲击,各位大佬的思维有时候会让我大脑短路,收获不少.同时,我也慢慢发现我一直平静的 心开始浮躁,我发现苗头不对,于是开始静下心来.静下心, ...

  2. day03_07 变量的重新赋值01

    在cmd中退出python,需要使用quit()命令 name = "Alex Li" name2 = name print(name,name2) name = "Ja ...

  3. 06-python进阶-多线程下载器练手

    我们需要用python 写一个多线程的下载器 我们要先获取这个文件的大小 然后将其分片 然后启动多线程 分别去下载 然后将其拼接起来 #!/usr/bin/env python#coding:utf- ...

  4. TOJ1017: Tour Guide

      描述 You are working as a guide on a tour bus for retired people, and today you have taken your regu ...

  5. 下载,配置环境变量,第一个demo

    一.在 http://www.oracle.com 下载java JDK 安装到自定义的地方. 二.配置环境变量:在我的电脑→高级系统设置→环境变量 ① 找到Path新增一个路径(该路径为JDK存放的 ...

  6. IP地址资源的分配和管理

    IP地址资源的分配和管理 参考资料 https://wenku.baidu.com/view/3bdf94172cc58bd63086bd8c.html   http://www.iana.org/ ...

  7. 用-webkit-box-reflect制作倒影

    1.只在webkit内核的浏览器上有效果 2.语法: -webkit-box-reflect: <direction> <offset> <mask-box-image& ...

  8. 解决ul的li横向排列换行的问题

    1. 问题现象 先看下面的html结构: <div> <ul> <li><img src='./img/1.jpg'></li> <l ...

  9. 用Keepalived搭建双Nginx server集群,防止单点故障

    综述: 浏览器访问虚拟IP: 192.168.1.57, 该虚拟IP被Keepalived接管,两个Keepalived进程分别运行在物理IP为192.168.1.56和192.168.1.59服务器 ...

  10. mybatis foreach Map(String,List)类型

    <select id="queryList" resultType="com.performancetest.modules.ptest.entity.Stress ...