缘起
日前在看netty的工作原理,对netty的线程模型很是不能理解,查阅了诸多资料,终于有了一些眉目。特此记录,以备查阅。

阅读对象
netty中的NIO编程模型是基于java Nio的封装,所以需要读者对java NIO有一定的了解,篇幅所限,本文不会对NIO再做详述,有需要的读者可以查看​​JAVA BIO,NIO,AIO详解(附代码实现)以及Netty的简介​​

Netty的NIO线程模型
说netty的线程模型之前,先说传统NIO的使用方式中的关键代码

可以看到是当前线程获得了客户端的连接之后再重新把channel注册到selector上,同时把事件注册为读,这样就可以开始读消息了。也就是说获取tcp连接和读取消息都是在同一个线程里面处理的。那么这种方式有什么问题呢?对于一些小流量应用场景,可以使用单线程模型。但是对于高负载、大并发的应用场景却不合适,主要原因如下:

一个 NIO 线程同时处理成百上千的链路,性能上无法支撑,即便 NIO 线程的 CPU 负荷达到 100%,也无法满足海量消息的编码、解码、读取和发送;
当 NIO 线程负载过重之后,处理速度将变慢,这会导致大量客户端连接超时,超时之后往往会进行重发,这更加重了 NIO 线程的负载,最终会导致大量消息积压和处理超时,成为系统的性能瓶颈;
可靠性问题:一旦 NIO 线程意外跑飞,或者进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部消息,造成节点故障。

那么你可能会想,既然一个线程不行,那我在读取消息的时候采用线程池不就可以了吗?的确是可行的,事实上,在Netty中也确实是这么做的。

netty的一个启动程序如下

可以看到开头new了两个EventLoopGroup,EventLoopGroup可以暂时理解为一个线程组。其中bossGroup负责处理客户端的 TCP 连接请求,如果系统只有一个服务端端口需要监听,则建议 bossGroup 线程组线程数设置为 1,workerGroup 是真正负责 I/O 读写操作的线程组

先看一张netty的执行流程图

图中可以看到boosGroup在接收到请求后会重新注册到workerGroup上,也就是对应了前面说的bossGroup负责处理客户端的 TCP 连接请求,而workerGroup是真正负责 I/O 读写操作的线程组。就像软件开发里面的boss负责分配任务,而worker即程序员负责写代码。那么bossGroup是如何处理tcp的连接请求同时把他注册到workerGroup上的呢?

bossGroup是如何分配任务的
workerGroup中的每一个线程,都有一个多路复用器 Selector,bossGroup每接收到一个客户端连接,就会从workerGroup选择一个线程然后把channel注册到它的Selector上。

伪代码实现

boss中的代码

可以看到,bossGroup接收到了新客户端的请求后,就会调用一个算法,从多个worker中选取一个worker,然后调用worker的注册方法,把这个新客户端的channel注册上去。我们再看workerGroup中的注册方法实现

可以看到,就是把新的channel注册到自己的Selector上,注册好后就会触发workerGroup的堵塞代码块,这样这个workerGroup中的这个线程就会开始读取数据,下面看看worker线程读取数据的伪代码实现(其实就是普通的NIO中读取数据的方式)

总结:bossGroup负责处理客户端的 TCP 连接请求,bossGroup每接收到一个客户端连接,就会从workerGroup选择一个线程然后把channel注册到它的Selector上,这样的话请求接收和请求处理就通过不同的线程分开了,这也是netty高效的原因之一。当然Netty高效的原因绝不仅仅是由于优秀的线程模型的设计,与Netty的编码协议,virtual buffer,以及Zero-Copy(零拷贝)也息息相关 。

