Netty进阶之路-EventExecutorGroup疑云

8 篇文章 1 订阅

前言

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

EventExecutorGroup用法

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

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

测试

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

try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        String result=InvokeServiceUtil.invoke(request);
        RPCResponse response=new RPCResponse();
        response.setRequestID(request.getRequestID());
        response.setResult(result);
        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))。弄了半天我发现了原来是客户端在搞鬼,具体如何我将会再下一篇继续讲解。

final EventLoopGroup workerGroup=new NioEventLoopGroup(4);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值