selectionKey
反向获取socketChannel
,方法channel() 。文章插图
有了
NIO
为什么还需要Netty?不需要过于关注底层的逻辑 ,
对下面的sdk等进行封装,相当于简化和流程化了NIO的开发过程
。spring
和springboot
的关系差不多 。因为
Netty 5
出现重大bug,已经被官网废弃了,目前推荐使用的是Netty 4.x
的稳定版本 。Netty高性能架构设计线程模型基本介绍
文章插图
传统阻塞 I/O 服务模型
文章插图
模型特点:
- 采用阻塞IO模式获取输入的数据
- 每个连接都需要独立的线程完成数据的输入,业务处理,数据返回
- 当并发数很大 , 就会创建大量的线程,占用很大系统资源
- 连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在read操作,造成线程资源浪费
文章插图
Reactor在一个单独的线程中运行 , 负责监听和分发事件,分发给适当的处理程序来对IO事件作出反应 。它像公司的电话接线员,接听来自客户的电话并将线路转译到适当的联系人 。
单 Reactor 单线程
文章插图
- 优点:模型简单,没有多线程、进程通信、竞争问题,全部都在一个线程中完成 。
- 缺点:性能问题 , 只有一个线程,无法完全发挥多核CPU性能 。Handler在处理某个连接上的业务时 , 整个进程无法处理其他连接事件,很容易导致性能瓶颈 。
文章插图
在上一代的问题上进行修改,Reactor主线程只负责响应事件,不做具体的业务处理,通过read读取数据后,会分发给后面的worker线程池的某个线程处理业务 。
- 优点:充分利用多核CPU的处理能力 。
- 缺点:多线程数据共享和访问比较复杂,
Reactor处理所有的事件监听与响应
,在单线程运行,在高并发场景容易出现性能瓶颈 。
文章插图
Reactor主线程
MainReactor
对象通过select监听连接事件,收到事件后,通过Acceptor处理连接事件 。当Acceptor处理连接事件后,MainReactor
将连接分配给 SubReactor
,SubReactor
将连接加入到连接队列进行监听,并创建Handler进行各种事件处理 。- 优点:父线程与子线程的数据交互简单职责明确 ,
父线程只需要接收新连接 , 子线程完成后续的业务处理 , 无需返回数据给主线程
。
- 缺点:编程复杂度较高 。
- 单Reactor单线程 , 前台接待员和服务员是同一个人,全程为客户服务 。
- 单Reactor多线程,1个前台接待员,多个服务员,接待员只负责接待 。
- 主从Reactor多线程,多个前台接待员,多个服务生 。
文章插图
- Netty抽象出两组线程池,
BossGroup
专门负责接收客户端的连接,WorkerGroup
专门负责网络的读写 。
- 每个
worker nioEventLoop
处理业务时,会使用pipeline
(管道),pipeline
中包含了channel
,即通过pipeline
可以获取到对应通道 , 管道中维护了很多的处理器 。
- 异步的概念和同步相对 。当一个异步过程调用发出后,调用者不能立刻得到结果 。实际处理这个调用的组件完成后,通过状态、通知和回调来通知调用者 。
推荐阅读
- HDFS基础学习
- 【一】ERNIE:飞桨开源开发套件,入门学习,看看行业顶尖持续学习语义理解框架,如何取得世界多个实战的SOTA效果?
- 记录一次sshd服务启动失败
- 零基础如何学游戏编程(游戏编程学习入门)
- 机器学习实战-AdaBoost
- Pytorch模型量化
- 三 【单片机入门】应用层软件开发的单片机学习之路-----UART串口通讯和c#交互
- 二 【SSM】学习笔记——SpringMVC入门
- Briefings in Bioinformatics-2021 知识图谱-生物信息学-医学顶刊论文:生物信息学中的图表示学习:趋势、方法和应用
- 微信我的收藏怎么删除(公安局能调取已删微信记录吗)