Java 网络客户端响应时间少于3秒或45秒

Java 网络客户端响应时间少于3秒或45秒,java,spring-boot,reactor-netty,spring-webclient,Java,Spring Boot,Reactor Netty,Spring Webclient,我有一个非常基本的SpringBoot2.2.4应用程序,它使用webclient和阻塞调用查询下游系统。我没有对webclient进行任何配置(设置超时等),只是“开箱即用” 我发现webclient调用的响应时间要么低于3秒,要么正好是45秒,这让我感到非常奇怪。为什么如果响应缓慢,它总是45秒 我能找到的关于45秒的唯一参考资料来自反应堆Netty文档: 4.6。连接池 默认情况下,TCP客户端使用一个“固定”连接池,最大通道数为500,采集超时为45秒。这意味着,如果有人试图获取通道,但

我有一个非常基本的SpringBoot2.2.4应用程序,它使用webclient和阻塞调用查询下游系统。我没有对webclient进行任何配置(设置超时等),只是“开箱即用”

我发现webclient调用的响应时间要么低于3秒,要么正好是45秒,这让我感到非常奇怪。为什么如果响应缓慢,它总是45秒

我能找到的关于45秒的唯一参考资料来自反应堆Netty文档:

4.6。连接池

默认情况下,TCP客户端使用一个“固定”连接池,最大通道数为500,采集超时为45秒。这意味着,如果有人试图获取通道,但池中没有通道,则实现将创建一个新通道。当达到池中通道的最大数量时,获取通道的新尝试将延迟,直到通道再次返回到池中。该实现对池中的通道使用FIFO顺序。默认情况下,没有为池中的通道指定空闲时间


有人对为什么我的慢速网络客户端呼叫总是需要45秒才能完成有任何建议吗?

这是因为固定池大小为500。如果现有请求当前正在使用所有这些连接(通道),则新的连接请求将排队,直到500个连接中的一个空闲。如果WebClient无法在45秒内获取新请求的连接(因为所有500个通道仍被现有请求阻塞),它将失败,并出现AcquireTimeout异常。我假设在3秒前完成的是成功的,而45秒的是失败的。根据应用程序的吞吐量,您可以相应地调整池大小。

这是因为固定池大小为500。如果现有请求当前正在使用所有这些连接(通道),则新的连接请求将排队,直到500个连接中的一个空闲。如果WebClient无法在45秒内获取新请求的连接(因为所有500个通道仍被现有请求阻塞),它将失败,并出现AcquireTimeout异常。我假设在3秒前完成的是成功的,而45秒的是失败的。根据应用程序的吞吐量,您可以相应地调整池大小。

过去,当我在成功连接上看到类似这样的延迟时,其原因如下:

  • 您尝试使用域名连接,因此客户端首先调用DNS以获取地址
  • DNS返回IPv4和IPv6的地址记录
  • 客户端首先尝试IPv6,但IPv6未在网络上正确配置,并且在IPv6连接超时(可能在45秒范围内)后失败
  • 然后,客户机尝试IPv4,成功
  • 这是否会发生在您身上取决于您的OS+版本、java版本和网络配置

    尝试在IPv4 IP地址中连接,如。如果它总是很快的话,那么你可能有类似上面的问题。不幸的是,您通常无法通过HTTPS以这种方式连接,但根据您的操作系统,您可以尝试在/etc/hosts中填充正确的v4地址


    查看此处了解更多信息:

    在过去,当我在成功连接上看到这样的延迟时,其原因如下:

  • 您尝试使用域名连接,因此客户端首先调用DNS以获取地址
  • DNS返回IPv4和IPv6的地址记录
  • 客户端首先尝试IPv6,但IPv6未在网络上正确配置,并且在IPv6连接超时(可能在45秒范围内)后失败
  • 然后,客户机尝试IPv4,成功
  • 这是否会发生在您身上取决于您的OS+版本、java版本和网络配置

    尝试在IPv4 IP地址中连接,如。如果它总是很快的话,那么你可能有类似上面的问题。不幸的是,您通常无法通过HTTPS以这种方式连接,但根据您的操作系统,您可以尝试在/etc/hosts中填充正确的v4地址


    查看此处了解更多信息:

    我认为这与这个棘手的问题有关:

    我现在先看一下


    谢谢你的回复

    我认为这与这个棘手的问题有关:

    我现在先看一下


    谢谢你的回复

    当通话需要45秒时,是成功还是失败?如果失败,那就是错误?另外,请尝试使用IP地址而不是域名连接。这将消除或指示与以下内容相关的可能问题:DNS@Matt,它成功了,从不失败。当一个呼叫需要45秒时,它成功了还是失败了?如果失败,那就是错误?另外,请尝试使用IP地址而不是域名连接。这将消除或指示与以下内容相关的可能问题:DNS@Matt,它成功了,从来没有失败过。45秒也成功了-没有失败。45秒也成功了-没有失败。