我们知道了Nginx是做什么的以及它为何如此高效,以至于全宇宙拿它来做负载均衡或者说web server。
但是如果你只是了解了使用和知道了原理就认为已经掌握了它,那只能说你肤浅了,原理和使用技能看看大家都知道了,没必要拿出去和别人拽,但凡你和别人说Nginx的epoll我清楚,Master-Worker是如何工作的,初级选手可能觉得你真牛,你真厉害,可是碰到高手了,你那最多只是熟悉了这个组件而已,你并没有多大的成长,而高手通过对Nginx的深入了解,他能发现其中的秘籍,这个秘籍可以帮助他触类旁通其他组件,从而用最短的时间掌握更多的技术,在互联网领域立足不败之地。
那么高手是如何通过对Nginx的学习使自己达到更高的境界呢?
设计模式
别笑,学会了设计模式,你就可以自豪的说出金庸先生在《倚天屠龙记》里九阳真经的口诀:他强由他强,清风拂山岗;他横由他横,明月照大江。他自狠来他自恶,我自一口真气足。懂得人都懂,不懂的人自悟。
原谅我说这么多,请开始正题Reactor模式。
前面有写Reactor模式的文章,那篇文章主要是普及下概念,这次是重点介绍。
Reactor 模式,是指通过一个或多个输入同时传递给服务处理器的服务请求的事件驱动处理模式。服务端程序处理传入多路请求,并将它们同步分派给请求对应的处理线程,Reactor 模式也叫 Dispatcher 模式。
即I/O多路复用统一监听事件,收到事件后分发(Dispatch 给某进程),是编写高性能网络服务器的必备技术之一。
Reactor 模式中有 2 个关键组成:
根据 Reactor 的数量和处理资源池线程的数量不同,有 3 种典型的实现:
下面详细介绍这 3 种实现方式。
其中,Select是前面 I/O 复用模型介绍的标准网络编程API,可以实现应用程序通过一个阻塞对象监听多路连接请求,其他方案示意图类似。
方案说明:
方案说明:
相关视频推荐
reactor 网络模型在开源框架中的应用
8个nginx面试题,助你了解nginx的底层设计
16万行Nginx源码,就该这么读
学习地址:c/c++ linux服务器开发/后台架构师
需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享
针对单 Reactor 多线程模型中,Reactor 在单线程中运行,高并发场景下容易成为性能瓶颈,可以让 Reactor 在多线程中运行。
方案说明:
3种模式可以用个比喻来理解:(餐厅常常雇佣接待员负责迎接顾客,当顾客入坐后,侍应生专门为这张桌子服务)
Reactor 模式具有如下的优点:
但它和主从reactor模式又有一定的区别,区别主要就是这个master进程,这个master进程不同于一般的主从式reactor(一般的主从式reactor设计会是主reactor负责将连接accept下来,然后再将连接fd挂载到子reactor中),这个master进程的主要任务就是监听信号的,也就是对nginx的一些命令做处理,然后再将这些处理通过sockerpair()或者信号等方式通知给worker进程,master进程同时监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。同时,这个master进程负责listen这个整个服务器的监听fd,然后worker进程通过竞争accept_mutex互斥锁来将连接从全连接队列里取出来,然后进行后续的事件循环处理。
也就是说除了Master与主从Reactor中的主线程Reactor不同以外,Worker的处理流程和子线程Reactor的处理流程几乎一摸一样,用陈硕老师的话来说就是reactors in process。
知道了Reactor模式之后再回头想想看看哪些你了解的服务或者中间件使用了此模式,要学会触类旁通才能更胜一筹,进而成为高手。这个模式还有一个最精妙的地方在于把复杂的问题通过"中间层"的方式简单化。计算机界不是有句老话:“凡是服务不能通过现有常规技术手段解决的,就加一个中间层来解决”。此话真的一语点醒梦中人,Reactor主从模式把频繁的accept过程,其他fd的并发IO处理过程以及业务处理逻辑部分分层,通过加层的方式让整个模式快速而高效的运行起来,这就是智慧,人类的智慧。