Netty 多个工作事件循环组

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

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

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

}

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


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

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

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

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);
            });

        }
    });
}