首页 > 语言 > JavaScript > 正文

Node.js 进程平滑离场剖析小结

2024-05-06 15:42:53
字体:
来源:转载
供稿:网友

使用 Node.js 搭建 HTTP Server 已是司空见惯的事。在生产环境中,Node 进程平滑重启直接关系到服务的可靠性,它的重要性不容我们忽视。既然是平滑重启,就涉及到新旧进程的接替过渡:

首先,保证新进程平滑入场 其次,保证旧进程平滑离场

本文主要谈论下,在新旧进程接替过渡期间,如何保证旧进程平滑离场。那怎样的离场才算平滑的呢?

如何定义平滑离场

以进程离场作为时间分割点,我们可以把请求分为两类:增量请求存量请求

在进程离场前,停止接收新的(增量)请求 在进程离场前,保证未完成的(存量)请求正常响应

所以,达成以上两个目标,基本上我们就认为进程的离场是平滑的。在谈如何做到进程平滑离场前,我们需要一种机制,这种机制能让我们主动通知进程何时离场,这就涉及到进程间通信(IPC)的知识了,我们先简单了解下。

进程间通信

对 Unix 或类 Unix 系统而言,进程间通信的方式有很多种 —— 信号(Signal)是其中的一种。

信号的种类有很多,如 SIGINT、 SIGTERM SIGKILL 等。这些信号视具体需要用于不同的场景,比如 SIGKILL 一般用于强杀进程。

我们可以在命令行执行 kill -l 查看所有的信号,如下所示(其中的数字表示 signal number):

$ kill -l 1) SIGHUP   2) SIGINT   3) SIGQUIT   4) SIGILL 5) SIGTRAP   6) SIGABRT   7) SIGEMT   8) SIGFPE 9) SIGKILL  10) SIGBUS  11) SIGSEGV  12) SIGSYS13) SIGPIPE  14) SIGALRM  15) SIGTERM  16) SIGURG17) SIGSTOP  18) SIGTSTP  19) SIGCONT  20) SIGCHLD21) SIGTTIN  22) SIGTTOU  23) SIGIO  24) SIGXCPU25) SIGXFSZ  26) SIGVTALRM  27) SIGPROF  28) SIGWINCH29) SIGINFO  30) SIGUSR1  31) SIGUSR2

我们可以使用 kill 命令向进程发送指定信号:

# 发送 SIGTERM 信号(默认,无须指定信号类型)给进程$ kill <pid># 发送 SIGINT 信号给进程,其中 <pid> 为具体的进程 ID$ kill -INT <pid># 发送 SIGKILL 信号给进程$ kill -KILL <pid># 或者$ kill -9 <pid>

进程可以对接收到的信号作出回应。对 Node 应用而言,信号是被当作事件发送给 Node 进程的,进程接收到 SIGTERM 及 SIGINT 事件有默认回调,官方文档是这么描述的:

'SIGTERM' and 'SIGINT' have default handlers on non-Windows platforms that reset the terminal mode before exiting with code 128 + signal number. If one of these signals has a listener installed, its default behavior will be removed (Node.js will no longer exit).

这句话写的很抽象,它是什么意思呢?我们以一个简单的 Node 应用为例。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选