微信公众号:郑尔多斯
关注可了解更多的知识。任何问题或建议,请公众号留言;
关注公众号,有趣有内涵的文章第一时间送达!
事件驱动框架
我们前面分析过,在中,会将每个监听端口的设置为函数,然后把对应的加入到驱动模块中。这样,在执行的时候,如果有新连接事件出现,那么就会调用方法进行建立连接。
为了解决惊群现象和负载均衡问题,使用了以及事件处理机制,那么什么是事件处理机制?
所谓的事件处理机制就是允许事件延后执行。设计了两个队列,一个是由被触发的监听连接的读事件构成的队列,另一个是由普通读/写事件构成的队列。
将产生的事件,分别存放到这两个队列中。让存放新连接事件的队列优先执行,存放普通事件的队列最后执行,这样就可以保证建立连接的及时性,同时这也是解决惊群和负载均衡的关键所在。
ngx_event_accept
上面的代码我做了删减,把一些错误判断和非平台代码删除,这个并不影响代码的功能和阅读,现在我们简单的分析一下这个源码:
首先这个是一个循环,循环的条件就是,该条件控制是否一次建立多个连接。
循环体首先使用函数创建一个连接
设置变量,然后调用获取一个连接。
下面就是设置我们上一步获取的连接的各个属性。
最重要的一步是最后的代码:
我们前面知道,其实就是,从这个函数开始,我们就进入了初始化的过程了。
multi_accept的作用
Syntax: multi_accept on | off;
Default: multi_accept off;
Context: events
If multi_accept is disabled, a worker process will accept one new connection at a time. Otherwise, a worker process will accept all new connections at a time.
The directive is ignored if kqueue connection processing method is used, because it reports the number of new connections waiting to be accepted.
中文翻译:
如果multi_accept被禁止了,nginx一个工作进程只能同时接受一个新的连接。否则,一个工作进程可以同时接受所有的新连接。
如果nginx使用kqueue连接方法,那么这条指令会被忽略,因为这个方法会报告在等待被接受的新连接的数量。
如果启用了这个参数,那么当一个worker进程获取到accept_mutex之后,会一次尽可能的多的建立连接。
领取专属 10元无门槛券
私享最新 技术干货