Netty的Reactor多线程模型,NioEventLoop,ChannelPipeline简介
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty的Reactor多线程模型,NioEventLoop,ChannelPipeline简介相关的知识,希望对你有一定的参考价值。
参考技术A如果在Google上搜索"Netty 高性能 易用",在找到的一大批文章,你大概率会看到这张图,外加关键字
NIO , Reactor多线程模型 , 异步串行无锁化 , 堆外内存 , pipeline ,翻看完这些文章后可以让你对Netty的原理有大致了解,但是Netty如何实现这些的呢? 本文将尽可能简单的解释Netty中Reactor多线程的实现,如有错误感谢指出.
Selector是NIO的重要组件, Selector上可以注册Channel. Channel在注册的时候会标注自己感兴趣的事件:
Channel,通道,为了便于理解,我把它分为 三类
Reactor多线程模型可以分为三块
mainReactor负责客户端接入
acceptor负责将接入的连接移交给subReactor
subReactor负责连接的读写
关键知识:
运行流程图
关键知识:
ChannelPipeline的设计思想是 责任链设计模式 ,是由ChannelHandlerContext组成的 双向链表 , ,首尾固定为 HeadContext 和 TailContext ,它们作为哨兵存在.当我们添加一个ChannelHandler到ChannelPipeline时,会先 包装成ChannelHandlerContext 再添加进去.
inbound事件传播
客户端向服务端发送消息,这个流向就称为inbound. 消息会从Head开始由左向右传递直到Tail,由Tail进行收尾操作
outbound事件传播
服务端向客户端发送信息,这个流向称为outbound,消息会从Tail开始由右向左传递知道Head,由Head进行收尾操作
异常传递
当某个ChannelHandler操作抛出异常,会从该handler开始向Tail传递.由Tail做收尾操作.
学习Netty,要理解Reactor模型,并把它和Netty的实现结合起来, 我学习Netty的时候就因为这块认识不深刻,浪费了很多时间也没有成效,共勉
https://blog.csdn.net/difffate/article/details/69458588
https://blog.csdn.net/jjzhk/article/details/39553613
https://www.jianshu.com/p/a9b2fec31fd1
https://www.jianshu.com/p/a9d030fec081
https://juejin.im/post/5b4570cce51d451984695a9b
https://www.jianshu.com/p/2461535c38f3
https://juejin.im/post/5a126b146fb9a0450c490201
Netty 4.x学习笔记——线程模型
目前存在的线程模型
传统阻塞 I/O服务模型(阻塞式IO)
Reactor模式(反应器模式)
根据Reactor的数量和处理资源池线程的数量不同,有3种典型的实现
单Reactor单线程
单Reactor多线程
主从Reactor多线程
Netty线程模式
主要基于主从Reactor多线程模型做了一定的改进,其中主从Reactor多线程模型有多个Reactor
传统阻塞 I/O服务模型
特点:
采用阻塞IO模式获取输入的数据
每个连接都需要独立的线程完成数据的输入,业务处理,数据返回
问题分析:
当并发数很大,就会创建大量的线程,占用很大系统资源
连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在read操作,造成线程资源的浪费
Reactor模式
针对传统阻塞I/O服务模型的2个缺点,解决方案:
基于I/O复用模型:多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接。当某个连接有新的数据可以处理时,操作系统通知应用程序,线程从阻塞状态返回,开始进行业务处理。
基于线程池复用线程资源:不比比再为每个连接创建线程,将连接完成后的业务处理任务分配给线程进行处理,一个线程可以处理多个连接的业务。
针对 1 Reactor对应的叫法:反应器模式/分发者模式/通知者模式
以上是关于Netty的Reactor多线程模型,NioEventLoop,ChannelPipeline简介的主要内容,如果未能解决你的问题,请参考以下文章