我已经创建了一个最小的速成POC,它只有一个基本路径,在30岁后发送hello world,使用setTimeout。
我发送了一个HTTP请求并开始等待。同时,我跟踪节点的PID并从终端杀死它。
SIGTERM事件的触发和处理方式如下:
process.on('SIGTERM', () => {
console.log(`[SIGTERM received]`)
console.log(`[closing http server]`)
server.close(() => {
console.log(`[Http server closed]`)
process.exit(0)
})
})
出现了前两个日志,如果我试图设置另一个http请求,它就失败了。这正是我想要的。但是,当第一个http请求最终完成并返回时,可能还有3-5秒的间隙,我可以线程另一个http请求!然后,它可以等待另一个30岁,完成,然后我可以设置另一个,等等。
例如,如果有大量请求,k8s将不体面地关闭它,所有这些请求都将失败(达到超时)。
为什么会发生这种情况,它是否是Nodejs v14中的一个bug?当最后一个http请求结束时,进程应该立即停止,永远不会收到任何类型的请求。然后告诉像k8s这样的管理人员,容器现在停止了,并且允许它终止容器。
全面的行为应该是这样的:
假设我们只有一个吊舱。
然后我们升级版本。
K8S开始创建一个新的荚,当新的荚被创建时,它停止将任何新请求路由到旧的请求。
它不能也不应该终止旧舱,除非它清楚地表明他已经完成了最后一次http请求的服务。
然后旧吊舱应该终止,我们有一个零停机时间-核心原因之一使用K8S。
发布于 2022-11-01 06:57:21
https://stackoverflow.com/questions/66402824
复制相似问题