NodeJS API 服务失败如何重启?

How to restart if NodeJS API service failed?

我有类似的 NodeJS 代码:

cluster.js

'use strict';

const cluster = require('cluster');
var express = require('express');
const metricsServer = express();
const AggregatorRegistry = require('prom-client').AggregatorRegistry;
const aggregatorRegistry = new AggregatorRegistry();
var os = require('os');

if (cluster.isMaster) {
    for (let i = 0; i < os.cpus().length; i++) {
        cluster.fork();
    }

    metricsServer.get('/metrics', (req, res) => {
        aggregatorRegistry.clusterMetrics((err, metrics) => {
            if (err) console.log(err);
            res.set('Content-Type', aggregatorRegistry.contentType);
            res.send(metrics);
        });
    });

    metricsServer.listen(3013);
    console.log(
        'Cluster metrics server listening to 3013, metrics exposed on /metrics'
    );
} else {
    require('./app.js'); // Here it'll handle all of our API service and it'll run under port 3000
}

正如您在上面的代码中看到的,我使用的是 NodeJS 手动集群方法而不是 PM2 集群,因为我需要通过 Prometheus 监控我的 API。我通常通过 pm2 start cluster.js 启动 cluster.js,但是由于某些数据库连接,我们的 app.js 服务失败但 cluster.js 没有。看起来我还没有处理数据库连接错误,即使我没有处理它。我想知道,

任何帮助将不胜感激,提前致谢。

您可以在您的服务器中使用 monit https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-monit 来定期监控您的进程,如果您的项目崩溃,它会重新启动它甚至可以通知您。但是在这种情况下,您必须在服务器中进行一些配置,因为 monit 会定期监视端口,如果它没有从 thta 端口收到任何回复,则会重新启动它。

否则你可以使用 forever 模块。易于安装和使用-https://www.npmjs.com/package/forever 它会监控并在 1 秒内重新启动您的应用程序

我最近发现,如果它是 died/closed 我们可以监听 worker 事件并相应地重新启动它。

代码如下:

'use strict';

const cluster = require('cluster');
var express = require('express');
const metricsServer = express();
var os = require('os');

if (cluster.isMaster) {
 for (let i = 0; i < os.cpus().length; i++) {
  cluster.fork();
 }

 cluster.on(
        "exit",
        function handleExit( worker, code, signal ) {

            console.log(  "Worker has died.", worker.process.pid );
            console.log(  "Death was suicide:", worker.exitedAfterDisconnect );

            // If a Worker was terminated accidentally (such as by an uncaught
            // exception), then we can try to restart it.
            if ( ! worker.exitedAfterDisconnect ) {

                var worker = cluster.fork();
                // CAUTION: If the Worker dies immediately, perhaps due to a bug in the
                // code, you can run [from what I have READ] into rapid CPU consumption
                // as Master continually tries to create new Workers.

            }

        }
    );

} else {
 require('./app.js');
}