Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 奈蒂:我如何减少来自服务器的连续消息之间的延迟?_Java_Sockets_Delay_Netty - Fatal编程技术网

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

Java 奈蒂:我如何减少来自服务器的连续消息之间的延迟?,java,sockets,delay,netty,Java,Sockets,Delay,Netty,我是使用Netty的socket服务器的开发团队成员。当客户端发送请求,而服务器发送单个响应时,往返时间相当快。(好)我们最近注意到,如果来自客户端的请求触发来自服务器的两条消息,即使服务器几乎同时将这两条消息写入客户端,到达远程客户端的第一条和第二条消息之间的延迟也会超过200毫秒。使用本地客户端时,两条消息同时到达。如果远程客户端在来自服务器的第二条消息到达之前发送另一条请求,则会立即发送第二条消息,但新请求的两条消息都会以超过200ms的延迟发送 由于在使用Netty 3.3.1时注意到了

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

由于在使用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的开发人员目前不可用,我正在尝试填写。

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

这就是为服务器端设置选项的方式

    serverBootstrap.setOption("child.tcpNoDelay", true);
这是给客户端的

    clientBootStrap.setOption("tcpNoDelay", true);

进一步阅读:

您能提供代码的适用部分吗?当您说两条消息几乎同时写入时,您的意思是说
channel.write()
被直接调用,并在大约同时为两个请求完成,或者在这两者之间是否有一个层在管理代码中的写操作?@increment1:当我打开HexLoggingHandler的调试级别日志记录时,它会在调用super.writeRequested(ctx,e)之前立即记录每条消息;超级机器人是SimpleChannelHandler。在我的测试中,时间戳通常相隔1或2毫秒。您确定延迟在服务器端吗?您是否使用Wireshark等工具检查过实际的netowrk流量?另一个观察:您似乎正在为每个侦听器创建一个新的ServerSocketFactory。那太贵了。同类的侦听器可能应该共享同一个工厂。客户端机器上的Wireshark确认第二条消息到达的时间明显较晚。非常感谢@Timmy!这正是我需要的!通常,遵循Nagle的算法是个好主意。因为Nagle的算法是为了保护网络不受做这种事情的愚蠢应用的影响,一个幼稚的TCP堆栈可能最终发送100000个单字节数据包。。。但是对于这个特定的用例,您需要超越Nagle的算法。但是你应该阅读上面提到的url的最后一部分,它说不禁用Nagle算法的重要性在Greg Minshall的电子邮件中有详细说明:。。。