【问题标题】:Netty handles messages in only one threadNetty 只在一个线程中处理消息
【发布时间】: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


【解决方案1】:

Netty 确保以有序方式处理同一通道的事件。也就是说,您永远不会遇到排序问题,但是当您处理的连接数只有一个时,您就没有利用并行性。如果你对无序执行没问题,你可以简单地将你的任务委托给一个普通的ExecutorService,你可以从 JDK 获得。

【讨论】:

  • 谢谢你,Trustin,这些信息对我非常有用。
猜你喜欢
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多