问题标签 [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.
spring-boot - Kubernetes 需要多长时间才能从 Endpoints 中移除一个终止的 pod?
我们在项目中使用 Kubernetes 中的 Spring Boot。最近我们决定为我们的应用程序添加优雅关闭,以确保无缝部署,并确保在 pod 终止期间无论出于何种原因都没有请求失败。尽管 Spring Boot 提供了优雅的关闭,但由于 Kubernetes 开始从端点删除 pod 并同时向 pod 并行发送 SIGTERM 信号,因此请求似乎仍有可能失败。引用 kubernetes文档:
在 kubelet 开始正常关闭的同时,控制平面从 Endpoints(以及,如果启用的话,EndpointSlice)对象中删除正在关闭的 Pod,这些对象表示具有配置选择器的服务。
这也在此处进行了更详细的描述。那里也提供了解决方案,即
您可以在 pod 规范的 preStop 挂钩中添加睡眠,当然,将睡眠配置为对您的用例有意义的任何内容:
在示例中,此睡眠被配置为 10 秒,但我想知道它的合理值是多少,所以 pod 的终止不会不必要地延迟?
谢谢。
python - 如何优雅地停止 AWS Glue 作业?
我正在使用 Glue v3.0 (Python 3.7)。
目标是优雅地停止 Glue PySpark 作业,以便它可以正确终止并在结束之前清理其自定义资源。
我尝试使用带有处理程序的经典 signal.signal() 方法来捕获停止/中止/终止信号。
但是,它似乎不适用于python 信号文档中指定的信号(处理程序永远不会被调用)。
知道如何使用信号方法优雅地停止工作吗?
cloud-foundry - 有状态应用程序在 CF 上正常关闭
我有一个有状态的游戏应用程序,它部署在 Cloud Foundry 上。如果我更新应用程序,我需要正常关闭,即在所有正在运行的游戏完成之前不应停止旧版本。根据CF 文档,在发出cf stop
SIGTERM 后,应用程序只有 10 秒的时间关闭,然后应用程序被使用 SIGKILL 杀死。这在我的情况下不起作用。
我考虑过将状态推送到数据库或 Redis 之类的东西中,然后将正在运行的游戏热交换到新的应用程序实例,但由于我大量使用 Web Sockets,这似乎造成的问题比它解决的问题多,因为它也会打破现有的连接。
另一种解决方案是不发送cf stop
,而是向我的应用程序添加一个操作端点,例如POST /api/admin/stop
,这会使应用程序停止接受新游戏,然后在所有正在运行的游戏完成后自行关闭。
我的第三个选择可能是完全改变设计并使用像WebRTC这样的协议作为协议,这意味着应用程序将只提供静态资源,但在运行游戏时不再发挥积极作用,导致所有客户端直接相互连接通过服务器。不过,我在 WebRTC 方面没有经验,想知道该解决方案是否可靠,例如,如果某些用户使用 VPN。
现在我赞成第二种选择。但它应该是 CF 应用程序可以自行终止的方式吗?如果是的话,如何干净地做到这一点?
或者还有其他选择吗?最好的解决方案是什么?
node.js - 停止对 Express 服务器的新请求,但可以处理旧请求并发送响应
我正在优雅地关机。我的应用程序的 API 需要 10 -20 秒才能响应
上面的代码在 API 调用之间存在时间间隔时有效,但它永远不会停止我的服务器,因为我的服务器在响应旧请求之前收到了新请求。
node.js - 优雅地关闭 nodejs express 服务器
一段时间以来,我一直在寻找一种干净而健壮的方式来优雅地关闭 nodejs express 服务器。我为此使用了 terminus.js,并提出了以下代码:
Terminus 通过关闭 http 服务器然后调用 onSignal() 来处理信号,然后调用关闭函数。因为我希望在有未捕获异常的情况下重新使用关闭功能,所以关闭功能也将尝试关闭 http 服务器(如果它正在侦听)。
我使用once
from ramda 来确保关闭函数只执行一次,并且随后对它的任何调用都将被忽略。这在首先有一个 SIGINT 信号并且在服务器关闭时有一个 uncaughtException 的情况下效果很好,因为后者将被忽略。但是,当我们首先遇到触发关闭功能的 uncaughtException 并且在我们关闭时有一个信号时,就会出现问题。这将使总站尝试关闭此时可能已经关闭的服务器,从而导致ERR_SERVER_NOT_RUNNING
错误。
有关改进此代码的任何提示?难道没有什么方法可以让 terminus 也处理 uncaughtExeptions 吗?
apache-camel - Camel:关闭骆驼上下文
我正在使用 2 个独立的路由:一个正在将文件生成到一个目录中,另一个正在使用同一目录中的文件。
Route1 : ..
.toD(PATH)
// 将文件写入 PATH DIR
Route 2 :
from(PATH + "?noop=true&readLock=changed&readLockMinAge=30s")
// 使用路由 1 生成的文件
我尝试了不同的方法在处理结束时关闭 Camel 上下文。为此,我正在使用如下所示的调度程序:
它有效,但我想知道这是否是处理上下文关闭的正确方法。
java - 使用弹簧和长时间运行的线程优雅关闭
我们遇到的问题是,有多个异步线程处理大量数据,需要几分钟甚至几小时才能结束。该 pod 还处理一些其他短期运行的请求。
可能需要移动 pod,并且在此处理过程中会发生关闭。在这种情况下,我们希望线程在短期内完成它们的工作并留下一个状态,我们可以用它来处理剩余的数据。
我们已经使用graceful.shutdown=enable
.
现在的想法是我们@PreDestroy
在 bean 中引入一个方法 with 来创建异步线程。调用此方法时,它将在不同的 bean 中设置“关闭”标志。所有长时间运行的线程在处理过程中都会检查此标志,并在其为真时停止处理并将其处理的干净状态写入数据库。
这或多或少是有效的……但并非一直如此。
正如我在第一次获得关闭触发器后所理解的那样,有一个可配置的时间spring.lifecycle.timeout-per-shutdown-phase
,线程可以在不减少任何所需资源的情况下继续处理它们的工作。时间结束后,所有的shutdownhooks都以未知的顺序处理。@preDestroy
这让我想到,当我使用带有和 标志的方法时,我可能没有所有必要的资源来离开一个干净的状态。
有没有更好的解决方案?
是否需要向线程添加更多配置,例如 setAwaitTerminationSeconds(60);
or setWaitForTasksToCompleteOnShutdown(true);
?
node.js - process.exit() 不会从 express .close 回调中退出进程,仅使用 nodemon
我正在尝试为 expressjs 服务器创建一些设置和拆卸逻辑。这是我的进入代码:
启动它的 npm 脚本是"start": "FORCE_COLOR=3 nodemon index.js --exec babel-node"
.
设置和重启逻辑按预期工作。我 Mock Server is now running on port : 8080
在启动时登录到控制台。当我保存文件时,nodemon 重新启动服务器,并process.once
执行其中的代码。当我想将它全部关闭时,我ctrl + c
在终端中。stop
运行函数内的清理逻辑。但是,进程会完全退出。在终端中,我仍然卡在进程中,我必须ctrl + c
再次点击才能完全退出进程。它看起来像这样:
据我所知,没有打开的连接(其他问题提到,如果keep-alive
连接仍然打开,服务器将无法正常关闭,但据我所知,情况并非如此)。我尝试了server.close(callback)
, server.on('close', callback)
, process.exit()
,process.kill(process.pid)
等的不同变体,但似乎没有什么可以完全退出该过程。
请注意,如果我只是运行node index.js
,我没有这个问题。清理逻辑运行,进程退出完成,没有问题。仅使用 nodemon 似乎是一个问题。
我不希望其他开发人员必须等待清理逻辑运行然后再次按 ctrl + c。我缺少什么来运行我的清理逻辑并完全退出终端中的进程?
dockerfile - Dockerfile 以 CMD 执行形式使用 ARG 或 ENV(或以 shell 形式传递 SIGTERM 信号)
使用相同的代码,我需要启动 2 个应用程序 start_1 和 start_2。这是在APP ARG 中定义的。
所以要构建和启动一个特定的应用程序,我会使用sudo docker build --build-arg APP=start_1
&sudo docker run imagename
但是,我需要应用程序接收SIGTERM信号(用于正常关闭),这是不可能的,因为我使用 CMD shell 表单来读取APP ENV 参数。不幸的是,外壳形式不会传播信号。
所以我正在寻找一种在 exec 表单中包含APP参数或使用 shell 表单传递信号的方法。
kubernetes - 我找不到在 Nest 微服务中提供“正常关闭”的方法,尤其是使用 NATS
大家好,我找不到在 Nest 微服务中提供“优雅关闭”的方法,尤其是使用 NATS。
预期行为:
- Kubernetes 中的应用程序收到了“SIGTERM”信号。
- 停止侦听新的传入请求。
- 已接受请求的服务完成并给出响应。
- 应用程序关闭所有连接并关闭。