1.Reactor单线程模型

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

 
单线程模型的Reactor

所有的客户端都连接到一个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个线程池处理读写等操作。模型如下:

 
多线程的Reactor

其中Acceptor单线程用于监听及接收client的连接请求,连接成功后会将这些连接注册到WorkThreadPool(工作线程池)的其中一个线程上,由工作线程池分出1个工作线程用于和该client的读写、编码、解码操作。一个client只能和一个工作线程对应,不能注册到多个工作线程,防止出现并发操作问题。

WorkThreadPool由一个任务队列和N个线程组成,client连接成功后的读写请求都会放到任务队列中,工作线程池会从任务队列中获取任务、分配线程进行处理。

注意:这里的工作线程并不是业务处理线程,工作线程只是负责业务线程处理前或者业务线程处理后的读写和编解码操作。比如解码成功后获取对应的消息内容后,对这些消息的处理是由单独的业务线程处理的,当然业务线程一般也是有自己的线程池。

不足:单独的Acceptor线程会成为系统的瓶颈,一旦出现问题,后面的工作线程池也无法工作。

3.主从Reactor模型

该模型是的Acceptor由一个线程池MainReactorThreadPool负责监听和接收client的连接、认证等,同时由另一个SubReactorThreadPool线程池负责读写、编码等工作。模型如下:

 
主从Reactor模型

该模型可以有效解决Acceptor单线程瓶颈问题,同时能提高客户端并发能力,稳定性和处理效率高。

Netty支持上面三种不同的线程模型,针对不同的业务需求可以设置不同的启动参数,选择对应的线程模型,不过netty官网推荐使用第三种主从模式。

参考:https://www.cnblogs.com/ivaneye/p/5731432.html

http://blog.csdn.net/yexin94822739/article/details/73334006

Reactor的NIO线程模型的更多相关文章

  1. Java NIO学习与记录(六): NIO线程模型

    NIO线程模型 上一篇说的是基于操作系统的IO处理模型,那么这一篇来介绍下服务器端基于IO模型和自身线程的处理方式. 一.传统阻塞IO模型下的线程处理模式 这种处理模型是基于阻塞IO进行的,上一篇讲过 ...

  2. Reactor三种线程模型与Netty线程模型

    文中所讲基本都是以非阻塞IO.异步IO为基础.对于阻塞式IO,下面的编程模型几乎都不适用 Reactor三种线程模型 单线程模型 单个线程以非阻塞IO或事件IO处理所有IO事件,包括连接.读.写.异常 ...

  3. 【Netty源码分析】Reactor线程模型

    1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一. 在Java领域当时比 ...

  4. Netty Reactor 线程模型笔记

    引用: https://www.cnblogs.com/TomSnail/p/6158249.html https://www.cnblogs.com/heavenhome/articles/6554 ...

  5. eventloop & actor模式 & Java线程模型演进 & Netty线程模型 总结

    eventloop的基本概念可以参考:http://www.ruanyifeng.com/blog/2013/10/event_loop.html Eventloop指的是独立于主线程的一条线程,专门 ...

  6. Netty线程模型

    一.Reactor模型 1.单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下: 1)作为NIO服务端,接收客户端的TCP连接: 2)作为NI ...

  7. Netty IO线程模型学习总结

    Netty框架的 主要线程是IO线程.线程模型的好坏直接决定了系统的吞吐量.并发性和安全性. Netty的线程模型遵循了Reactor的基础线程模型.以下我们先一起看下该模型 Reactor线程模型 ...

  8. Netty系列之Netty线程模型

    Reference: http://www.infoq.com/cn/articles/netty-threading-model 1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 ...

  9. netty之==线程模型

    1.1 netty线程模型本质遵循了Reactor的基础线程模型,所以得先介绍Reactor模型  1.2  Reactor模型 无论是C++还是Java编写的网络框架,大多数都是基于Reactor模 ...

随机推荐

  1. JS 判断设备来源

    1.js代码判断当前设备: function deviceType(){ var ua = navigator.userAgent; var agent = ["Android", ...

  2. visudo: /etc/sudoers is busy, try again later

    启动visudo时,报错"visudo: /etc/sudoers is busy, try again later" 解决思路:杀掉visudo进程 ps -ef|grep vi ...

  3. Swagger从入门到放弃

    如何编写基于OpenAPI规范的API文档 简介 Swagger Swagger是一个简单但功能强大的API表达工具.支持的语言种类繁多 使用Swagger生成API,我们可以得到交互式文档,自动生成 ...

  4. firewalld规则写法

    需要注意的是Firewalld中的区域与接口 一个网卡仅能绑定一个区域.比如: eth0-->A区域 但一个区域可以绑定多个网卡.比如: B区域-->eth0.eth1.eth2 可以根据 ...

  5. 201871010131-张兴盼《面向对象程序设计(java)》第十五周学习总结

    博文正文开头格式:(2分) 项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://ww ...

  6. 洛谷 U86501 趣味擂台

    洛谷 U86501 趣味擂台 题目传送门 题目背景 \(JDFZ\)\(2019\)秋季运动会开始辣!运动会中有一个叫做"趣味擂台"的游戏...... 题目描述 游戏内容是这样的: ...

  7. 使用教育邮箱免费申请JetBrains套装(IntelliJ, PhpStorm, WebStorm...)

    想下个PhpStorm来写php,发现可以使用教育账号白嫖. 申请步骤 打开 申请页面 ,点击 “APPLY NOW” 开始申请. 填写姓名,以及学校提供给你的邮箱(edu后缀邮箱,或.end.cn) ...

  8. Win10 Mactype 字体优化

    1.下载安装 Mactype :http://www.mactype.net/ 2. 打开MacType Tray.exe,右键其在任务栏图标就能选择配置文件. 分享一个配置文件: [General] ...

  9. Python进阶-Ⅷ 匿名函数 lambda

    1.匿名函数的引入 为了解决那些功能很简单的需求而设计的一句话函数 def func(i): return 2*i # 简化之后 func = lambda i:2*i #todo 其中:func是函 ...

  10. A1038 Recover the Smallest Number (30 分)

    一.技术总结 此问题是贪心类问题,给出可能有前导零的数字串,将他们按照某个顺序拼接,使生成的数最小. 解决方案,就是使用cmp函数,因为两两字符串进行拼接,进行排序从小到大. 拼接过后会有0可能出现在 ...