Health Checks and Graceful Shutdown

Graceful shutdown

部署应用程序的新版本时,必须替换以前的版本. 您正在使用的流程管理器将首先向应用程序发送SIGTERM信号,以通知它将被杀死. 应用程序收到此信号后,应停止接受新请求,完成所有正在进行的请求,清理其使用的资源(包括数据库连接和文件锁),然后退出.

Example Graceful Shutdown

process.on('SIGTERM', () => {
  debug('SIGTERM signal received: closing HTTP server')
  server.close(() => {
    debug('HTTP server closed')
  })
})

Health checks

负载平衡器使用运行状况检查来确定应用程序实例是否运行正常并可以接受请求. 例如, Kubernetes有两个运行状况检查

Third-party solutions

警告 :此信息是指Expressjs团队未维护的第三方站点,产品或模块. 此处列出的内容并不表示Expressjs项目团队的认可或推荐.

Terminus

Terminus是一个开源项目,可以为您的应用程序添加运行状况检查和正常关闭,从而无需编写样板代码. 您只需提供用于正常关闭的清理逻辑和用于运行状况检查的运行状况检查逻辑,然后由终端处理其余内容.

安装终端,如下所示:

npm i @godaddy/terminus --save

这是一个说明如何使用终点的基本模板. 有关更多信息,请参见https://github.com/godaddy/terminus .

const http = require('http')
const express = require('express')
const { createTerminus } = require('@godaddy/terminus')

const app = express()

app.get('/', (req, res) => {
  res.send('ok')
})

const server = http.createServer(app)

function onSignal () {
  console.log('server is starting cleanup')
  // start cleanup of resource, like databases or file descriptors
}

async function onHealthCheck () {
  // checks if the system is healthy, like the db connection is live
  // resolves, if health, rejects if not
}

createTerminus(server, {
  signal: 'SIGINT',
  healthChecks: { '/healthcheck': onHealthCheck },
  onSignal
})

server.listen(3000)

Lightship

Lightship是一个开源项目,可为您的应用程序增加健康,就绪和活跃性检查. Lightship是一个独立的HTTP服务,可作为单独的HTTP服务运行; 这允许拥有健康就绪性HTTP终结点,而无需在公共接口上公开它们.

如下安装Lightship:

npm install lightship

说明使用Lightship的基本模板:

const http = require('http')
const express = require('express')
const {
  createLightship
} = require('lightship')

// Lightship will start a HTTP service on port 9000.
const lightship = createLightship()

const app = express()

app.get('/', (req, res) => {
  res.send('ok')
})

app.listen(3000, () => {
  lightship.signalReady()
})

// You can signal that the service is not ready using `lightship.signalNotReady()`.

Lightship文档提供了相应的Kubernetes配置的示例,以及与Express.js集成的完整示例.

http-terminator

http-terminator实现了用于优雅终止express.js服务器的逻辑.

在Node.js中终止HTTP服务器需要跟踪所有打开的连接,并向它们发出服务器已关闭的信号. http-terminator实现了用于在超时时跟踪所有连接及其终止的逻辑. http-terminator还可以确保将服务器打算正常关闭的通信传达给当前正在从该服务器接收响应的所有客户端.

如下安装http-terminator:

npm install http-terminator

说明使用http终止符的基本模板:

const express = require('express')
const { createHttpTerminator } = require('http-terminator')

const app = express()

const server = app.listen(3000)

const httpTerminator = createHttpTerminator({ server })

app.get('/', (req, res) => {
  res.send('ok')
})

// A server will terminate after invoking `httpTerminator.terminate()`.
// Note: Timeout is used for illustration of delayed termination purposes only.
setTimeout(() => {
  httpTerminator.terminate()
}, 1000)

http-terminator文档提供了API文档以及与其他现有第三方解决方案的比较.

by  ICOPY.SITE