Netty 的主从 Reactor 多线程模型 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
tuzhenyu
V2EX    程序员

Netty 的主从 Reactor 多线程模型

  •  
  •   tuzhenyu 2018-01-26 16:23:25 +08:00 4235 次点击
    这是一个创建于 2818 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位大大请教一个问题:Netty 在主从 Reactor 多线程下服务端启动时候会创建创建主从线程池 boss 和 work,但是服务端启动创建的一个 NioServerSocketChannel 实例只会 register boos 线程池中的一个 NioEvnetLoop 线程,也就说虽然创建了 boss 线程池但是实际上只是用了其中的一个线程,除非绑定多个端口。

    有几点疑问:(1)在绑定一个端口的情况下,创建一个 boss 线程池是没有必要的吧?(2)网上说 Reactor 主从多线程模型优势在于:服务端用于接收客户端连接的不再是个 1 个单独的 NIO 线程,这种说法是有问题的吧(在只绑定一个端口的情况下)?

    13 条回复    2019-12-02 19:06:25 +08:00
    BBCCBB
        1
    BBCCBB  
       2018-01-26 16:55:25 +08:00
    我只见过一个 boss 用于 select, 一个或多个 worker 负责读写...
    tuzhenyu
        2
    tuzhenyu  
    OP
       2018-01-26 17:02:55 +08:00
    @BBCCBB 那创建 boss 线程池是不是没有必要?一般情况下只会用到一个 boss 线程...
    anthow
        3
    anthow  
       2018-01-26 17:10:21 +08:00
    如果绑定一个端口的话,线程池的确没啥必要...
    jy02405651
        4
    jy02405651  
       2018-01-26 17:17:08 +08:00
    Netty 的服务器端的 acceptor 阶段, 没有使用到多线程
    tuzhenyu
        5
    tuzhenyu  
    OP
       2018-01-26 17:21:27 +08:00
    @jy02405651 那 boss 线程池的作用是啥呢,仅仅是用作绑定多个端口的情况吗?
    tuzhenyu
        6
    tuzhenyu  
    OP
       2018-01-26 17:23:07 +08:00
    @anthow 书上说 Reactor 主从多线程模型优势在于:服务端用于接收客户端连接的不再是个 1 个单独的 NIO 线程,这句话是指的绑定多个端口的情况吗?
    BBCCBB
        7
    BBCCBB  
       2018-01-26 17:23:36 +08:00
    @tuzhenyu 我不知道多个线程处理 select 可不可行, 不过多个 boss 负责 select 感觉没有必要,也没这方面的经验, 如果你有看到相关的资料,请给我看一下,让我涨涨知识
    BBCCBB
        8
    BBCCBB  
       2018-01-26 17:26:58 +08:00
    这是我原来看相关 io 模型的文章和 Doug lea 大神的论文

    [Scalable IO in Java]( http://www.cnblogs.com/luxiaoxun/archive/2015/03/11/4331110.html)

    [Doug lea Scalable IO in Java]( http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf)
    fovecifer
        9
    fovecifer  
       2018-01-26 17:27:37 +08:00
    谈谈我的理解

    1. boss 线程一般只负责 accept 新链接,这个工作一般情况下单个线程肯定够了
    2. 只有一个线程的线程池也是线程池!这是抽象概念问题,请参考 JDK 并发包里的线程池
    3. 据我所知处理网络 IO 的最优解就是一个线程负责 accept,其他 N 个线程负责具体的 IO 操作
    tuzhenyu
        10
    tuzhenyu  
    OP
       2018-01-26 17:47:59 +08:00
    @BBCCBB 我是在<Netty 权威指南>上看的,应该是作者的措辞不够严谨,一个端口只能一个 boss 线程负责 acceept,谢谢~
    tuzhenyu
        11
    tuzhenyu  
    OP
       2018-01-26 17:48:11 +08:00
    @fovecifer 恩恩 谢谢!
    seaswalker
        12
    seaswalker  
       2018-01-26 18:06:18 +08:00
    从源码的角度应该是这样的:
    boss 线程在 Netty 里就是 NioEventLoopGroup,其父类的 NioEventLoop 的 processSelectedKey 方法负责处理 epoll 事件,之后由 AbstractNioMessageChannel 的 read 方法触发 BossGroup 上的
    事件处理器,BossGroup 上其实只有一个,就是 ServerBootstrapAcceptor 这货,然后由这货将子 channel 注册到 ChildGroup 上去,这中间全部是一个线程完成,应该可以证实你的说法。
    mazai
        13
    mazai  
       2019-12-02 19:06:25 +08:00
    实际上 boosGroup 和 workerGroup 用的都是同一个线程池,并没有单独给 boos 一个线程池。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2517 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 15:30 PVG 23:30 LAX 08:30 JFK 11:30
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86