Kubernetes liveness - 使用 Spring Boot 为特定端点保留线程/内存

Mig*_*dez 4 java tomcat spring-boot kubernetes spring-boot-actuator

您是否知道(如果可能)如何为 Spring Boot 微服务中的特定端点保留线程/内存?

我有一个通过 Spring MVC接受HTTP 请求的微服务,这些请求会触发对第三个系统的http 调用,该调用有时会部分降级,并且响应速度非常慢。我无法减少超时时间,因为有些调用本质上很慢。

/health启用了 spring-boot-actuator端点,我将它livenessProbe用作kubernetes 集群中的容器。有时,当第三个系统降级时,微服务不响应/health端点,kubernetes 重新启动我的服务。

这是因为我使用RestTemplate 进行 HTTP 调用,所以我不断创建新线程,而 JVM 开始出现内存问题。

我想过一些解决办法:

  1. 实现高可用性“/health”端点、保留线程或类似的东西。

  2. 使用异步 http 客户端。

  3. 实施断路器。

  4. 为我使用的每个第三个端点配置自定义超时。

  5. 创建其他小服务(golang)并将其部署在同一个 pod 中。该服务将处理活性探测。

  6. 将服务迁移/重构为小型服务,也可能使用其他框架/语言,如 Vert.x、go 等。

你怎么认为?

Rya*_*son 5

执行器运行状况端点对于 Spring boot 非常方便 - 在这种情况下几乎太方便了,因为它可以进行比活性探测中所需的更深入的健康检查。为了做好准备,您想要进行更深入的检查,而不是活跃度。这个想法是,如果 Pod 有点不堪重负并且没有准备好,那么它将从负载平衡中撤出并喘口气。但是,如果它在 liveness 中失败,它将重新启动。所以你只需要最少的活跃度检查(如果健康检查调用其他应用健康检查)。通过对两者都使用执行器健康状况,您忙碌的 Pod 无法在它们首先被杀死时喘口气。并且 kubernetes 在执行这两个探测器时会定期调用 http 端点,这会进一步导致您的线程使用问题(请考虑探测器上的 periodSeconds)。

对于您的情况,您可以定义 liveness 命令而不是 http 探针 - https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#define-a-liveness-command。该命令可以只检查 Java 进程是否正在运行(有点类似于您的基于 go 的探测建议)。

在许多情况下,使用执行器来实现活跃度会很好(想想在线程之前遇到不同约束的应用程序,如果您使用反应式堆栈进行异步/非阻塞,就会出现这种情况)。您的情况可能会导致问题 - 执行器对消息代理等依赖项的可用性的探测可能是另一个您过度重启的地方(在这种情况下,在第一次部署时)。