Netty进阶之路-EventExecutorGroup疑云
Netty进阶之路-EventExecutorGroup疑云
- 前言
- EventExecutorGroup用法
- 测试
- 效果
- EventExecutorGroup工作机制
前言
上一篇我们讲了不能把耗时的业务放在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);
还没有评论,来说两句吧...