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

标签 java tomcat spring-boot kubernetes spring-boot-actuator

您知道(如果可能的话)如何在 spring boot 微服务中为特定端点保留线程/内存吗?

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

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

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

我想过一些解决办法:

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

  2. 使用异步 http 客户端。

  3. 实现断路器。

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

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

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

你怎么看?

最佳答案

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

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

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

关于java - Kubernetes liveness - 使用 Spring Boot 为特定端点保留线程/内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50005849/

相关文章:

java - 将多个对象链接到 HttpEntity

tomcat - 使用 cas 为 SSO 配置 tomcat

java - 关于Java应用程序的内存使用

java - spring boot - 基本的 Active Directory 身份验证然后是 JWT token

java - 无法启动新的 Android Activity

java - 我如何用 Gson java 解析这个转义的 Json?

java - 重新启动 aerospike 服务器读取旧值

java - CORS 不适用于不同的网址

java - 如何在 Redis 中对复杂对象进行建模

java - 在服务层使用DTO是一个好的实践吗?