gpt4 book ai didi

java - 阻止 Spring Boot 应用程序关闭,直到所有当前请求都完成

转载 作者:IT老高 更新时间:2023-10-28 21:37:30 25 4
gpt4 key购买 nike

我们有一个 Spring Boot (2.0.4) 应用程序公开了许多端点,其中一个端点使客户端有时可以检索非常大的文件 (~200 GB)。该应用程序通过配置了滚动更新策略的 Kubernetes 部署在 Pod 中公开。

当我们通过将镜像设置为最新版本来更新我们的部署时,Pod 会被销毁并启动新的 Pod。我们为新请求提供无缝服务。然而,当前的请求可能而且确实会被切断,这对于正在下载非常大文件的客户端来说可能很烦人。

我们可以在我们的部署规范中配置 Container Lifecycle Pre-Stop Hook ,以便在通过其 PID 向应用发送关闭信号之前注入(inject)暂停。这有助于防止任何新流量流向已设置为终止的 pod。有没有办法暂停应用程序关闭过程,直到所有当前请求都完成(这可能需要几十分钟)?

这是我们在 Spring Boot 应用程序中尝试过的:

  • 实现一个拦截ContextCloseEvents的关闭监听器;不幸的是,我们无法可靠地检索 Activity 请求列表。在关闭过程的这个阶段,任何可能有用的执行器指标都不可用。

  • 通过实现 HttpSessionListener 并覆盖 sessionCreated/Destroy 方法来更新计数器来计算 Activity session 。这会失败,因为这些方法不是在单独的线程上调用的,因此始终在关闭监听器中报告相同的值。

我们应该尝试任何其他策略吗?来自应用程序本身、容器,还是直接通过 Kubernetes 资源描述符?建议/帮助/指针将不胜感激。

编辑:我们管理集群,因此我们只是试图通过修改后的 pod 规范对我们的部署进行管理更新期间减少对当前连接的客户端的服务中断

最佳答案

您可以增加 terminationGracePeriodSeconds,默认为 30 秒。但不幸的是,没有什么可以阻止集群管理员强制删除您的 pod,并且整个节点可能会消失的各种原因。

关于java - 阻止 Spring Boot 应用程序关闭,直到所有当前请求都完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56189696/

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