Reactor的NIO线程模型
1.Reactor单线程模型
传统的javaNIO通信的线程模型。该线程模型仅有一个I/O线程处理所有的I/O操作,如下图:

所有的客户端都连接到一个I/O线程负责的Acceptor上,连接成功后,由Reactor里的Dispatch将接收的ByteBuffer分发到指定的Handler上处理,进行解码,业务处理,编码及发送给客户端等过程。整个过程I/O线程都是异步非阻塞方式实现。
I/O线程完成的工作:
1)服务端NIO线程用于监听客户端连接
2)客户端NIO线程用于向服务器端发送连接请求
3)客户端和服务端的读写操作
不足:
1)如果客户端同时有成百上千的请求,会导致I/O线程不停的工作,CPU利用率负荷超载,同时造成很多客户端超时得不到响应
2)一旦I/O线程出现异常,可能会导致所有客户端掉线,造成系统单点故障
2.多线程的Reactor模型
多线程模型采用1个线程接收客户端请求,同时使用1个线程池处理读写等操作。模型如下:

其中Acceptor单线程用于监听及接收client的连接请求,连接成功后会将这些连接注册到WorkThreadPool(工作线程池)的其中一个线程上,由工作线程池分出1个工作线程用于和该client的读写、编码、解码操作。一个client只能和一个工作线程对应,不能注册到多个工作线程,防止出现并发操作问题。
WorkThreadPool由一个任务队列和N个线程组成,client连接成功后的读写请求都会放到任务队列中,工作线程池会从任务队列中获取任务、分配线程进行处理。
注意:这里的工作线程并不是业务处理线程,工作线程只是负责业务线程处理前或者业务线程处理后的读写和编解码操作。比如解码成功后获取对应的消息内容后,对这些消息的处理是由单独的业务线程处理的,当然业务线程一般也是有自己的线程池。
不足:单独的Acceptor线程会成为系统的瓶颈,一旦出现问题,后面的工作线程池也无法工作。
3.主从Reactor模型
该模型是的Acceptor由一个线程池MainReactorThreadPool负责监听和接收client的连接、认证等,同时由另一个SubReactorThreadPool线程池负责读写、编码等工作。模型如下:

该模型可以有效解决Acceptor单线程瓶颈问题,同时能提高客户端并发能力,稳定性和处理效率高。
Netty支持上面三种不同的线程模型,针对不同的业务需求可以设置不同的启动参数,选择对应的线程模型,不过netty官网推荐使用第三种主从模式。
Reactor的NIO线程模型的更多相关文章
- Java NIO学习与记录(六): NIO线程模型
NIO线程模型 上一篇说的是基于操作系统的IO处理模型,那么这一篇来介绍下服务器端基于IO模型和自身线程的处理方式. 一.传统阻塞IO模型下的线程处理模式 这种处理模型是基于阻塞IO进行的,上一篇讲过 ...
- Reactor三种线程模型与Netty线程模型
文中所讲基本都是以非阻塞IO.异步IO为基础.对于阻塞式IO,下面的编程模型几乎都不适用 Reactor三种线程模型 单线程模型 单个线程以非阻塞IO或事件IO处理所有IO事件,包括连接.读.写.异常 ...
- 【Netty源码分析】Reactor线程模型
1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一. 在Java领域当时比 ...
- Netty Reactor 线程模型笔记
引用: https://www.cnblogs.com/TomSnail/p/6158249.html https://www.cnblogs.com/heavenhome/articles/6554 ...
- eventloop & actor模式 & Java线程模型演进 & Netty线程模型 总结
eventloop的基本概念可以参考:http://www.ruanyifeng.com/blog/2013/10/event_loop.html Eventloop指的是独立于主线程的一条线程,专门 ...
- Netty线程模型
一.Reactor模型 1.单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下: 1)作为NIO服务端,接收客户端的TCP连接: 2)作为NI ...
- Netty IO线程模型学习总结
Netty框架的 主要线程是IO线程.线程模型的好坏直接决定了系统的吞吐量.并发性和安全性. Netty的线程模型遵循了Reactor的基础线程模型.以下我们先一起看下该模型 Reactor线程模型 ...
- Netty系列之Netty线程模型
Reference: http://www.infoq.com/cn/articles/netty-threading-model 1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 ...
- netty之==线程模型
1.1 netty线程模型本质遵循了Reactor的基础线程模型,所以得先介绍Reactor模型 1.2 Reactor模型 无论是C++还是Java编写的网络框架,大多数都是基于Reactor模 ...
随机推荐
- 结对编程作业(java)
结对对象:许峰铭 一.Github项目地址:https://github.com/Leungdc/Leungdc/tree/master/%E5%9B%9B%E5%88%99%E8%BF%90%E7% ...
- 基于Morphia实现MongoDB按小时、按天聚合操作
MongoDB按照天数或小时聚合 需求 最近接到需求,需要对用户账户下的设备状态,分别按照天以及小时进行聚合,以此为基础绘制设备状态趋势图. 实现思路是启动定时任务,对各用户的设备状态数据分别按照小时 ...
- Asp.Net六大内置对象
前面学习mvc管道处理模型的时候,我们晓的HttpContext是贯穿全文的一个对象,在HttpRuntime产生,现在我们所谓的Asp.Net六大内置对象,其实就是HttpContext的属性.具体 ...
- Golang 需要避免踩的 50 个坑(三)
前言 Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免会遇到很多坑,不过它们大多不是 Go 本身的设计缺陷.如果你刚从其他语言转到 Go,那这篇文章里的坑多半会踩到. 如果花时间学习官方 ...
- c# 根据一个给定经纬度的点和距离,搜索附近5公里范围的地点
功能需求:需要查询一个站点(已知该站点经纬度)5公里范围内的其它站点. 方 法 一 :对每条记录,去进行遍历,跟数据库中的每一个点进行距离计算,当距离小于5公里时,认为匹配(效率极其低下,耗时长). ...
- Jenkins + Pipeline + Git + Maven (十)
一.准备环境介绍 192.168.5.71 # gitlab 仓库IP 192.168.5.72 # 开发环境,用于提交代码等 192.168.5.73 # tomcat 部署solo服务站点 192 ...
- pointnet++的pytorch实现
代码参考:https://blog.csdn.net/weixin_39373480/article/details/88934146 def recognize_all_data(test_area ...
- WebSocket协议-基础篇
本篇文章主要讲述以下几点: WebSocket协议出现的背景 WebSocket与HTTP WebSocket API WebSocket协议出现的背景 我们在上网过程中经常用到的是HTTP和HTTP ...
- 第一章 了解Web及网络基础
第一章 了解Web及网络基础 Web建立基础.HTTP如何诞生发展 1.使用HTTP协议访问Web 在浏览器地址栏中输入URL之后过程: 1)DNS 解析:浏览器查询 DNS,获取域名对应的 IP 地 ...
- [LeetCode] 659. Split Array into Consecutive Subsequences 将数组分割成连续子序列
You are given an integer array sorted in ascending order (may contain duplicates), you need to split ...