当前位置: 首页 > 知识库问答 >
问题:

多个工作事件循环组

和光启
2023-03-14

我正在尝试使用Netty4.1编写一个TCP服务器,它将承载数千个持久连接(TL)。x、 在性能测试期间,我们观察到,如果有几千个到服务器的连接,然后我们得到一个突发的连接,比如说另外几千个连接,这些新的SSL握手会使工作线程长时间处于繁忙状态,这会导致现有连接开始超时。在internet上提供的所有Netty示例中,我看到服务器是这样引导的:

 EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1)
    EventLoopGroup workerGroup = new NioEventLoopGroup();
    try {
        ServerBootstrap b = new ServerBootstrap(); // (2)
        b.group(bossGroup, workerGroup) ...

我想知道我是否可以使用两个工人组而不是一个。因此,我打算让workerGroup(如上所示)处理初始握手,一旦完成,我将从该组中注销通道,并将其注册到第二组(请参见下面的示例代码)。

class SwitchToSecondaryGroupHandler extends ChannelInboundHandlerAdapter {

private final EventLoopGroup secondaryEventLoopGroup;

public SwitchToSecondaryGroupHandler(EventLoopGroup eventLoopGroup) {
    this.secondaryEventLoopGroup = eventLoopGroup;
}

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    ctx.pipeline().remove(this);
    ChannelFuture future = ctx.channel().deregister();
    future.addListener((f) -> {
        if (f.isSuccess()) {
            ChannelFuture registerFuture = secondaryEventLoopGroup.register(ctx.channel());
            registerFuture.addListener((e) -> {
                ctx.fireChannelRead(msg);
            });

        }
    });
}

}

此处理程序将立即添加到SslHandler之后。它可能不必在通道读取之后进行,也可以在写入之前进行。这样,辅助组可以继续为现有连接提供服务,任何新连接的突发都不会影响它们。在我使用带有StringEncoder/Decoder的独立程序进行测试时,它似乎可以工作。

这种方法是否存在任何潜在问题?我所说的问题,是指netty自身的运作。

共有1个答案

胡越
2023-03-14

理论上,这是可行的,但重新注册渠道是一种“黑客”业务,这也可能导致我们在网络上不再支持这种情况。这里的问题是,当通道从一个线程移动到另一个线程时,要确保事物的可见性和执行的正确性。

我希望看到您在这里描述的问题的探查器快照,因为这显然不是我所期望的。你能不能打开一个带有所有信息的netty问题,并将探查器快照附在那里。谢谢

 类似资料:
  • 事件是应用程序与自身各个功能模块以及与操作系统进行通讯的手段,也是实现事件驱动编程模型的基础,应用程序如果要响应这些事件,通常是创建一个事件队列来集中存放它们,从事件队列取出事件并调用对应处理器就是一次事件响应,而往复执行这个操作的过程就是事件循环。 驱动接口 LCUI 对事件循环的操作有处理事件、绑定事件和解绑事件,驱动模块的职责就是基于操作系统接口向 LCUI 提供实现了这些操作的接口。首先我

  • 我正在创建一个“主”谷歌工作表的基础上的谷歌工作表文件文件夹(目前6个文件)。每个工作表的选项卡数量略有不同(有些名称略有不同),但我想循环一个公式以获取每个工作表文件中每个选项卡的值。(例如,fileA有3个选项卡,我想从每个选项卡中获取数据,并在fileB中重复类似的操作,fileB有4个选项卡)。我还想跳过几个命名选项卡。 下面是我的一段代码(2个交错函数): 但是,这只是从每个文件中的一个

  • 问题内容: nodejs体系结构内部是否存在两个事件循环? libev / libuv v8 javascript事件循环 在I / O请求上,节点是否将请求排队到libeio,而libeio又通过使用libev的事件通知数据的可用性,最后这些事件由v8事件循环使用回调来处理? 基本上,libev和libeio如何集成到nodejs架构中? 是否有任何文档可以清楚地了解nodejs内部体系结构?

  • 主要内容:事件驱动程序,实例,Node 应用程序是如何工作的?Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。 Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。 Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发

  • nodejs架构中是否有两个内部事件循环? libev/libuv v8 javascript事件循环 在I/O请求时,node是否将请求排队发送到libeio,然后lib eio使用libev通过事件通知数据的可用性,最后这些事件由v8事件循环使用回调处理? 基本上,libev和libeio在nodejs架构中是如何集成的? 是否有任何留档可以提供nodejs内部架构的清晰图片?

  • 问题内容: Node.js I / O事件循环是单线程还是多线程? 如果我有多个I / O进程,则节点会将它们置于外部事件循环中。它们是按顺序处理(最快),还是处理事件循环以同时处理它们(…以及哪些限制)? 问题答案: 事件循环 Node.js事件循环在单个线程下运行,这意味着您编写的应用程序代码在单个线程上进行评估。Nodejs本身在libuv之下使用了许多线程,但是您在编写nodejs代码时不