【问题标题】:How to find out whether a particular endpoint has keepalive enabled in Spring Boot?如何找出特定端点是否在 Spring Boot 中启用了 keepalive?
【发布时间】:2020-06-05 00:23:19
【问题描述】:

我有一个 Spring Boot 应用程序,其中声明了多个端点,如下所示:

@RestController
public class MyRestController {

    @PostMapping("/someRequest")
    public void doSomething(final @RequestBody MyRequest request) {
       // ...
    }

}

如何知道这个控制器使用的socket是否打开了TCP keepalive

更新 1: 我使用 libdontdie 启动了应用程序,即。 e. sudo DD_DEBUG=1 DD_TCP_KEEPALIVE_TIME=4 DD_TCP_KEEPALIVE_INTVL=5 DD_TCP_KEEPALIVE_PROBES=6 LD_PRELOAD=/usr/lib/libdontdie.so java -jar myapp.jar --spring.config.location=myapp-config.yaml &。需要等到明天看看是否有效。

【问题讨论】:

  • 如果你使用 tomcat 和默认属性运行 springboot,keep-alive 选项为 true。 docs.spring.io/spring-boot/docs/current/reference/html/…
  • 对不起,长时间不活动后不工作是什么意思?只要服务器启动并运行,端点就应该随时工作。有什么问题,这与 keepalive 有什么关系?
  • @user2683814 该端点被另一个应用程序 (JIRA) 的 webhook 使用。假设我开始我的应用程序。当 JIRA 在启动后立即向我的应用程序发送请求时,它可以工作(接收并处理请求)。然后我让我的应用程序运行了好几个小时,在这期间它没有收到任何请求。然后,JIRA 向该端点发送请求。我的申请未处理此请求。只有在我重新启动我的应用程序后才会处理它。
  • 仅供参考:该应用程序在 AWS (EC2) 云中的 Ubuntu 18.04 上运行。这个问题很可能是特定于操作系统的。
  • 谢谢。在这一点上,我仍然认为这与 tcp keep alive 无关。当第二个请求到来时,您能否确认您的应用程序是否仍在运行?如果没有,问题可能出在您的应用程序上。您是否尝试过分析您的应用程序并查看是否满足应用程序内存要求并且没有内存泄漏?我不熟悉这方面的 aws 方面,所以它也可能有问题。如果您有 AWS 日志,您也应该检查它们。

标签: java spring-boot networking keep-alive tcp-keepalive


【解决方案1】:

很可能发生以下情况之一。这可能与keepalive无关。

原因

  1. 由于 CPU 空闲,您的 AWS 资源正面临冷启动或进入休眠状态。这可能是由于 AWS
  2. 您的 /someRequest 端点依赖于一些下游资源,例如数据库、另一个 RESTful 服务,或者可能与 I/O 处于空闲状态有关。
  3. 如果它正在连接到数据库,请确保您启用了重新连接。这可能取决于您如何设置连接。请参阅Spring is losing connection to the DB and does not recover or reconnect,了解如何根据您的情况进行操作。

建议解决

  1. 在 AWS 控制台上检查实例的运行状况,看看它是否已达到 IDLE。尝试让节点进入 IDLE。
  2. 使用 Spring Boot Actuator 可以测试下游依赖项的健康状况,并在进行任何 API 调用之前确保您的健康状况良好。见,https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html
  3. 我不想推荐这个,但是你上面的所有选项都干了,然后创建一个虚拟端点,如 /info/health 并定期轮询它。这不是一个很好的解决方案,但预计在大多数情况下都能奏效。

【讨论】:

    【解决方案2】:

    轮询是解决方案。在特定时间间隔后继续轮询它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-30
      • 2021-12-12
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 2018-10-27
      相关资源
      最近更新 更多