我在netty方面遇到了一些问题。
几年前我使用了smartfox服务器1.6x,它的多线程模型让我在不同的线程中为我的连接处理消息。而且这个功能迫使我编写了一些线程同步代码,以便正确处理所有消息。
现在我使用netty,因为它对我的目标来说是非常有用的产品。
所以,我实现了一些基于服务器的逻辑。我的测试是以下
我看到在第一封邮件(前十位)未处理之前(通常约为30秒),第二包邮件未在并行线程中处理。
所以主要问题是:
netty是否仅在一个线程中处理一个连接的所有消息? 如果是这样,我应该在不同的线程中实现一些额外的代码来实现,或者单线程的单连接模型是否运行良好?
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);
}
答案 0 :(得分:1)
Netty确保以有序方式处理同一频道的事件。即你从来没有订购问题,但是当你处理的连接数量只有一个时,你就不会利用并行性。如果你对无序执行没问题,你可以简单地将你的任务委托给你可以从JDK获得的普通ExecutorService
。