2017-12-18 49 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를 시작합니다. 그러나 일부 DB 연결 때문에 app.js 서비스가 실패했지만 cluster.js가 실패했습니다. 그것은 분명히 내가 DB 연결 오류를 처리하지 않은 것처럼 보입니다, 비록 그것을 처리하지 못했지만. 알고 싶습니다.

  • app.js와 cluster.js가 충돌 할 경우 항상 어떻게 다시 시작할 수 있습니까?

  • Linux crontab은 특정 포트가 항상 실행 중인지 (예 : 3000 및 3013) 확인할 수 있습니까? (좋은 생각이라면 코드를 제공 할 수 있으면 좋겠다. 리눅스에 익숙하지 않다.)

  • 또는 다른 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'); 
} 
: 여기

코드입니다