Netty:如何减少来自服务器的连续消息之间的延迟?

时间:2013-04-11 22:55:36

标签: java sockets delay netty

我在开发团队中使用Netty的套接字服务器。当客户端发送请求,并且服务器发送单个响应时,往返时间非常快。 (好)我们最近注意到,如果来自客户端的请求触发来自服务器的两条消息,即使服务器几乎同时将两条消息写入客户端,第一条和第二条消息之间的延迟也会超过200毫秒到达远程客户端。使用本地客户端时,两条消息同时到达。如果远程客户端在来自服务器的第二条消息到达之前发送另一个请求,则会立即发送第二条消息,但是新请求中的两条消息都会以超过200毫秒的延迟发送。

由于在使用Netty 3.3.1时发现它,我尝试升级到Netty 3.6.5,但我仍然看到相同的行为。我们使用的是NIO,而不是OIO,因为我们需要能够支持大量的并发客户端。

是否需要配置一个可以减少200毫秒延迟的设置?

编辑以添加代码段。我希望这些是最相关的部分。

@Override
public boolean openListener(final Protocol protocol,
        InetSocketAddress inetSocketAddress) throws Exception {
    ChannelFactory factory = new NioServerSocketChannelFactory(
            Executors.newCachedThreadPool(),
            Executors.newCachedThreadPool(),
            threadingConfiguration.getProcessorThreadCount());

    ServerBootstrap bootstrap = new ServerBootstrap(factory);

    final ChannelGroup channelGroup = new DefaultChannelGroup();
    bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
               .... lots of pipeline setup snipped ......
    });

    Channel channel = bootstrap.bind(inetSocketAddress);

    channelGroup.add(channel);

    channelGroups.add(channelGroup);

    bootstraps.add(bootstrap);

    return true;
}

编写器工厂使用ChannelBuffers.dynamicBuffer(defaultMessageSize)作为缓冲区,当我们编写消息时,它是Channels.write(channel,msg)。

还有什么有用的?将代码迁移到Netty的开发人员目前无法使用,我正在尝试填写。

1 个答案:

答案 0 :(得分:8)

200ms让我觉得是Nagle算法的神奇数字。尝试在两侧将TcpNoDelay设置为true。

这是您为服务器端设置选项的方法。

    serverBootstrap.setOption("child.tcpNoDelay", true);

这是针对客户端的。

    clientBootStrap.setOption("tcpNoDelay", true);

进一步阅读:http://www.stuartcheshire.org/papers/NagleDelayedAck/