gpt4 book ai didi

spring-boot - 当工作线程池变得太大时,带有undertow的Spring Boot变得无响应

转载 作者:行者123 更新时间:2023-12-02 12:03:21 24 4
gpt4 key购买 nike

我们使用undertow作为嵌入式Web服务器,在Amazon EC2的k8上运行spring-boot微服务。

每当(无论出于何种原因)我们的下游服务都被传入请求淹没,并且下游Pod的工作程序队列变得太大(我已经看到此问题发生在400 ish时),然后spring-boot完全停止处理排队的请求,并且应用程序静音。

通过JMX监视队列大小,我们可以看到随着IO工作线程将更多请求排队的原因,队列大小继续增长-但到现在为止,任何工作线程都不处理任何排队的请求。

我们看不到任何日志输出或任何表明这种情况发生的原因。

此问题在上游级联,从而使瘫痪的下游Pod导致上游Pod中的流量遇到相同的问题,并且即使在通过API网关关闭所有传入流量的情况下,它们也变得无响应。

要解决此问题,我们必须停止上游的传入流量,然后杀死所有受影响的Pod,然后再将它们重新备份并重新打开流量。

有人对此有任何想法吗?
这是预期的行为吗?
如果是这样,我们如何在队列大小变得太大并导致服务中断之前,使下排拒绝连接?
如果不是,那是什么导致这种行为?

非常感谢。
亚伦

最佳答案

我不完全确定通过调整Spring Boot版本/嵌入式Web服务器是否可以解决此问题,但是下面是使用Kubernetes / Istio进行扩展的方法。

  • liveness探针

  • 如果livenessProbe配置正确,则Kubernetes如果尚未存活,则会重新启动Pod。 https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#define-a-liveness-http-request
  • 水平Pod自动缩放器

  • 根据CPU利用率或自定义指标,增加/减少Pod的副本数。 https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
  • 垂直Pod自动缩放器

  • 根据负载增加/减少POD的CPU / RAM。 https://cloud.google.com/kubernetes-engine/docs/concepts/verticalpodautoscaler
  • 群集自动缩放器

  • 根据负载增加/减少集群中的节点数。 https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler
  • Istio速率限制和重试机制

  • 限制服务将接收的请求数量,并对无法执行的请求具有重试机制
    https://istio.io/docs/tasks/traffic-management/request-timeouts/
    https://istio.io/docs/concepts/traffic-management/#network-resilience-and-testing

    关于spring-boot - 当工作线程池变得太大时,带有undertow的Spring Boot变得无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57725693/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com