SIGTERM 事件后:进程不断接收请求

如何解决SIGTERM 事件后:进程不断接收请求

我创建了一个最小的快速 POC,只有一个基本路由在 30 秒后使用 setTimeout 发送 hello world。

我发送了一个 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 中的错误吗? 当最后一个 http 请求结束时,该进程应该立即停止并且永远不会收到任何类型的其他请求。然后告诉像 k8s 这样的管理器容器现在已经停止并且允许终止 pod。

完整的行为应该是这样的:

假设我们只有一个 Pod。

然后我们升级版本。

K8S 开始创建一个新的 Pod,在创建新的 Pod 时,它停止将任何新请求路由到旧的请求。

它不会也不应该终止旧的 pod,除非它清楚地表明他已经完成了最后一个 http 请求的服务。

那么旧的 pod 应该被终止,我们的停机时间为零——这是使用 K8S 的核心原因之一。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?