图灵学院Java架构师五期笔记相关推荐

  1. 图灵学院java架构师VIP课程学习总结

    最近加入了图灵学院java架构师的学习,着重学习高并发分布式核心架构技术学习,觉得很不错,分享架构大纲和总结的设计模式给大家,想要提升的同学可以在这些方面下点功夫, 课程资料 一:概念及理解 二.单例 ...

  2. 咕泡java架构师二期网盘_咕泡学院java架构师VIP3期

    致学者:不论你在什么时候开始,重要的是开始之后请不要停止.: a# T0 c4 D+ B% g' J5 d 并发编程 + activemq + 实战案例并发编程基础篇 第一天* Y' t4 v, u1 ...

  3. java并发编程源码世界大师_求咕泡学院Java架构师第三期的完整版资料源码+视频,注(完整无解压密码)...

    课程目录如下: 课程目录:咕泡三Java架构师VIP培训班 2019年3月开班 [138.G] ┣━━第1部分:架构师内功心法 [16.9G] ┃ ┣━━01-为什么要从设计模式开始及工厂模式详解 [ ...

  4. 鲁班学院-java架构师线上培训机构哪家好

    2020年的开年对于我们来说打击是很大的,但是对于中华儿女的我们来说在面对苦难的时候都是众志成城的度过难关的.面对这些的武汉疫情,我们的中国儿女也是跟随着国家的步伐来抗"疫情"在疫 ...

  5. 图灵JAVA架构师3-5期

    架构师必须要了解到的知识. 这个确实很不错的,讲解的知识点很清晰,我之前是在共众号 <码农充电堂> 领取的,省了很多钱,你也可以去看看. 编程能力 对工程师而言,编程是最基础的能力,必备技 ...

  6. 咕泡p6java架构师五期涨薪班

    现在的人们几乎无时无刻都会碰计算机!不管是桌面计算机(桌机).笔记本电脑(笔电).平板计算机.智能型手机等等,这些东西都算是计算机.虽然接触得这么多,但是,你了解计算机里面的组件有什么吗?以桌机来说, ...

  7. 图灵学院VIP课程第五期学习笔记

    1.引用计数法: 每个对象有一个引用计数属性,新增一个引用的时候计数加1,引用释放时计数减1,当计数为0的时候就可以回收 2.可达性分析法: 从 GC Roots 开始向下搜索,搜索所走过的路径称为引 ...

  8. Java架构师 每日微笔记 0001

    设计模式章节总结

  9. Java架构师需要哪些知识?

    如何才能达到Java架构师技术要求标准?Java架构师需要熟练掌握复杂的数据结构和算法.熟练使用linux操作系统,Linux线上排除故障.熟悉tcp协议.系统集群.[负载均衡].反向代理.动静分离, ...

最新文章

  1. CTFshow 命令执行 web56
  2. 招程序员,得招 “会编程” 的
  3. php+java+框架整合_ThinkPhP+Apache+PHPstorm整合框架流程图解
  4. .NET 下基于动态代理的 AOP 框架实现揭秘
  5. css html 方格,使用CSS创建方格背景
  6. 切记!节前给数据库做个巡检
  7. docker 镜像导入导出
  8. 「Python」conda与pip升级所有的包
  9. linux如何设置服务器上的系统时间
  10. 三轴合并_用两套乐高60107合并成铰接式云梯消防车,看看和60112有什么区别
  11. 一个很可爱的二次元风格的个人技术博客
  12. 十分钟读懂 黑客如何入侵Windows 操作系统
  13. android 设置闹钟,android 设置闹钟
  14. 物联网嵌入式系统开发应用软件公司怎么选择
  15. 黑龙江省牡丹江市谷歌高清卫星地图下载
  16. eureka 自我保护机制
  17. Android 手表WearOs 禁止滑动返回、监听滑动事件分发
  18. 基于JavaWeb的小区物业管理系统的设计与实现
  19. Codeforces Round #829E 1753E. N Machines
  20. maven仓库中的.LastUpdated文件

热门文章

  1. linux下usb充电问题,Linux内核中USB充电器的解决方案
  2. 使用FFmpeg获取视频每一帧的信息
  3. 【Linux】压缩和组管理
  4. java中的hash值
  5. python shp地理坐标系转换平面坐标系-(涉及geopandas安装)
  6. pytest文档75 - 生成 junit-xml 测试报告
  7. 计算机音乐算法冯,恒模算法
  8. java 10的倍数_java实现 在5个数中找到3个数的和是10的倍数
  9. C++-问题(1)-解决“错误 D8016 “/ZI”和“/Gy-”命令行选项不兼容 ”-VS2019
  10. mysql的系统特征方程_RS触发器的特征方程是(   )