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 没有。看起来我还没有处理数据库连接错误,即使我没有处理它。我想知道,
如何确保我的 app.js 和 cluster.js 在崩溃时总是重新启动?
是否有 Linux crontab 可以用来检查某些端口总是 运行(即 3000 和 3013)? (如果这是个好主意,如果你能提供代码,我将不胜感激,我对 Linux 不太熟悉)
或者我可以部署另一个 NodeJS api 来检查某些服务是 运行,但是由于我的 API 是实时的并且捕获了一定数量负载;我不太乐意这样做?
任何帮助将不胜感激,提前致谢。
您可以在您的服务器中使用 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');
}
我有类似的 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 没有。看起来我还没有处理数据库连接错误,即使我没有处理它。我想知道,
如何确保我的 app.js 和 cluster.js 在崩溃时总是重新启动?
是否有 Linux crontab 可以用来检查某些端口总是 运行(即 3000 和 3013)? (如果这是个好主意,如果你能提供代码,我将不胜感激,我对 Linux 不太熟悉)
或者我可以部署另一个 NodeJS api 来检查某些服务是 运行,但是由于我的 API 是实时的并且捕获了一定数量负载;我不太乐意这样做?
任何帮助将不胜感激,提前致谢。
您可以在您的服务器中使用 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');
}