在HTTP请求失败或被卡住的情况下恢复/重试

问题描述 投票:0回答:2

我有一个由kubernetes集群管理的基于Java的服务器。它是一个分布式环境,其中实例的数量设置为4,以处理每分钟数百万的请求。

我面临的问题是kubernetes尝试平衡群集,并在此过程中杀死pod并将其带到另一个节点,但是有待处理的HTTP请求GET和POST丢失。

什么是kubernetes或架构解决方案的解决方案,如果请求卡住/失败,我会重试?

更新:

我有两个kubernetes服务配置:

  1. LoadBalancer(与AWS ELB一起使用):面向外部
  2. ClusterIP:用于基于内部微服务的架构
java java-ee server kubernetes grizzly
2个回答
0
投票

Kubernetes为您提供了通过SIGTERM和preStop挂钩优雅处理pod终端的方法。关于此,有几篇文章,例如Graceful shutdown of pods with Kubernetes。在您的Java应用程序中,您应该监听SIGTERM并正常关闭服务器(大多数http框架都内置了这种“关闭”功能)。

我面临的问题是kubernetes尝试平衡群集,并在此过程中杀死pod并将其带到另一个节点

现在这听起来有点可疑 - 通常K8只会在特定情况下驱逐和重新安排不同节点上的pod,例如当一个节点资源不足以服务pod时。如果您的pod经常被重新安排,这通常表明其他事情正在发生,因此您应该确定根本原因(如果您在部署规范中设置了资源限制,请确保您的服务容器不超过这些 - 这是JVM容器的常见问题)。

最后,对于非幂等请求(POST / PUT),HTTP重试本质上是不安全的,因此您不能在不知道逻辑含义的情况下重试任何失败的请求。在任何情况下,重试通常发生在客户端,而不是服务器,因此它不是您可以在K8中设置的标志来启用它们。


0
投票

服务网格解决了您面临的特定问题。

有不同的服务网格可用。服务网格的一般特征是

  • 负载均衡
  • 细粒度的交通政策
  • 服务发现
  • 服务监控
  • 追踪
  • 路由

服务网

  • 使者
  • 笨拙的人

左:https://linkerd.io/2/features/retries-and-timeouts/

© www.soinside.com 2019 - 2024. All rights reserved.