>  기사  >  웹 프론트엔드  >  Node.js의 클러스터 모듈 소개

Node.js의 클러스터 모듈 소개

不言
不言원래의
2018-07-04 11:20:271202검색

이 글은 주로 Node.js의 클러스터 모듈 도입을 소개합니다. 이제 여러분과 공유합니다. 도움이 필요한 친구들은 이를 참고할 수 있습니다.

Node의 단일 스레드 디자인은 완전히 활용될 수 없습니다. 머신 성능이 향상되었습니다. Node에는 상위 프로세스를 통해 여러 하위 프로세스를 관리하여 클러스터 기능을 실현할 수 있는 내장 모듈 클러스터가 추가되었습니다. 이 기사에서는 주로 Node.js 클러스터 모듈에 대한 심층 분석을 소개합니다. 관심 있는 독자는 파트너가

클러스터 모듈 개요

를 참조할 수 있습니다. 노드 인스턴스는 단일 스레드 작업입니다. 서버 측 프로그래밍에서는 일반적으로 시스템 처리량을 향상시키기 위해 클라이언트 요청을 처리하기 위해 여러 노드 인스턴스가 생성됩니다. 이러한 다중 노드 인스턴스의 경우 이를 클러스터라고 부릅니다.

노드의 클러스터 모듈을 사용하면 개발자는 원본 프로젝트 코드를 거의 수정하지 않고도 클러스터 서비스의 이점을 얻을 수 있습니다.

클러스터에는 다음과 같은 두 가지 공통 구현 솔루션이 있으며, 노드와 함께 제공되는 클러스터 모듈은 두 번째 솔루션을 채택합니다.

옵션 1: 여러 노드 인스턴스 + 여러 포트

클러스터의 노드 인스턴스는 각각 서로 다른 포트를 수신한 다음 역방향 프록시가 여러 포트에 대한 요청 분산을 구현합니다.

  1. 장점: 구현이 간단하고 각 인스턴스가 상대적으로 독립적이므로 서비스 안정성에 좋습니다.

  2. 단점: 포트 점유 증가, 프로세스 간 통신이 더 까다롭습니다.

옵션 2: 기본 프로세스는 요청을 하위 프로세스로 전달합니다.

클러스터에서 기본 프로세스(마스터)와 여러 하위 프로세스(작업자)를 만듭니다. 마스터는 클라이언트 연결 요청을 모니터링하고 특정 정책에 따라 작업자에게 전달합니다.

  1. 장점: 일반적으로 하나의 포트만 점유되며 통신이 비교적 간단하고 전달 전략이 더 유연합니다.

  2. 단점: 구현이 상대적으로 복잡하고 주요 프로세스의 높은 안정성이 필요합니다.

시작하기 예

클러스터 모듈에서는 기본 프로세스를 마스터라고 하고 하위 프로세스를 작업자라고 합니다.

클라이언트 요청을 처리하기 위해 동일한 CPU 수로 서버 인스턴스를 생성하는 예는 다음과 같습니다. 모두 동일한 포트에서 수신 대기하고 있습니다.

// server.js
var cluster = require('cluster');
var cpuNums = require('os').cpus().length;
var http = require('http');

if(cluster.isMaster){
 for(var i = 0; i < cpuNums; i++){
  cluster.fork();
 }
}else{
 http.createServer(function(req, res){
  res.end(`response from worker ${process.pid}`);
 }).listen(3000);

 console.log(`Worker ${process.pid} started`);
}

배치 스크립트 생성: ./req.sh.

#!/bin/bash

# req.sh
for((i=1;i<=4;i++)); do  
 curl http://127.0.0.1:3000
 echo ""
done

출력은 다음과 같습니다. 보시다시피 응답은 다양한 프로세스에서 나옵니다.

작업자 23735의 응답
작업자 23731의 응답
작업자 23729의 응답
작업자 23730의 응답

클러스터 모듈 구현 원리

클러스터 모듈을 이해합니다. 주로 3가지 질문을 이해합니다. :

  1. 어떻게 주인과 일꾼은 의사소통을 하나요?

  2. 여러 서버 인스턴스와 포트 공유를 달성하는 방법은 무엇입니까?

  3. 여러 서버 인스턴스, 클라이언트의 요청을 여러 작업자에게 배포하는 방법은 무엇입니까?

