学习网站网址大全,自己怎么设计logo制作,quot 网站建设话术 quot,建行个人手机银行app下载Netty的线程模型 Netty的线程模型知识拓展单Reactor单线程模型单Reactor多线程模型主从Reactor模型 Netty的线程模型
Netty通过Reactor模型基于多路复用器接收并处理用户请求的#xff0c;多路复用IO模型参考#xff1a; 多路复用IO模型: 操作系统的IO模型有哪些#xff1f… Netty的线程模型 Netty的线程模型知识拓展单Reactor单线程模型单Reactor多线程模型主从Reactor模型 Netty的线程模型
Netty通过Reactor模型基于多路复用器接收并处理用户请求的多路复用IO模型参考 多路复用IO模型: 操作系统的IO模型有哪些
多路复用就是首先去阻塞的调用系统询问内核数据是否准备好如果准备好再重新进行系统调用进行数据拷贝。常见的实现有select、epoll和poll三种。
Netty的线程模型并不是一成不变的它实际取决于用户的启动参数配置。通过设置不同的启动参数Netty支持三种模型分别是Reactor单线程模型、Reactor多线程模型、Reactor主从多线程模型。
知识拓展
单Reactor单线程模型
这是最简单的Reactor模型当有多个客户端连接到服务器的时候服务器会先通过线程A和客户端建立连接有连接请求后线程A会将不同的事件比如连接事件、读事件、写事件进行分发譬如有IO读写事件之后会把该事件交给具体的Handler进行处理。
看图 而线程A就是我们所说的Reactor模型中的ReactorReactor内部有一个dispatch分发器。【注意这里的Reactor单线程主要是负责事件的监听和分发】
此时一个Reactor既负责处理连接请求又要负责处理读写请求一般来说处理连接请求时很快的但是处理具体的读写请求就要涉及字节的复制相对慢太多。Reactor正在处理读写请求的时候其他的请求只能等着只有等处理完了才可以处理下一个请求。
通过一个Reactor线程只能对应一个CPU发挥不出来多核CPU的优势。所以一个Reactor线程处理简单的小容量场景还是OK的但是对于高负载来说还是需要进一步升级。
单Reactor多线程模型
为了利用多核CPU的优势也为了防止在Reactor线程等待读写事件时候浪费CPU所以可以增加一个worker的线程池由此升级为单Reactor多线程模式。
看图 整体流程如下
当多个客户端进入服务器后Reactor线程会监听多种事件比如连接事件、读事件、写事件如果监听到连接事件则把该事件分配给acceptor处理如果监听到读事件那么则会发起系统调用将数据写入内存之后再把数据交给工作线程池进行业务处理。
这个时候我们会发现业务处理的逻辑已经编程多线程处理了。不过一个Reactor既要负责连接事件又要负责读写事件同时还要负责数据准备的过程。因为copy数据是阻塞的假如说Reactor阻塞到拷贝数据的时候服务器进来了很多连接这个时候这些连接是很有可能会被服务器拒绝掉的。
So单个Reactor看来是不够的我们需要多个Reactor来处理。
主从Reactor模型
在主从Reactor模型中主Reactor线程只负责连接事件的处理它把读写事件全部交给了子Reactor线程这样即使在数据准备阶段子线程被阻塞主Reactor还是可以处理连接事件。巧妙的解决了高负载下的连接问题。
看图