Netty进阶之路-EventExecutorGroup疑云

雨点打透心脏的1/2处 2022-02-01 12:41 737阅读 0赞

Netty进阶之路-EventExecutorGroup疑云

  • 前言
  • EventExecutorGroup用法
    • 测试
    • 效果
  • EventExecutorGroup工作机制

前言

上一篇我们讲了不能把耗时的业务放在I/O线程中执行,并说了有2中方式解决。这篇先将Netty的提供的EventExecutorGroup。

EventExecutorGroup用法

改动只有2行代码 创建一个EventExecutorGroup 并将其和channelHandler绑定即可。

  1. final EventExecutorGroup businessGroup = new DefaultEventExecutorGroup(100);
  2. socketChannel.pipeline().addLast(businessGroup,new RPCResponseHandler());//处理类

测试

我们在服务端业务处理的时候让它睡一秒,模拟耗时的业务。

  1. try {
  2. Thread.sleep(1000);
  3. } catch (InterruptedException e) {
  4. // TODO Auto-generated catch block
  5. e.printStackTrace();
  6. }
  7. String result=InvokeServiceUtil.invoke(request);
  8. RPCResponse response=new RPCResponse();
  9. response.setRequestID(request.getRequestID());
  10. response.setResult(result);
  11. ctx.writeAndFlush(response);

效果

同理 我们利用JMeter测试 20个用户执行1次。
在这里插入图片描述
大失所望,服务端几乎是一秒执行一次。怎么和我们设想的完全不一样讲道理应该都在1秒左右,怎么会这样呢。

EventExecutorGroup工作机制

对于某个客户端连接Channel,只会注册到一个Nio线程中,用于处理网络的I/O操作。业务的ChannelHandler指定了运行EventExecutorGroup线程池后,创建ChannelHandlerContext上下文的时候也会选择其中一个EventExecutor来绑定。当客户端比较多的时候,就会有N个Channel并行执行。
在这里插入图片描述
现在我们明白了并不是说我设置了EventExecutorGroup(100),就会100个线程去执行。But 那为什么我会是1秒执行一个,按照道理也应该是4个一组并行的(我设置了NioEventLoopGroup(4))。弄了半天我发现了原来是客户端在搞鬼,具体如何我将会再下一篇继续讲解。

  1. final EventLoopGroup workerGroup=new NioEventLoopGroup(4);

发表评论

表情:
评论列表 (有 0 条评论,737人围观)

还没有评论,来说两句吧...

相关阅读

    相关 golang

    目录 1、go 的调度 2、 golang中 map的底层实现 3、go 的垃圾回收机制 4、数组与切片的区别 5、go struct能不能比较 6、select