Node.js의 클러스터 모듈 소개
이 글은 주로 Node.js의 클러스터 모듈 도입을 소개합니다. 이제 여러분과 공유합니다. 도움이 필요한 친구들은 이를 참고할 수 있습니다.
Node의 단일 스레드 디자인은 완전히 활용될 수 없습니다. 머신 성능이 향상되었습니다. Node에는 상위 프로세스를 통해 여러 하위 프로세스를 관리하여 클러스터 기능을 실현할 수 있는 내장 모듈 클러스터가 추가되었습니다. 이 기사에서는 주로 Node.js 클러스터 모듈에 대한 심층 분석을 소개합니다. 관심 있는 독자는 파트너가
클러스터 모듈 개요
를 참조할 수 있습니다. 노드 인스턴스는 단일 스레드 작업입니다. 서버 측 프로그래밍에서는 일반적으로 시스템 처리량을 향상시키기 위해 클라이언트 요청을 처리하기 위해 여러 노드 인스턴스가 생성됩니다. 이러한 다중 노드 인스턴스의 경우 이를 클러스터라고 부릅니다.
노드의 클러스터 모듈을 사용하면 개발자는 원본 프로젝트 코드를 거의 수정하지 않고도 클러스터 서비스의 이점을 얻을 수 있습니다.
클러스터에는 다음과 같은 두 가지 공통 구현 솔루션이 있으며, 노드와 함께 제공되는 클러스터 모듈은 두 번째 솔루션을 채택합니다.
옵션 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가지 질문을 이해합니다. :
어떻게 주인과 일꾼은 의사소통을 하나요?
여러 서버 인스턴스와 포트 공유를 달성하는 방법은 무엇입니까?
여러 서버 인스턴스, 클라이언트의 요청을 여러 작업자에게 배포하는 방법은 무엇입니까?
다음은 개략도를 바탕으로 소개하겠습니다. 소스코드 레벨 소개는 작성자의 github을 참고하시면 됩니다.
질문 1: 주인과 일꾼 사이의 의사소통 방법
이 질문은 비교적 간단합니다. 마스터 프로세스는 Cluster.fork()를 통해 작업자 프로세스를 생성합니다. Cluster.fork()는 child_process.fork()를 통해 내부적으로 자식 프로세스를 생성합니다.
즉,
마스터 프로세스와 작업자 프로세스는 상위 프로세스와 하위 프로세스 간의 관계입니다.
마스터 프로세스와 작업자 프로세스는 IPC 채널을 통해 통신할 수 있습니다. (중요)
질문 2: 포트 공유 구현 방법
이전 예에서 여러 워커에서 생성된 서버는 동일한 포트 3000을 수신했습니다. 일반적으로 여러 프로세스가 동일한 포트를 수신하면 시스템에서 오류를 보고합니다.
우리의 예가 왜 괜찮은가요?
비결은 Listen() 메소드가 net 모듈에서 특별히 처리된다는 것입니다. 현재 프로세스가 마스터 프로세스인지 작업자 프로세스인지에 따라:
마스터 프로세스: 이 포트에서 정상적으로 요청을 수신합니다. (특별한 처리 없음)
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: 'NODE_CLUSTER', act: 'queryServer' }; process.send(message);
master伪代码如下:
worker.process.on('internalMessage', fn);
相关链接
官方文档:https://nodejs.org/api/cluster.html
Node学习笔记:https://github.com/chyingp/nodejs-learning-guide
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
위 내용은 Node.js의 클러스터 모듈 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이 기사는 NodeJS V8 엔진의 메모리 및 가비지 수집기(GC)에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다.

Non-Blocking, Event-Driven 기반으로 구축된 Node 서비스는 메모리 소모가 적다는 장점이 있으며, 대규모 네트워크 요청을 처리하는데 매우 적합합니다. 대규모 요청을 전제로 '메모리 제어'와 관련된 문제를 고려해야 합니다. 1. V8의 가비지 수집 메커니즘과 메모리 제한 Js는 가비지 수집 기계에 의해 제어됩니다.

Node용 Docker 이미지를 선택하는 것은 사소한 문제처럼 보일 수 있지만 이미지의 크기와 잠재적인 취약점은 CI/CD 프로세스와 보안에 상당한 영향을 미칠 수 있습니다. 그렇다면 최고의 Node.js Docker 이미지를 어떻게 선택합니까?

파일 모듈은 파일 읽기/쓰기/열기/닫기/삭제 추가 등과 같은 기본 파일 작업을 캡슐화한 것입니다. 파일 모듈의 가장 큰 특징은 모든 메소드가 **동기** 및 ** 두 가지 버전을 제공한다는 것입니다. 비동기**, sync 접미사가 있는 메서드는 모두 동기화 메서드이고, 없는 메서드는 모두 이기종 메서드입니다.

Node 19가 정식 출시되었습니다. 이 글에서는 Node.js 19의 6가지 주요 기능에 대해 자세히 설명하겠습니다. 도움이 되셨으면 좋겠습니다!

Node.js는 GC(가비지 수집)를 어떻게 수행하나요? 다음 기사에서는 이에 대해 설명합니다.

이벤트 루프는 Node.js의 기본 부분이며 메인 스레드가 차단되지 않도록 하여 비동기 프로그래밍을 가능하게 합니다. 이벤트 루프를 이해하는 것은 효율적인 애플리케이션을 구축하는 데 중요합니다. 다음 기사는 Node.js의 이벤트 루프에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다!

초기에 JS는 브라우저 측에서만 실행되었습니다. 유니코드로 인코딩된 문자열은 처리하기 쉬웠지만 바이너리 및 유니코드가 아닌 인코딩된 문자열을 처리하는 것은 어려웠습니다. 그리고 바이너리는 컴퓨터의 가장 낮은 데이터 형식인 비디오/오디오/프로그램/네트워크 패키지입니다.
