任何服务器的最大连接超时是多少?
What is the maximum connection timeout to any server?
我有这个简单的 Spring 基于引导的 Web 应用程序,它可以从多个 API 中下载数据。他们中的一些人没有及时回复,因为我的 connectionTimeout
设置为大约 4 秒。
一旦我摆脱 connectionTimeout
设置,我就会在 20 秒左右后收到异常。
所以,我的问题是,我可以尝试连接到 API 多长时间,这取决于什么?这 20 秒从何而来?如果 API 在 40 分钟后响应,我将无法捕捉到那个特定时刻并且只会丢失数据怎么办。我不希望发生这种情况。我有哪些选择?
这是设置连接的代码。没什么特别的。
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create().build());
clientHttpRequestFactory.setConnectTimeout(4000);
RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);
然后我通过以下方式检索值:
myObject.setJsonString(restTemplate.getForObject(url, String.class));
尝试增加超时时间。 4秒太少了。
它将需要连接、制定数据和 return。所以 4 秒仅用于连接,当它尝试 return 任何东西时,您的应用程序已经断开连接。
将其设置为 20 秒进行测试。您可以将其设置得更长,以便 API 有足够的时间完成。这并不意味着您的应用程序将用完所有连接超时时间。一旦结果被 returned,它就会完成。此外 API 的设计不会花费很长时间。他们将尽快完成任务并return得到结果
默认值和最大值与服务器无关。这取决于客户端平台,但大约需要一分钟。你可以减少它,但不能增加它。四秒太短了。大多数情况下应该以几十秒为单位。
连接超时不存在或连接超时较长不会导致任何类型的服务器错误。你找错人了。
连接超时是指您的程序在指定时间内根本无法连接到服务器。
可以配置超时,正如您所说,某些系统可能需要更长的时间才能连接到,如果事先知道这一点,则可以允许。否则,超时会起到保护作用,防止应用程序永远等待,这在大多数情况下并不能真正提供良好的用户体验。
通常可以为读取数据配置单独的超时(套接字超时)。它们不相互包容。
解决您的问题:
检查服务器是否 运行 并接受传入连接。
您可能想使用 curl
或根据您的浏览器尝试连接。
如果一个工具可以连接,而另一个不能,请检查您的防火墙设置并确保允许来自您的 Java 程序的传出连接。测试这是否是一个问题的最简单方法是暂时禁用防病毒和防火墙工具。如果这允许连接,您要么需要关闭 FW,要么最好添加相应的例外。
在测试时将超时保持在较高的设置(或尝试将其设置为 0,这被解释为无限)。一旦你让它工作,你可以考虑调整它以反映你的服务器规格和可用性要求。
编辑:
我意识到这不一定有帮助,因为您最终确实连接了。我将保留以上内容作为一般信息。
for how long am I able to try to connect to an API and what does it depend on?
很可能是 API 所在的服务器。如果超载,响应时间可能会变长。
Where do those 20 seconds come from?
同样,这取决于 API 服务器。它可能是随机的,或者它可能在发现自己处于错误状态之前处理每个请求一段固定的时间。在这种情况下,每次可能需要 20 秒。
What if an API responds after 40 minutes of time and I won't be able to catch that specific moment and just gonna lose data. I don't want that to happen. What are my options?
- 使用更可靠的API,可能需要支付服务保证。
- 调整连接和套接字超时以允许服务器端的功能,如果事先知道的话。
- 如果响应真的是 40 分钟,那是一个非常糟糕的服务,但是继续这个假设 - 如果数据集那么大,探索 API 是否提供流式回调,你通过在 OutputStream 中进入 API 的库方法,准备就绪时它将(异步)写入响应。
- 请记住,连接和套接字超时是不同的事情。连接后,连接超时变得无关紧要(套接字已建立)。只要在套接字超时内开始接收并继续接收数据(数据包到数据包),也不会触发套接字超时。
- 使用无限超时(设置为 0),但这可能会导致应用程序的可用性差,如果服务器实际上处于离线状态并且永远不会响应,还会导致资源泄漏。在那种情况下,您将留下悬空连接。
我有这个简单的 Spring 基于引导的 Web 应用程序,它可以从多个 API 中下载数据。他们中的一些人没有及时回复,因为我的 connectionTimeout
设置为大约 4 秒。
一旦我摆脱 connectionTimeout
设置,我就会在 20 秒左右后收到异常。
所以,我的问题是,我可以尝试连接到 API 多长时间,这取决于什么?这 20 秒从何而来?如果 API 在 40 分钟后响应,我将无法捕捉到那个特定时刻并且只会丢失数据怎么办。我不希望发生这种情况。我有哪些选择?
这是设置连接的代码。没什么特别的。
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create().build());
clientHttpRequestFactory.setConnectTimeout(4000);
RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);
然后我通过以下方式检索值:
myObject.setJsonString(restTemplate.getForObject(url, String.class));
尝试增加超时时间。 4秒太少了。 它将需要连接、制定数据和 return。所以 4 秒仅用于连接,当它尝试 return 任何东西时,您的应用程序已经断开连接。
将其设置为 20 秒进行测试。您可以将其设置得更长,以便 API 有足够的时间完成。这并不意味着您的应用程序将用完所有连接超时时间。一旦结果被 returned,它就会完成。此外 API 的设计不会花费很长时间。他们将尽快完成任务并return得到结果
默认值和最大值与服务器无关。这取决于客户端平台,但大约需要一分钟。你可以减少它,但不能增加它。四秒太短了。大多数情况下应该以几十秒为单位。
连接超时不存在或连接超时较长不会导致任何类型的服务器错误。你找错人了。
连接超时是指您的程序在指定时间内根本无法连接到服务器。 可以配置超时,正如您所说,某些系统可能需要更长的时间才能连接到,如果事先知道这一点,则可以允许。否则,超时会起到保护作用,防止应用程序永远等待,这在大多数情况下并不能真正提供良好的用户体验。
通常可以为读取数据配置单独的超时(套接字超时)。它们不相互包容。
解决您的问题:
检查服务器是否 运行 并接受传入连接。 您可能想使用
curl
或根据您的浏览器尝试连接。如果一个工具可以连接,而另一个不能,请检查您的防火墙设置并确保允许来自您的 Java 程序的传出连接。测试这是否是一个问题的最简单方法是暂时禁用防病毒和防火墙工具。如果这允许连接,您要么需要关闭 FW,要么最好添加相应的例外。
在测试时将超时保持在较高的设置(或尝试将其设置为 0,这被解释为无限)。一旦你让它工作,你可以考虑调整它以反映你的服务器规格和可用性要求。
编辑:
我意识到这不一定有帮助,因为您最终确实连接了。我将保留以上内容作为一般信息。
for how long am I able to try to connect to an API and what does it depend on?
很可能是 API 所在的服务器。如果超载,响应时间可能会变长。
Where do those 20 seconds come from?
同样,这取决于 API 服务器。它可能是随机的,或者它可能在发现自己处于错误状态之前处理每个请求一段固定的时间。在这种情况下,每次可能需要 20 秒。
What if an API responds after 40 minutes of time and I won't be able to catch that specific moment and just gonna lose data. I don't want that to happen. What are my options?
- 使用更可靠的API,可能需要支付服务保证。
- 调整连接和套接字超时以允许服务器端的功能,如果事先知道的话。
- 如果响应真的是 40 分钟,那是一个非常糟糕的服务,但是继续这个假设 - 如果数据集那么大,探索 API 是否提供流式回调,你通过在 OutputStream 中进入 API 的库方法,准备就绪时它将(异步)写入响应。
- 请记住,连接和套接字超时是不同的事情。连接后,连接超时变得无关紧要(套接字已建立)。只要在套接字超时内开始接收并继续接收数据(数据包到数据包),也不会触发套接字超时。
- 使用无限超时(设置为 0),但这可能会导致应用程序的可用性差,如果服务器实际上处于离线状态并且永远不会响应,还会导致资源泄漏。在那种情况下,您将留下悬空连接。