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

webclient响应时间小于3秒或45秒

鄢修德
2023-03-14

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

我发现webClient调用的响应时间要么低于3秒,要么正好是45秒,我觉得很奇怪。为什么如果响应慢,总是45秒?

我能找到的关于45秒的唯一参考来自ReactorNetty留档:

4.6. 连接池

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

有人有什么建议,为什么我的缓慢的网络客户端调用总是需要45秒才能完成?

共有3个答案

聂建茗
2023-03-14

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

https://github.com/reactor/reactor-netty/issues/1012

我现在先来看一看。

感谢所有回复!

孔甫
2023-03-14

在过去,当我在成功的连接上看到这样的延迟时,它是这样引起的:

  1. 您尝试使用域名连接,因此客户端首先调用DNS以获取地址;
  2. DNS返回IPv4和IPv6的地址记录
  3. 客户端首先尝试IPv6,但IPv6在网络上未正确配置,并且在IPv6连接超时后失败,可能在45s范围内。
  4. 然后客户端尝试IPv4,成功。

这种情况是否会发生取决于您的操作系统版本、java版本和网络配置。

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

看这里了解更多:https://serverfault.com/questions/548777/how-to-prevent-delays-associated-with-ipv6-aaaa-records

濮阳默
2023-03-14

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

 类似资料:
  • 我正在开发一个Spring boot应用程序,当响应时间超过30秒时,我必须抛出一个错误。 因为我正在使用应用程序。yml,我试过了 因为它不工作,尝试使用application.properties-. it不工作。 试图找出如何在这两种情况下抛出系统错误。即当系统空闲后发生超时且响应时间超过30秒时

  • 2.17 响应时间(边缘) 2.17.1 描述 返回5分钟颗粒度的状态码明细数据,主要返回时间戳、省份、运营商、HIT/MISS、状态码、响应时间、请求数 2.17.2 请求地址 地址: https://api.bokecs.com/channel/responseTime?time={time}domain={domain} 2.17.3 请求方式 GET 2.17.4 请求参数 参数名称 是否

  • 问题内容: 我正在使用Ubuntu 16.04 问题答案: 我遇到了这个问题,终于找到了答案。我一直在使用Marionette驱动程序,该驱动程序不再适用于FF版本53和Selenium 3.5或更高版本。该GeckoDriver文档显示系统属性应该如何引用。 我从以下位置更改了代码: 至: 现在我的本地Firefox运行正常。 希望这对其他人有帮助。

  • 我正在尝试理解WebFlux,但在WebClient调用方面遇到了一些问题。我没有看到这一行System.out.println("CusterId="CusterId);执行它似乎不调用endpoint。但是如果我使用。订阅(客户-

  • 我不熟悉vertx和RxJava。我正在尝试实现一个简单的测试程序。然而,我无法理解这个项目的动态。为什么有些请求需要10秒钟以上才能响应? 下面是我的示例测试应用程序 我想知道的是,是什么让我的响应时间变慢了?

  • 我正在使用SpringWebClient调用RESTAPI。我想根据响应抛出一个错误。例如,如果主体存在错误(400) 然后我想抛出一个带有“error message1”的错误。如果主体出现错误(400),则采用相同的方法 然后我想抛出一个错误,错误为\u cde 100020。我想用一种非阻塞的方式来做。