【发布时间】:2014-03-21 11:06:57
【问题描述】:
netty 有一些问题。
几年前,我使用 smartfox 服务器 1.6x,它的多线程模型使我能够在不同线程中处理我的连接消息。该功能迫使我编写一些线程同步代码,以让所有消息都得到正确处理。
现在我使用 netty,因为它对我的目标来说是一个了不起且非常有用的产品。
所以,我实现了一些基于服务器的逻辑。我的测试如下
- 服务器将消息加入队列,处理每条消息,当前线程休眠 3 秒
- 客户端每秒大约 10 条垃圾邮件
我看到在第一条消息(前十条)没有被处理之前(通常大约 30 秒的时间)第二包消息没有在并行线程中处理。
所以主要问题是:
netty 是否只在一个线程中处理一个连接的所有消息? 如果是这样,我应该在不同的线程中实现一些额外的代码,还是单线程单连接模型效果很好?
网络配置:
_boss = new NioEventLoopGroup(1);
_worker = new NioEventLoopGroup(8);
_bootstrap = new ServerBootstrap();
_bootstrap.group(_boss, _worker)
.channel(NioServerSocketChannel.class)
.childHandler(new NettyChannelInitializer())
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true);
_bootstrap.bind(_port).sync();
NettyChannelInitializer:
private static final ExtentionHandler SharedExtentionHandler = new ExtentionHandler();
private static final EventExecutorGroup ExtentionEventThreadPool = new DefaultEventExecutorGroup(20);
public void initChannel(SocketChannel channel) throws Exception
{
ChannelPipeline pipeline = channel.pipeline();
pipeline.addLast(ExtentionEventThreadPool, "extention", SharedExtentionHandler);
}
【问题讨论】:
-
Netty 利用线程重用,因为创建线程的成本很高。这是使其快速的原因之一
标签: java multithreading netty