netty - 线程模型 reactor
Posted better_hui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了netty - 线程模型 reactor相关的知识,希望对你有一定的参考价值。
目录
线程模型
1、传统IO服务模型
阻塞的IO模式获取输入数据,每个链接需要独立的线程完成数据传输及处理
当并发数较大时,创建大量线程,占用系统资源;线程创建后如无数据读写,将被阻塞
2、Reactor模式
reactor
针对传统的IO模型的两个缺点,解决方案:
a、基于IO多路复用模型:多个连接共用一个阻塞对象。应用程序只需要在一个阻塞对象上等待,无需阻塞所有对象
b、基于线程池复用线程资源:不再为每个连接创建线程,将连接完成后的业务处理任务分配给线程池处理
IO多路复用结合线程池 就是reactor模型的基本思想 , 其核心组成:
a、reactor : 在一个单独线程中运行,负责监听和分发事件,如上图中servicehandler(EventDispatch)
b、handlers: 具体执行IO事件
三种模式:
1、单reactor单线程
reactor/handler , 均运行在一个线程里.
优点: 没有线程竞争
缺点:扛不住高并发 、可靠性问题,线程以外终止或者进入死循环
应用:客户连接数量有限;业务处理非常快速
2、单reactor多线程
针对单线程并发性的问题,衍生出来了单reactor多线程模型。
1、单reactor负责监听、建立连接、读写IO
2、业务逻辑线程池负责处理具体的IO读写及业务逻辑
优点:充分利用计算机多核的性能,能够抗住相对较高的并发
缺点:单reactor,在超高并发的场景中,会成为瓶颈。因为reactor负责 监听 、连接、读写IO 三个工作,这块是单线程串行的。
3、主从reactor多线程
为了应对超高的并发,我们在reactor单线程运行的的基础上继续优化,拆分reactor的工作:
1、主reactor 负责监听和连接 , 这两步工作是非常快速的
2、从reactor负责读写IO数据
3、业务逻辑线程池负责处理业务逻辑
总结
单reactor单线程 :小饭馆 , 前台、厨师、服务员是一个人,从点餐、做饭、端饭上桌是串行的
单reactor多线程: 大一些的饭馆,前台、厨师是一个人,服务员是一群人 , 上饭的速度快了一些
主从reactor多线程:五星级饭店:前台一个人,厨师一群人、服务员是一群人,上饭的速度嗖嗖的
优点:
1、响应快,不必所有线程均阻塞等待,而是共用一个阻塞对象
2、扩展性能好,可以扩展从reactor的数量,充分利用cpu资源
3、复用性好,reactor模型本身与具体事件处理逻辑无关,具有很高的复用性。
netty模型
netty的线程模型是基于主从reactor多线程模式的,并在此基础上做了一定程度上的优化:
1、BossGroup线程池维护主Selector , 只关注accecpt
2、当接收到accept事件后,获得对应的SocketChannel,封装成NiosocketChannel 注册到Worker线程循环
3、worker线程监听到自己感兴趣的时间后,交由handler处理
netty的线程模型中主从reactor都是在线程池里的,这是相对reactor的改进
执行流程简述
1、netty抽象出两个线程池:BossGroup负责监听和建立连接 ;WorkerGroup 负责网络IO的读写
2、BossGroup 和 WorkerGroup 类型都是NioEventLoopGroup , 相当于一个事件循环组,这个组中含有多个事件循环,每一个事件循环都是NioEventLoop
3、NioEventLoop表示一个selector , 用户监听绑定在骑上的socket网络通讯
4、每一个Boos NioEventLoop循环执行3步:
a、轮询accept事件
b、建立连接,生成NioSocketChannel,并注册到workerGroup上
c、处理任务队列中的任务,即RunAllTasks
5、每个Worker NioEventLoop循环执行3步:
a、轮询读写时间
b、处理IO时间,在对应的NioSocketChannel上处理
c、处理任务队列的任务,即RunAllTasks
以上是关于netty - 线程模型 reactor的主要内容,如果未能解决你的问题,请参考以下文章