暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【每日一题】请概述Netty的整体架构设计及线程模型。

学亮编程手记 2021-03-20
625

Netty架构


server端工作原理如下图

server端启动时绑定本地某个端口,将自己NioServerSocketChannel注册到某个boss NioEventLoop的selector上。

server端包含1个boss NioEventLoopGroup和1个worker NioEventLoopGroup,NioEventLoopGroup相当于1个事件循环组,这个组里包含多个事件循环NioEventLoop,每个NioEventLoop包含1个selector和1个事件循环线程。

每个boss NioEventLoop循环执行的任务包含3步:

第1步:轮询accept事件;

第2步:处理io任务,即accept事件,与client建立连接,生成NioSocketChannel,并将NioSocketChannel注册到某个worker NioEventLoop的selector上;

第3步:处理任务队列中的任务,runAllTasks。任务队列中的任务包括用户调用eventloop.execute或schedule执行的任务,或者其它线程提交到该eventloop的任务。

每个worker NioEventLoop循环执行的任务包含3步:

第1步:轮询read、write事件;

第2步:处理io任务,即read、write事件,在NioSocketChannel可读、可写事件发生时进行处理;

第3步:处理任务队列中的任务,runAllTasks。


client端工作原理如下图

client端启动时connect到server,建立NioSocketChannel,并注册到某个NioEventLoop的selector上。

client端只包含1个NioEventLoopGroup,每个NioEventLoop循环执行的任务包含3步:

第1步:轮询connect、read、write事件;

第2步:处理io任务,即connect、read、write事件,在NioSocketChannel连接建立、可读、可写事件发生时进行处理;

第3步:处理非io任务,runAllTasks。

单线程模型


服务器端用一个线程通过多路复用搞定所有的 IO 操作(包括连接,读、写等),编码简单,清晰明了,但是如果客户端连接数量较多,将无法支撑,jdk的 NIO 就属于这种模型。

线程池模型


服务器端采用一个线程专门处理客户端连接请求,采用一个线程池负责 IO 操作。在绝大多数场景下,该模型都能满足使用。

Netty 模型


比较类似于上面的线程池模型,Netty 抽象出两组线程池,BossGroup 专门负责接收客

户端连接,WorkerGroup 专门负责网络读写操作。NioEventLoop 表示一个不断循环执行处理任务的线程,每个 NioEventLoop 都有一个 selector,用于监听绑定在其上的 socket 网络通道。

NioEventLoop 内部采用串行化设计,从消息的读取->解码->处理->编码->发送,始终由 IO 线程 NioEventLoop 负责。

①一个 NioEventLoopGroup 下包含多个 NioEventLoop

②每个 NioEventLoop 中包含有一个 Selector,一个 taskQueue

③每个 NioEventLoop 的 Selector 上可以注册监听多个 NioChannel

④每个 NioChannel 只会绑定在唯一的 NioEventLoop 上

⑤每个 NioChannel 都绑定有一个自己的 ChannelPipeline




劝学警言

身处信息爆炸时代,知识浩瀚如海洋。

然,如同图书馆,你可以入门,但不代表你就拥有它。

且,学而不思则罔,思而不学则殆;

学贵有恒,更需注重方式方法。切记三字箴言:恒、慢、悟——

恒:坚持不懈!最忌讳的就是三天打鱼两天晒网,一曝十寒;

慢:精雕细琢!慢工出细活,理论知识一定要吃透,知其所以然;

悟:明辨慎思!要善于固化知识,一定要有自己的理解,否则就如同将他人吐在地上的吃过的甘蔗,再捡起来嚼,味同嚼蜡一般,无任何滋味可言。

送君一句话:殚精竭虑,不如须臾之所学也。

愿君,好好学习,天天向上!

共勉之!




    

文章转载自学亮编程手记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论