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

时间:2019-03-11 22:20:37

标签: java java-ee server kubernetes grizzly

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

我遇到的

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

kubernetes的解决方案或体系结构解决方案是什么,如果请求卡住/失败,我可以重试吗?

更新:

我对kubernetes服务有两种配置:

  1. LoadBalancer(与AWS ELB一起使用):面向外部
  2. ClusterIP:用于基于内部微服务的架构

1 个答案:

答案 0 :(得分:0)

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

  

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

现在,这听起来有点可疑-通常,K8仅在特定情况下(例如,当某个节点用尽资源来服务Pod时)才将不同节点上的Pod逐出并重新计划。如果您的Pod经常被重新安排,这通常表明其他事情正在发生,因此您应该确定根本原因(如果在部署规范中设置了资源限制,请确保您的服务容器没有超出这些限制-这是JVM容器的常见问题。

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