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

Kubernetes活跃度-使用Spring Boot为特定endpoint保留线程/内存

王英彦
2023-03-14

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

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

我启用了spring-boot-acturet/healtendpoint,并且像使用kubernetes集群中的容器LivenessProbe一样使用它。有时,当第三个系统降级时,微服务对/healtendpoint没有响应,kubernetes会重新启动我的服务。

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

我想过一些解决办法:

>

  • 实现高可用性“/health”endpoint、保留线程或类似的内容。

    使用异步http客户端

    配置我正在使用的每个第三个endpoint的自定义超时。

    创建其他小型服务(golang)并将其部署在同一个Pod中。此服务将处理活性探测。

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

  • 共有1个答案

    通俊发
    2023-03-14

    执行器健康endpoint使用Spring boot非常方便--在这种情况下几乎太方便了,因为它可以进行比在活性探测中需要的更深入的健康检查。为了准备好,你想做更深入的检查,但不是活跃。这个想法是,如果吊舱有一点不堪重负,没有做好准备,那么它将从负载平衡中退出,并获得喘息机会。但如果它的活跃度下降,它将被重新启动。因此,您只需要对活跃度进行最低限度的检查(如果运行状况检查调用其他应用程序运行状况检查的话)。通过使用促动器的健康,两者都没有办法让你忙碌的吊舱得到喘息,因为他们首先被杀死。并且kubernetes在执行两个探测时定期调用httpendpoint,这进一步加剧了线程使用问题(请考虑探测的periodSeconds)。

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

    在许多情况下,使用促动器来增强活力是很好的(想想应用程序在线程之前遇到了不同的约束,如果您使用Reactor栈进行异步/非阻塞,就会遇到这种情况)。在您的系统中,它可能会导致问题--执行器对依赖项(如消息代理)的可用性的探测可能会导致过度重新启动(在这种情况下,是在首次部署时)。

     类似资料:
    • 功能介绍 获取本APP的活跃留存用户报告相关数据 接口 https://openapi.baidu.com/rest/2.0/mtj/svc/app/getDataByKey 请求参数 此处仅列本接口特有参数,公共参数请参考报告级API说明 获取表格数据 参数名 参数类型 是否必须 描述 method string 是 retaineduser/a flag string 是 active me

    • 4.留存活跃 一、留存活跃 留存可以用作评价用户使用产品的粘性,是非常重要的一个指标。及策提供新增留存和活跃两种评估角度。 二、功能介绍 留存: 可查看今日之前某渠道、推广活动分日、周、月查看1日留存、2日留存……7日留存、14日留存、30日留存占比以及留存激活设备数; 数据导出:根据所选时间范围,CSV格式,命名方式为:留存数据 活跃: 可查看今日之前某渠道、推广活动DAU、MAU; 数据导出:

    • 我可以找到文件,其中提到我如何添加我的自定义探针和改变探针参数,如初始延迟等,但不能找到默认的探针方法使用的K8S。

    • 对于liveness,我认为它可能会开始循环使用POD/容器,尽管(在DB关闭的情况下)它可能无法修复任何东西。 准备就绪后,我想如果数据库关闭,可能会导致可用应用程序池为0。如果数据库关闭,应用程序本身很可能不会很有用,但我想部分可能仍然可以工作。 对于这种类型的事情,有推荐的最佳实践吗?

    • 活跃度(Liveness) 一个并行应用程序的及时执行能力被称为它的活跃度(liveness)。本节将介绍最常见的一种活跃度的问题——死锁,以及另外两个活跃度的问题——饥饿和活锁。 死锁(Deadlock) 死锁是指两个或两个以上的线程永远被阻塞,一直等待对方的资源。 下面是一个例子。 Alphonse 和 Gaston 是朋友,都很有礼貌。礼貌的一个严格的规则是,当你给一个朋友鞠躬时,你必须保持

    • 给出一个Python应用程序,它在无限循环中轮询Kafka主题,并在处理接收到的Kafka消息后将结果上传到s3 bucket。 null 并且活性探测只检查轮询循环是否尚未退出。 严格来说,在准备调查中检查这样的事情是不好的做法吗?