问题标签 [graceful-shutdown]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Spring Boot 2.3 Liveness Probe 功能无法正常关闭
我正在使用 Kubernetes字段测试 Spring Boot 2.3(server.shutdown=graceful
和 Tomcat Web 服务器)中的新功能正常关闭。terminationGracePeriodSeconds
当正常关闭阶段开始时,新的 HTTP 请求按预期被拒绝,此时应详细说明当前请求,直到可配置的超时 ( spring.lifecycle.timeout-per-shutdown-phase
)。奇怪的行为是 Spring boot actuator liveness 结果,因为在这种情况下,liveness 端点是不可达的。
因此,kubelet 无法知道微服务在关闭期间是否还活着,或者因为其他事情而卡住了。由于K8s liveness probe不依赖terminationGracePeriodSeconds
field,POD会根据自己的K8s liveness配置重启,Spring boot微服务因为野蛮重启无法优雅关闭。
我错过了什么吗?我该如何管理这种情况?
kubernetes - Vetx 应用程序中的优雅关闭
缩小 Kubernetes pod 并没有优雅地关闭 Vertx 应用程序(用 java 开发)。它基本上杀死了容器。
覆盖 io.vertx.core.Launcher 类的 beforeStoppingVertx 和 afterStoppingVertx 方法并打印一些日志以验证 Vertx 是否正常关闭。当 Pod 缩小时,永远不会调用 beforeStoppingVertx 和 afterStoppingVertx 方法。
尝试将 60 秒的宽限期添加到作为通用模板的部署 yml 中,但它仍然没有用(即使在 60 秒后也没有调用 beforeStoppingVertx 和 afterStoppingVertx 方法)
我怀疑 vert.x 永远不会被告知要关闭。或者它没有收到消息。我们确实有在 Kubernetes 中定义 Pre Stop 挂钩的选项, https: //kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination
问题是实际的脚本是什么,我们需要在 Pre-stop 钩子中提到它,它会指示 Vert.x 正常关闭?
python - 在这里可以接受抑制 `asyncio.CancelledError` 吗?
例子:
为避免Task was destroyed but it is pending!
警告,我必须在取消后等待任务,但等待它们会导致终端被CancelledError
. 我知道它被取消了,但我不需要看到它。
在这里使用是否contextlib.suppress
会对取消产生负面影响?我可以避免看到取消的错误(或任务被破坏的警告而无需等待)的唯一另一种方法是使用asyncio.wait
而不是开始我的初始任务asyncio.gather
。出于某种原因,wait
似乎抑制了异常。我使用return_when=asyncio.FIRST_EXCEPTION
onwait
和return_exceptions=True
on gather
。但似乎无论我如何设置他们的关键字参数,都会gather
打印异常而wait
没有。
java - SpringApplication.exit() 返回 java.lang.InterruptedException: null
最近,我将 spring boot 版本从 升级2.3.4
到2.4.2
. 我有下面的代码来优雅地关闭应用程序。
这段代码在升级之前运行良好。现在它给出了以下异常并且应用程序继续运行(没有终止)。
知道如何解决这个问题吗?
更新:
根据@vvs 的回答,我将代码更改为首先关闭 Hikari 数据源。现在 InterruptedException 不存在。令人惊讶的是,该应用程序仍在运行。我可以看到下面的日志经常记录。意思是,这些线程没有终止。
django-celery - Celery 任务在本地运行时在正常关闭时重新排队到代理,但尽管配置相同但在 kubernetes 中丢失
我有一个在 k8 pod 中运行的芹菜。这是我的芹菜清单
我在 django settings.py 中的 Celery 配置是
ctrl-C
当我使用 celery 和 redis 作为消息代理运行一个简单的 django 应用程序时,当我为工作人员启动热关机时,我的任务会重新排队到代理中。但是,当同一个应用程序部署到 celery、django 和 redis 在 3 个不同 pod 中运行的 kubernetes 时,当 celery pod 正常终止时,我的任务不会重新排队回到 redis。我无法理解为什么?我的芹菜设置在这两种情况下都没有改变。
node.js - SIGTERM 事件后:进程不断接收请求
我创建了一个最小的快递 POC,只有一个基本路由在 30 秒后使用 setTimeout 发送 hello world。
我发送了一个 HTTP 请求并开始等待。同时我跟踪了节点的PID并从终端杀死了它。
SIGTERM 事件被触发和处理如下:
出现了前两个日志,如果我尝试设置另一个 http 请求,它就会失败。正是我想要的。但是,当第一个 http 请求最终完成并返回时,可能有 3-5 秒的间隙,我可以线程另一个 http 请求!然后它可以再等 30 秒并完成,然后我可以设置另一个等等。
如果有大量请求,例如 k8s,将完全不正常地关闭它,并且所有这些请求都将失败(达到超时)。
为什么会发生,它是 Nodejs v14 中的错误吗?当最后一个 http 请求结束时,该进程应该立即停止并且永远不会收到任何类型的其他请求。然后告诉像 k8s 这样的管理器,容器现在已停止,并且允许终止 pod。
完整的行为应该是这样的:
假设我们只有一个 pod。
然后我们升级版本。
K8S 开始创建一个新的 pod,当新的 pod 被创建时,它会停止将任何新请求路由到旧的。
它不会也不应该终止旧的 pod,除非它清楚地表明他已经完成了最后一个 http 请求的服务。
然后应该终止旧的 pod,我们的停机时间为零——这是使用 K8S 的核心原因之一。
go - 通道和优雅关闭死锁
运行以下程序并运行 CTRL + C,handle
例程在尝试发送到通道时被阻止,但process
例程已关闭。有什么更好的并发设计来解决这个问题?
编辑程序以描述应用此处建议的规则的问题https://stackoverflow.com/a/66708290/4106031
输出
kubernetes - 如何在 Sidecar 中调整优雅关闭时间
想知道kubernetes中是否有任何设置可以调整sidecar容器的优雅关闭时间?正如我们发现周期太短并希望延长它。
go - 为什么 kill -15 没有优雅地杀死我的 Golang gRPC 服务?
我已经使用信号处理程序来处理SIGTERM
,SIGINT
信号。当 grpc 服务器启动并运行时,我发出sudo kill -15 [PID]
命令,但看不到正常的关闭日志报告,而且我得到:
现在,当我使用 netstat 时,它报告端口号 50051 已打开,并且由于端口号繁忙,我无法运行我的服务器。
我做了什么:
server.Stop()
函数用于停止 grpc 服务器grpcServer.GracefulStop()
,并记录一些数据。当我发布时,CTRL+C
一切都按预期工作。为什么对sudo kill -15
我有这种行为?
kubernetes - 保证 Promtail 从终止的 Kubernetes pod 中抓取所有日志消息
我正在使用loki/loki-stack版本“0.38.2”的 Promtail,有时会丢失短期 k8s pod 的日志消息或正在终止的 pod 的最终日志消息。
当我使用默认值时会发生这种情况
当我设置为sync_period
时0.1s
,不会丢失任何消息。
因此,我有以下问题:
- 是否有关于 Promtail 的配置参数的任何文档
config -> target_config -> sync_period
(除了上面的评论)? - 当我设置
sync_period
为时,我会得到什么负面影响0.1s
?我是否仍然可能丢失日志消息,只是不太可能? - 我在网上找到了很多例子,都设置
sync_period
为10s
. 为什么他们没有像我一样丢失日志消息?我可能在我的 k8s 集群中错误配置了什么?我如何保证在我的最后一条日志消息之后仍然会发生刮擦?