多线程Reactor模式及Netty线程模型

Netty是一款高效的NIO框架和工具,基于Java NIO实现,Java NIO的Selector给Reactor模式提供了基础,netty结合Selector和Reactor模式实现自身高效的线程模型。本文先对Reactor模式的多线程和主从模型进行简单介绍,而后结合netty中的几个重要组件对netty线程模型和工作流程进行简单分析。这里可以参看李林锋的文章

多线程Reactor

与单线程不同的地方,在于多线程Reactor模型将监听连接和连接的I/O操作放到了不同的线程里面,看下面的示意图:

它的主要特点如下:

  • 有专门的Acceptor线程用于监听、接收客户端的连接请求
  • 网络I/O的读写操作则由另外的线程池负责,包含一个任务队列和多个线程
  • 一个NIO线程可以处理多个链路,但每个链路只对应一个线程

大部分情况下,一个线程负责监听和处理所有的客户端都能满足需要,但在特殊场景下,如并发量过高,或者在连接接入的时候需要进行安全认证等问题,单个Acceptor线程不足以满足性能,这时候就需要主从Reactor模型。

主从多线程Reactor

服务端用于接收连接的不再是一个单独的NIO线程,而是一个独立的线程池:

工作流程:

  • 从主线程池中选择一个Reactor线程作为Acceptor线程,绑定监听端口,接收客户端连接
  • 接收到连接请求后,将其注册到主线程其他线程上,由它们负责接入认证等工作
  • 链路建立完成后,就链路从主线程池的多路复用器上摘除,重新注册到Sub线程池的NIO线程上,负责后续IO操作

netty的线程模型不是一成不变的,通过对启动参数的配置,netty可以支持多种Reactor线程模型,最常用的是多线程模型。

下面说一下netty中几个重要的组件。

Selector

Selector是Java NIO提供的多路复用器,负责配合操作系统的select/epoll操作将就绪的IO事件分离出来,落地为SelectionKey,我们可以将SelectionKey看做Reactor模式中的资源

EventLoop/EventLoopGroup

EventLoopGroup其实就是一个EventLoop线程组,netty中通常有多个EventLoop同时工作,每个EventLoop维护着一个Selector实例(类似单线程Reactor工作)。如果没有显式指定,默认每个EvenLoopGroup中的线程数为可用的CPU内核数*2。

通常每个netty服务端有两个EventLoopGroup。

一个用作Acceptor线程池,负责处理客户端的连接请求,通常一个服务端口对应一个EventLoop线程,根据实际需要配置线程组的线程数量。Acceptor线程通过不断轮询Selector上的Accept事件,将accept的SocketChannel交给另外一个EventLoop线程组。

另一个EventLoopGroup会根据线程组的顺序next一个可用的EventLoop将这个SocketChannel注册到其维护的Selector上,并处理其后续的I/O的事件。

ChannelPipleline

每个SocketChannel都有一个Pipleline实例,而每个Pipleline中维护了一个ChannelHandler链表队列。Pipleline和ChannelHandler的关系类似servlet和filter过滤器的作用。EventLoop从Selector中分离出就绪的channel以后,会将它传递的消息传输到Pipleline中,通过ChannelHandler处理链进行层层处理,用户可以在Handler中添加自己的业务逻辑。

ChannelPipleline中本身维护着两个不可见的HeadHandler和TailHandler,head靠近网络层,tail靠近用户。netty中有两类事件类型,inbound和outbound。inbound可以理解为从网络数据外部流向内部,如读取消息;outbound为网络数据从内部流向外部,如写消息。Pipleline会根据事件的类型, 自上而下或自下而上调用事件相关联的ChannelHandler对消息进行处理。如读取消息的时候会依次执行HeadHandler、ChannelHandler1...ChannelHandlerN、TailHandler。

写在最后

通过以上几个组件的作用,应该可以对netty的工作流程有个大体的认识。其实笔者接触netty是从Vert.x开始的,netty可能更偏向网络传输这个层面,一些RPC框架底层传输用的也是netty。

netty中还有其他要点,比如粘包拆包、缓冲区这些问题笔者还没有认真研究过,待有时间再研究源码吧,感叹时间真不够用啊!

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

推荐阅读更多精彩内容