>  기사  >  웹 프론트엔드  >  PM2로 Node.js 클러스터링을 더 쉽게 만드는 방법

PM2로 Node.js 클러스터링을 더 쉽게 만드는 방법

小云云
小云云원래의
2017-12-21 09:19:301702검색

우리 모두 알고 있듯이 Node.js는 V8 엔진이라고 부르는 Chrome의 JavaScript 런타임 플랫폼에서 실행됩니다. V8 엔진과 이후 Node.js는 모두 단일 스레드 방식으로 실행되므로 멀티 코어 프로세서 시스템에서 성능을 극대화할 수 없습니다. 이번 글에서는 주로 PM2를 사용하여 Node.js 클러스터링을 쉽게 만드는 방법을 자세히 소개하고 있는데, 편집자가 꽤 좋다고 생각해서 지금 공유하고 참고용으로 올려드리겠습니다. 편집자를 따라 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다.

Node.js의 클러스터 모듈

다행히 Node.js는 동일한 TCP 연결을 공유하기 위해 여러 작업자 스레드를 생성할 수 있는 클러스터 모듈을 제공합니다.

어떻게 작동하나요?

먼저 클러스터는 마스터를 생성한 다음 지정한 수에 따라 여러 서버 앱(작업자 스레드라고도 함)을 복제합니다. 이는 IPC 채널을 통해 작업자 스레드와 통신하고 내장된 로드 밸런싱을 사용하여 스레드 간의 압력을 더 잘 처리합니다. 로드 밸런싱은 라운드 로빈 알고리즘(라운드 로빈 알고리즘이라고도 함)을 사용합니다.

라운드 로빈 스케줄링 전략을 사용할 때 마스터는 들어오는 모든 연결 요청을 수락()한 다음 해당 TCP 요청 처리를 선택한 작업자 스레드로 보냅니다(이 방법은 여전히 ​​IPC를 통해 통신합니다).

사용 방법은 무엇인가요?

다음은 가장 기본적인 예입니다.

var cluster = require('cluster'); 
var http  = require('http'); 
var os   = require('os');

var numCPUs = os.cpus().length;

if (cluster.isMaster) { 
 // Master:
 // Let's fork as many workers as you have CPU cores

 for (var i = 0; i < numCPUs; ++i) {
  cluster.fork();
 }
} else {
 // Worker:
 // Let&#39;s spawn a HTTP server
 // (Workers can share any TCP connection.
 // In this case its a HTTP server)

 http.createServer(function(req, res) {
  res.writeHead(200);
  res.end("hello world");
 }).listen(8080);
}

물론 스레드 수는 CPU 코어 수에 제한되지 않습니다. 왜냐하면 스레드는 하위 스레드로 실행되기 때문입니다. CPU.

보시다시피 제대로 작동하려면 코드를 클러스터의 처리 논리로 캡슐화하고 스레드가 중단될 때 수행할 작업을 지정하는 추가 코드를 추가해야 합니다.

PM2 사용 방법

내장 클러스터

PM2에는 위의 모든 처리 로직이 내부적으로 포함되어 있으므로 코드를 수정할 필요가 없습니다. 위 코드를 원래 형식인

var http = require(&#39;http&#39;);

http.createServer(function(req, res) { 
 res.writeHead(200);
 res.end("hello world");
}).listen(8080);

로 복원한 다음 콘솔에서 실행합니다.

$ pm2 start app.js -i 4

-i 해당 이름은 fork_mode 입니다. 다음 숫자는 시작할 작업자 스레드 수를 나타냅니다. 주어진 숫자가 0이면 PM2는 CPU 코어 수에 따라 해당 작업자 스레드를 생성합니다.

상황에 관계없이 앱을 계속 실행하세요.

작업 스레드가 중단되더라도 걱정하지 마세요. PM2가 즉시 다시 시작합니다. 물론 언제든지 이러한 스레드를 수동으로 다시 시작할 수도 있습니다.

실시간으로 클러스터 확장

언제든지 작업자 스레드 수를 늘려야 하는 경우 pm2 scale <를 통해 수행할 수 있습니다. ;앱 이름> 매개변수 은 작업자 스레드 수를 지정하며 클러스터 수를 늘리거나 줄이는 데 사용됩니다. pm2 scale app +3을 통해 추가할 작업자 스레드 수를 지정할 수도 있습니다.

프로덕션 환경에서 다운타임 없는 업데이트 달성

PM2의 <앱 이름> 다시 로드 기능은 모든 작업자 스레드를 순차적으로 다시 시작합니다. 각 스레드는 종료되기 전에 새 스레드가 생성될 때까지 기다리므로 프로덕션 환경에 새 코드를 배포하면 서버가 중단 없이 계속 실행됩니다.

gracefulReload 함수를 사용하면 동일한 목적을 달성할 수 있지만 차이점은 작업자 스레드를 즉시 종료하지 않고 IPC를 통해 종료 신호를 보내 모든 현재 연결을 닫고 일부 사용자 지정 작업을 처리한 다음 정상적으로 종료한다는 것입니다. 예를 들어, 다음 코드는 다음과 같습니다.

process.on('message', function(msg) { 
 if (msg === 'shutdown') {
  close_all_connections();
  delete_cache();
  server.close();
  process.exit(0);
 }
});

자동으로 시작되도록 PM2 구성

서버가 다시 시작된 후 PM2가 이전 애플리케이션을 자동으로 실행하도록 하려면 먼저 pm2 start를 통해 애플리케이션을 시작한 후 다음 명령을 실행할 수 있습니다.

pm2 save

그러면 ~/.pm2 디렉토리에 현재 PM2에서 실행 중인 모든 애플리케이션을 설명하는 dump.pm2 파일이 생성됩니다. 그런 다음 다음 명령을 실행합니다:

pm2 startup [platform]

pm2에 현재 시스템 환경을 명확하게 알리려면 선택적 매개변수 플랫폼을 추가해야 합니다. 이런 방식으로 다음에 서버가 다시 시작되면 PM2는 이전에 저장된 애플리케이션을 자동으로 실행합니다.

결론

클러스터 모듈은 매우 강력하며 PM2를 사용하면 더욱 쉬워집니다. Node 0.10.x 시대에는 Cluster.js가 아직 실험적인 제품이었으나, Node 0.11.x를 기점으로 점차 성숙해져서 Node 0.12.x 버전을 포함하여 정식 출시를 준비하기 시작했습니다. 최신 버전의 Node.js 및 PM2를 사용하는 것이 좋습니다. 이러한 제품의 기여자는 더 나은 제품을 만들기 위해 끊임없이 노력하고 있습니다.

관련 추천:

Redis 클러스터 구축 전체 기록

클러스터 배포에 관한 추천 글 10개

mysql 클러스터에 대한 간략한 소개(사진)

위 내용은 PM2로 Node.js 클러스터링을 더 쉽게 만드는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.