首页 今日头条正文

ji,不只概念,用代码来解说netty的线程模型,国航

前语

咱们在运用Netty进行服务端开发的时分,一般来说会界说两个NioEventLoopGroup线程池,一个"bossGroup"线程池去担任处理客户端衔接,一个"workGroup"线程池去担任处理读写操作。那么,咱们为什么要这么做呢?这样做的优点是什么呢?能不能只运用一个NioEventLooji,不只概念,用代码来说明netty的线程模型,国航pGroup呢?这就绘空事是咱们今日要评论的主题——Netty的线程模型

Reactor线程模型

实际上Netty线程模型就lesdy是Reactor形式的一个完结,而Reactor模苦战大西南式又是什么呢?

Reactor形式是依据事情驱动开发的,中心组成部分包含Reactor和线程干比池,其间Reactor担任监听和分配事情,线程池担任处理事情,而依据Reactor的重生之末世血凤数量和线程池的数量,又将Reactor分为三种模型:

  • 单线程模型 (单Reactor单线程)马明月小三
  • 多线程模毛宁科型 (单Reactor多线程)
  • 主从多线程模型 (多Reactor多线程)

单线程模型

  • Reactor内部经过selector 监控衔接事情,收到事情后经过dispatch进行分发,如果是衔接树立的事情,则由Acceptor处父债子偿理,Accep欧元英文tji,不只概念,用代码来说明netty的线程模型,国航or经过accept承受衔接,并创立一个Handler来处理衔接后续的各种事情,如果是读写事情,直接调用衔接对应的Handler来处理
  • Handler完结read->(decode->ji,不只概念,用代码来说明netty的线程模型,国航comp泪水之池ute->encode)->send的事务流程
  • 这种模型优点是简略,害处却很显着,当某个Handler堵塞时,会导致其他客户端的handler和accpetor都得不到履行,无法做到高功能,只适用于事务处理十分快速的场景

多线程模型

  • 主线程中,Reactor目标经过selector监控衔接事情,收到事情后经过dispatch进行分发,如果是衔接树立事情,则由Acceptor处理,Acceptor经过accept接纳衔接,并清道芙创立一个Handler来处理后续事情,而Handler只担任呼应事情,不进行事务操作,也便是只进行read读取数据和write写出数据,事务处理交给一个线程池进行处理
  • 线程池分配一个线程完结真实的事务处理,然后将呼应成果交给主进程的Handler处理,Handler将成果send给client (下ji,不只概念,用代码来说明netty的线程模型,国航面是中心代码)

单Reactor承担一切事情的监听和呼应,而当咱们的服务端遇到很多的客户端一起进行衔接,或许在恳求衔接时履行一些耗时操帅哥的丁丁作,比方身份认证,权限查看等,这种瞬时的高并发就简单成为功能瓶颈

主从多线程模型 (最盛行)

  • 存在多个Reactor,每个Reactor都有自己的selector挑选器,线程和dispatch
  • 主线程中的mainReactor经过自己的selector监控衔接树立事情,收到事情后经过Accpetor接纳,将新的衔接分配给某个子线程
  • 子线程中的subReactor将mainReactor分配的衔接参加衔接队佛山三水天气预报列中经过败气症自己的selector进行监听,并创立一个Handler用于处理后续事情
  • Handler完结read->事务处理->send的完好事务流程

Netty中的线程模型与Reactor的联络

Netty主要靠NioEventLoop吴莫愁怒怼女歌手Group线程池来完结详细的线程西普大陆免费送最强号模型的

单线程模型

单线程模型便是只指定一个线程履行客户端衔接和读写操作,也便是在一个Reactor中完结,对应在Netty中的完结便是将NioEventLoopGroup线程数设置为1,中心代码是:

它的作业流程大致如下:

上述单线程模型就对应了Reactor的单线程模型

多线程模型

多线程模型便是在一个单Reactor中进行客户端衔接处理,然后事务处理交给线程池,中心代码如下:

走进group办法能够发现我许海清和陈启礼谁更强们平常设置的bossGroup和workerGroup便是运用了同一个group

作业流程如下:

主从多线程模型 (最常运用)

主从多线程模型是有多个Reactor,也便是存在多个selector,所以咱们界说一个bossGrouji,不只概念,用代码来说明netty的线程模型,国航p和一个workGroup,中心代码如下:

作业流程如天天骑下:

留意:其实在Netty中,bossGroup线程池终究仍是只会随机挑选一个线程用于处理客户端衔接,与此一起,NioServerSocetChannel苦刺头绑定到bossGroup的线程中,NioSocketChannel绑定到workGroup的线程中

小结

以上总结了Reactor的三种模型以及Netty中的对应完结,ji,不只概念,用代码来说明netty的线程模型,国航在Netty中,咱们运用的最多的仍是主从多线程模型。关于Reactor的学习,最威望的材料应该是Doug Lea大神的Scalabji,不只概念,用代码来说明netty的线程模型,国航le IO in Java,有爱好的同学能够看看

作者:pjmike_pj

链接:https://juejin.im/post/5dac6ef75188252bc1657ead

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。