netty worker线程数量_netty中reactor模式的应用分析

本文介绍了Netty中Reactor模式的三种应用:单线程模式、多线程模式和主从线程模式。详细解释了每个模式的工作原理,如单线程模式下由一个线程处理所有任务,多线程模式将接收和处理分离,主从线程模式则进一步细化了接收和处理任务的线程池。Netty允许用户通过配置EventLoopGroup来选择不同模式,以适应不同的并发需求。

首先我们要弄清楚一个概念:reactor是指的一种模式,并不是一个线程,实现了reactor模式的线程称之为reactor线程,reactor模式并不是只能由一个线程组成也可由多个线程组成。

介绍一下reactor模式:

(1) 单线程模式:

2e73072ef4001e86d3cab5bb5a35c61e.png

reactor单线程模式

由一个实现了reactor模式的线程(reactor线程)来处理,所有的客户端连接读取通道中的请求,实现分发处理。

对应的java nio server端就是一个典型reactor单线程模式的,操作都是由一个线程完成,从客户端连接,监听,再到读取,再到分发。随着客户端连接的增多,就会产生性能瓶颈,这时候就出现reactor多线程模型。

(2) reactor多线程模式:

e0e04743b1a2360a1de3a1fbbd906f31.png

reactor多线程模式

主要就是把单线程完成的过程,分为两个过程,接受客户端连接和监听为一个过程,分发处理消息为一个过程。其中第一个过程由一个线程完成,第二个过程为一个线程池完成,当第一个过程的线程监听到消息后,立马扔给第二过程的线程池处理。这种模式在大多数场景下是可以满足性能要求的,但是在并发请求极多的场景下,单个线程来监听和处理客户端连接还是存在性能瓶颈,这时候就出现了第三种reactor模式,主从reactor

(3)主从reactor

6499254c90df83fe20eb6db18a47c012.png

reactor主从线程模式

其实就是处理客户端连接和监听的这个过程不再由一个线程完成,而是由一个线程池完成,一个线程池完成客户端连接和监听,一个线程池分发处理消息。

上次发文中推荐给大家的netty,就是reactor模式的典型应用。并且Netty中实现了由用户配置参数来选择应用reactor的哪种模式,下面给大家介绍一下。

  • EventLoopGroup bossGroup = new NioEventLoopGroup();
  • EventLoopGroup workerGroup = new NioEventLoopGroup()
  • ServerBootstrap b = new ServerBootstrap();
  • b.group(bossGroup, workerGroup)

.channel(NioServerSocketChannel.class)

.childHandler(new MyServerInitializer())

.option(ChannelOption.SO_BACKLOG, 128)

.childOption(ChannelOption.SO_KEEPALIVE, true);

  • ChannelFuture f = b.bind(port).sync();
  • f.channel().closeFuture().sync();

上面代码中定义了两个EventLoopGroup,这两个EventLoopGroup就是对应上面reactor多线程模式中介绍的那两个过程,其中第一个称为boss,第二称为worker,形象些说就是boss负责接活,接到活之后就给下面的worker来干。

Netty怎么配置使用reactor单线程模式呢?

  • EventLoopGroup bossGroup = new NioEventLoopGroup()
  • ServerBootstrap b = new ServerBootstrap();
  • b.group(bossGroup)
  • .channel(NioServerSocketChannel.class)

就是只需要使用一个EventLoopGroup,并且设定参数为1,指的就是只用一个线程,形象的说就是boss自己接活自己干。

Netty怎么配置使用reactor多线程模式呢?

  • EventLoopGroup bossGroup = new NioEventLoopGroup(1);
  • EventLoopGroup workerGroup = new NioEventLoopGroup();
  • ServerBootstrap b = new ServerBootstrap();
  • b.group(bossGroup,workerGroup)

使用两个EventLoopGroup,其中boss设定为1,worker默认线程数,也可以自己设定worker数量,在构造方法中设定就可以了

Netty使用reactor主从模式可想而知了,就是

  • EventLoopGroupossGroup=new NioEventLoopGroup();
  • EventLoopGroup workerGroup = new NioEventLoopGroup();

不在指定只有一个boss,默认多个boss,可以指定boss数量,构造方法自己设定就行,就相当于多个boss接活给多个worker干,效率自然就提升了。

以上就是netty中应用reactor模式,如果想深入研究请多看看源码,等有时间再给大家分析源码。

最后再提醒一句,如果对于业务逻辑复杂的处理不要再worker中handler去执行,即自定义的handler不用处理复杂业务,因为这样会严重拖慢reactor的性能,在这里推荐大家使用disruptor,就是在handler中转发至disruptor,让disruptor去开启用户线程处理,即netty接diuruptor的架构模式,也可以使用AKKA等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值