다음은 개략도를 바탕으로 소개하겠습니다. 소스코드 레벨 소개는 작성자의 github을 참고하시면 됩니다.

질문 1: 주인과 일꾼 사이의 의사소통 방법

이 질문은 비교적 간단합니다. 마스터 프로세스는 Cluster.fork()를 통해 작업자 프로세스를 생성합니다. Cluster.fork()는 child_process.fork()를 통해 내부적으로 자식 프로세스를 생성합니다.

즉,

  1. 마스터 프로세스와 작업자 프로세스는 상위 프로세스와 하위 프로세스 간의 관계입니다.

  2. 마스터 프로세스와 작업자 프로세스는 IPC 채널을 통해 통신할 수 있습니다. (중요)

질문 2: 포트 공유 구현 방법

이전 예에서 여러 워커에서 생성된 서버는 동일한 포트 3000을 수신했습니다. 일반적으로 여러 프로세스가 동일한 포트를 수신하면 시스템에서 오류를 보고합니다.

우리의 예가 왜 괜찮은가요?

비결은 Listen() 메소드가 net 모듈에서 특별히 처리된다는 것입니다. 현재 프로세스가 마스터 프로세스인지 작업자 프로세스인지에 따라:

  1. 마스터 프로세스: 이 포트에서 정상적으로 요청을 수신합니다. (특별한 처리 없음)

  2. Worker 프로세스: 서버 인스턴스를 생성합니다. 그런 다음 IPC 채널을 통해 마스터 프로세스에 메시지를 보내 마스터 프로세스도 서버 인스턴스를 생성하고 이 포트에서 요청을 수신하도록 합니다. 요청이 들어오면 마스터 프로세스는 해당 요청을 작업자 프로세스의 서버 인스턴스로 전달합니다.

요약하자면, 마스터 프로세스는 특정 포트를 수신하고 고객 요청을 작업자 프로세스로 전달합니다.

아래 그림과 같이:

질문 3: 여러 작업자에게 요청을 배포하는 방법

작업자 프로세스가 요청을 수신하기 위해 서버 인스턴스를 생성할 때마다 이는 다음을 통해 마스터에 등록됩니다. IPC 채널. 클라이언트 요청이 도착하면 마스터는 요청을 해당 작업자에게 전달할 책임이 있습니다.

구체적으로 어떤 작업자에게 전달해야 하나요? 이는 전달 전략에 따라 결정됩니다. 환경 변수 NODE_CLUSTER_SCHED_POLICY를 통해 설정하거나 Cluster.setupMaster(options) 시 전달할 수 있습니다.

默认的转发策略是轮询(SCHED_RR)。

当有客户请求到达,master会轮询一遍worker列表,找到第一个空闲的worker,然后将该请求转发给该worker。

master、worker内部通信小技巧

在开发过程中,我们会通过 process.on('message', fn) 来实现进程间通信。

前面提到,master进程、worker进程在server实例的创建过程中,也是通过IPC通道进行通信的。那会不会对我们的开发造成干扰呢?比如,收到一堆其实并不需要关心的消息?

答案肯定是不会?那么是怎么做到的呢?

当发送的消息包含cmd字段,且改字段以NODE_作为前缀,则该消息会被视为内部保留的消息,不会通过message事件抛出,但可以通过监听'internalMessage'捕获。

以worker进程通知master进程创建server实例为例子。worker伪代码如下:

// woker进程
const message = {
 cmd: &#39;NODE_CLUSTER&#39;,
 act: &#39;queryServer&#39;
};
process.send(message);

master伪代码如下:

worker.process.on(&#39;internalMessage&#39;, fn);

相关链接

官方文档:https://nodejs.org/api/cluster.html

Node学习笔记:https://github.com/chyingp/nodejs-learning-guide

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

nodejs中实现路由功能的方法

对于Nodejs的Http模块的解析

nodejs中模块定义的介绍

위 내용은 Node.js의 클러스터 모듈 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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