gpt4 book ai didi

java - Netty只在一个线程中处理消息

转载 作者:行者123 更新时间:2023-12-01 13:23:32 24 4
gpt4 key购买 nike

我在使用 netty 时遇到一些问题。

几年前,我使用 smartfox 服务器 1.6x,它的多线程模型使我能够在不同线程中处理连接的消息。该功能迫使我编写一些线程同步代码,以便正确处理所有消息。

现在我使用 netty,因为它对于我的目标来说是令人惊奇且非常有用的产品。

因此,我实现了一些基于服务器的逻辑。我的测试如下

  • 服务器将消息添加到队列中,处理每条消息,当前线程 hibernate 3 秒
  • 客户端每秒发送约 10 条垃圾邮件

我看到,在第一条消息(前十条)未处理之前(通常大约 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);
}

最佳答案

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

关于java - Netty只在一个线程中处理消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21908943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com