2017-12-18 215 views
1

我有類似的代碼的NodeJS:如果NodeJS API服務失敗,如何重新啓動?

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實時並捕獲一定量的負載;做這件事我不高興嗎?

任何幫助將不勝感激,提前致謝。

回答

0

我最近發現,如果它死了/關閉,我們可以聽工人事件,並相應地重新啓動它。

下面是代碼:

'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'); 
}