Netty源码死磕一(Netty线程模型及EventLoop机制)

引言

好久没有写博客了,近期准备把Netty源码啃一遍。在这之前本想直接看源码,但是看到后面发现其实效率不高,有些概念还是有必要回头再细啃的,特别是其线程模型以及EventLoop的概念。

当然在开始之前还是有务必要对IO模型要有清晰准确的认识。 传送门

事件循环机制(EventLoop)

Netty线程模型中一个非常重要的概念: 事件循环机制(EventLoop)
这个概念在JS上体现的也非常淋漓尽致,下面在开始介绍netty的线程模型之前,允许我简单的介绍下事件循环机制在JS中的体现

JS的语言性质: 单线程非阻塞,单线程意味着,js代码在执行的任何时候,都只有一个主线程来处理所有的任务。非阻塞则意味着,在进行异步IO任务时不会阻塞主线程,主线程会挂起这个任务,等待异步任务完成再执行对应的回调。

那么JS是如何实现单线程非阻塞的呢?JS引擎遇到一个异步事件后并不会一直等待其返回结果,而是会将此事件挂起(例如交给浏览器去执行请求),主线程会继续执行方法栈中的其他任务。之后当异步任务返回结果后,(可能是浏览器?)会将回调函数加入到事件队列(Task Queue)中,那么什么时候会从事件队列中取出回调函数执行呢?当前执行栈中的所有任务都执行完毕,主线程处于闲置状态时会去查找事件队列是否有任务待执行,如果有则将回调函数加入到主线程的方法执行栈中执行,如此反复,我们就把这个循环过程称为事件循环机制(EventLoop)。

不知道介绍了JS的件循环机制,大家有没有对Event Loop有了一个初步的认识,下面我将会着重介绍我们主角Netty的线程模型及其与Event Loop的联系。

Netty线程模型

Netty的线程模型基于ReactorReactor的核心在于事件分发,它有三种经典的线程模型(单线程模型,多线程模型,主从多线程模型),下面我们会结合NettyEventLoop机制一一介绍

Reactor单线程模型

单线程模型全局只有一个线程在工作,也就意味着请求的接收,分发,IO读取写入等操作都在一个线程中完成,该模型算得上是最经典的线程模型了,例如redis也是采用的此种单线程模型了。

image.png

可以看到上图中,我们把一个Reactor线程可以认为是一个EventLoop IO线程,一个事件循环机制。

由于其线程中的IO读写都是基于NIO,理论上所有的IO读写操作都不会阻塞EventLoop线程。所以即使是该单线程模型,也是足以应付绝大多数的场景。

那么为什么又会延伸出Reactor多线程模型呢?
当应用并发量非常大时,例如一个Reactor NIO 线程需要同时处理成百上千的连接时,虽然IO读写是非阻塞的,但是消息的编码解码都是需要同步阻塞的,这就导致NIO线程处理速度变慢,最终导致消息积压,出现性能瓶颈。

基于以上原因也就演进出了第二种模型Reactor多线程模型

Reactor多线程模型

Reactor多线程模型Reactor单线程模型最大的区别就是,有一组Reactor NIO线程(也就是一组 EventLoop)来处理IO操作

image.png

通过上图,可以比较清晰的看到,IO的读写操作都由一个Reactor NIO线程池(对应到EventLoop也就是EventLoopGroup)来完成的,而请求的监听和Accept则是由另一个单独的Reactor线程来完成。
注意Reactor NIO线程池中的每一个线程都是处理N条链路,但是一个链路只能有一个线程来处理
多线程的Reactor模型可以满足绝大部分的应用场景,通常情况下,我们使用Netty使用这种线程模型就OK(创建两个NioEventLoopGroup,bossGroup大小为1,workGroup大小为CPU*2)。但是有可能会存在某些极少数的情况,一个Reactor线程处理请求的Accept可能会产生性能瓶颈,例如上百万的并发连接请求。这时候我们可能就需要采用第三种模型Reactor主从多线程模型

Reactor主从多线程模型

Reactor主从多线程模型Reactor多线程模型的区别在于原本是一个Reactor线程处理请求的Accept,变成了一组Reactor线程

image.png

对于Reactor主从多线程模型,其实大多数情况下我们并不需要。即使我们给BossGroup指定了多个线程,最终也只会选择其中的一个作为Accepor的NIO线程,除非在服务端绑定了多个端口的情况下才会启用BossGroup的多个线程

尾言

Netty的线程模型以及EventLoop理解清楚,个人觉得最好的方法还是顺着Netty的源码一步一步看,看多了也就理解了这几种线程模型分别对应了哪几种情况,后面的文章我会根据源码来进一步理解netty

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容