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

在Kubernetes Live Probes中配置Spring Boot以使其在高负载下表现良好

廖永长
2023-03-14

我使用的是Spring Boot的部署(典型的微服务web服务器部署,带有网关、独立的身份验证服务器等,前面是反向代理/负载平衡的nginx部署)。我们用Kubernetes编排Docker容器。我们正在为生产部署做准备,最近已经开始了负载测试,揭示了这些负载处理中的一些问题。

我的问题是,当服务器承受高负载时(这里是使用Gatling进行性能测试),活跃度探测返回503个错误,这是因为负载很重;这触发了库伯内特斯的重启。

当然,活跃度探测是很重要的,但是当系统开始丢弃请求时,我们应该做的最后一件事是杀死POD,这会通过将负载转移到剩余的POD而导致级联失败。

Spring执行器健康检查的这个具体问题在本SO问题中进行了描述,并提供了一些提示,但答案并不彻底。具体地说,使用活跃度命令的想法(例如检查java进程是否正在运行)在我看来是不够的,因为如果java进程正在运行,但是有一些异常,或者缺少一些资源(数据库、Kafka...),那么它将错过实际的停机时间

  1. 在Kubernetes/Cloud部署上配置production Spring有什么好的指南吗?
  2. 如何处理活性探头在高负荷下失效的具体问题,有人有这方面的经验吗?

共有1个答案

任宾鸿
2023-03-14

注意:这是@AndyWilkinson和@Chinhuang针对@AlexandreCassagne声明的解决问题的评论提供的答案:

如果一个活跃度探测表明当前的流量水平压倒了你的应用程序,以致于它无法处理html" target="_blank">请求,试图找到一种抑制的方法,这似乎对我来说是适得其反的。是否配置了就绪探测器?当你的应用变得不堪重负时,你很可能希望它表明它一时无法处理流量。一旦负载下降并恢复,它就可以重新开始处理流量,而不需要重新启动。

此外,如果缺少的资源(数据库、Kafka等)仅由单个实例使用,则活跃度探测应该只关心该资源。如果多个实例都访问了该资源,并且资源关闭,则所有活跃度探测都将失败。这将导致跨部署的级联失败和重新启动。在Spring Boot2.3参考文档中有一些关于这一点的指导。

Spring Boot 2.3引入了独立的活性和就绪探针。

 类似资料:
  • 我知道在DispatcherServlet之外使用请求范围bean需要一些配置,并且已经阅读了http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/beans.html#beans-factory-scopes-oth,但是还没有成功: 对于Servlet3.0+,这可以通过WebApplicationIni

  • 我们目前正在AmazonEC2上运行nginx背后的PHP-FPM。站点将停止响应,并在每次高负载时向客户端输出502坏网关。 这是php fpm错误的日志。日志 [25-Feb-2014 10:29:50]警告:[pool www]服务器达到pm.max_children设置(14),考虑提高它 [25-Feb-2014 12:23:11]警告:[池www]child 2029在启动8736.0

  • 问题内容: 在回答这个问题之前,我还没有开发出足以达到高服务器负载的流行方法。将我当作(叹息)刚刚降落在地球上的外星人,尽管它知道PHP和一些优化技术。 我正在用 PHP 开发一个工具,如果可以的话,它可以吸引很多用户。但是,尽管我完全有能力开发该程序,但在编写可以处理大量流量的东西时却一无所知。因此,这里有一些问题(也可以将这个问题转换为资源线程)。 资料库 目前,我计划在PHP5中使用MySQ

  • 我正在尝试通过Vertx事件总线发送大量消息,如下所示(与Hazelcast集群),而不阻塞: 当计时器的数量较小时,它可以正常工作,但在大约100个计时器时,我得到了这个错误。 我想知道如何在不阻塞的情况下扩展到100K事件/秒(作为参考,我编写了一个Vertex WebSocket测试,可能会超过这个数字)。 如果不可能,我想知道是什么阻塞了——看起来是这个类中的某个东西:https://gi

  • 我在学习Spring Boot时遇到了一些编码问题;我想添加一个像Spring3.x那样的CharacterEncodingFilter。就像这样:

  • 问题内容: 我正在从下面的代码中使用HTML5下载文件,您可以在 JSBINHTML5上实时查看运行情况。下载文件DEMO 及其工作正常,并在浏览器默认的“ 下载文件夹”中下载文件 。 但我想在其他位置下载它。就像我离线使用此代码一样,只在文件中包含上部代码。当我从浏览器运行此文件时,它将下载该文件并将其保存在。因此,我想从调用它的位置下载此文件。为此,我从以下代码中选择路径。它给了我这样的路径,