Nginx学习(11)—Nginx架构设计(1) - Go语言中文社区

Nginx学习(11)—Nginx架构设计(1)


Nginx架构设计

这里先说下Nginx设计时重视的几个关键点:
  • 性能:包括网络性能,单词请求的延迟性,网络效率;(名词就不解释了~)
  • 可伸缩性:可通过添加组件来提升服务,或者允许组件之间具有交互功能;
  • 简单性:组件的简单程度,便于理解和实现;
  • 可修改性:包括可进化性,可扩展性,可定制性,可配置性,可重用性;
  • 可见性:可监控关键组件的运行情况;
  • 可移植性:跨平台运行;
  • 可靠性:在服务出现故障时,一个架构容易受到系统层面故障影响的程度;

模块化设计

高度模块化的设计是Nginx的架构基础。在Nginx中,除了少量的核心代码,其他一切皆为模块。这一点在之前的模块开发的实践中已经感受到了。

所有模块都遵循ngx_module_t的接口设计,并且所有模块间都是分层次、分类别的。

官方Nginx共有五大类型模块:核心模块、配置模块、事件模块、HTTP模块、mail模块

它们都各具备相同的ngx_module_t接口,但在请求处理流程中的层次不相同。

Nginx常用模块间的关系如下图:


配置模块与核心模块由Nginx的框架代码定义。其中,配置模块是所有模块的基础,它实现最基本的解析功能(即解析nginx.conf文件)。然后,Nginx框架会调用核心模块,其他三种模块则不会与框架产生直接关系。如上图示,事件模块、HTTP模块、mail模块在核心模块中分别都有一个自己的“代言人”,并在同类模块中有一个作为核心业务与管理功能的模块。比如,事件模块由其代言人ngx_events_module核心模块定义,但所有事件模块加载又由ngx_event_core_module负责。

在上图中,配置模块与核心模块都是与Nginx框架密切相关的,是其他模块的基础。而事件模块又是HTTP模块和mail模块的接触。HTTP模块与mail模块更关注于应用层面,地位相似。

事件驱动架构

事件驱动架构,简单来生活,就是由一些时间发生源产生事件,由一个或多个事件收集器来收集、分发时间,然后许多时间处理器会注册自己感兴趣的事件,同时会“消费”这些事件。

Nginx采用完全的事件驱动架构来处理业务,与传统的Web服务器不同。区别用图示:
  • 传统Web服务器处理事件模型
         

  • Nginx处理事件模型
        

两者最重要差别:传统Web服务器是每个事件消费者独占一个进程资源,Nginx的事件消费者只是被事件分发进程短期调用。

这样的设计使得网络性能、用户感知的请求延时得到提升。但同时带来的一个弊端:每个时间消费者不能有阻塞行为,否则会由于长时间占用分发者进程而导致其他事件得不到响应。更进一步说,就是不能让分发者进程转为休眠或等待状态。
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/abv123456789/article/details/24481197
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