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. luogu4173 残缺的字符串

    there #include <algorithm> #include <iostream> #include <cstring> #include <cst ...

  2. python - 路径处理 和 模块导入

    # -*- coding:utf-8 -*- '''@project: jiaxy@author: Jimmy@file: study_模块导入.py@ide: PyCharm Community E ...

  3. 精通CSS高级Web标准解决方案(1-3 规划、组织与维护样式表)

    对文档应用样式 对代码进行注释/*......*/ 结构性注释 自我提示 删除注释.优化样式表 样式指南:解释代码与站点的视觉设计是如何组织在一起的 站点结构.文件结构.命名规则 编码标准:(X)ht ...

  4. POJ 1609 Tiling Up Blocks

    Tiling Up Blocks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4675   Accepted: 1824 ...

  5. Js 希望某链接只能点击一次

    <a onclick=”function(){...}”> 希望这连接只能执行一次 <a onclick=”function(){...}; this.onclick()=funct ...

  6. 刷题总结——运输计划(bzoj4326)

    题目: 题目背景 NOIP2015 提高组 Day2 T3 题目描述 公元2044年,人类进入了宇宙纪元. L国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道 ...

  7. [POI2006] KRA-The Disks (贪心)

    题目描述 For his birthday present little Johnny has received from his parents a new plaything which cons ...

  8. python 命令行传入参数

    创建 test.py 文件,代码如下: #!/usr/bin/python # -*- coding: gbk -*- import sys print sys.argv if __name__==' ...

  9. 【CF1028C】Rectangles(线段树)

    题意: n<=1e5,abs(x[i]),abs(y[i]<=1e9 思路:这是正解 离散后线段树强打,数据结构越学越傻 #include<cstdio> #include&l ...

  10. 学习javascript设计模式之单例模式

    1.单例模式的核心是确保只有一个实例,并提供全局访问. 2.惰性单例 指的是在需要的时候才创建对象实例. 如在页面中创建唯一div 普通做法 var createDiv = (function(){  ...