nodejs를 사용하는 친구들은 node가 단일 스레드라는 것을 모두 알고 있습니다. 즉, 8코어 CPU에서 실행되고 코어 1개의 컴퓨팅 성능만 사용할 수 있다는 뜻입니다.
단일 스레딩은 항상 노드에 대한 비판이었지만 버전 0.6의 클러스터 도입으로 이러한 상황은 바뀌었습니다. 개발자는 클러스터를 사용하여 노드 서버를 멀티 스레드 서버로 쉽게 확장할 수 있습니다.
클러스터란
클러스터는 노드에서 제공하는 멀티스레딩 라이브러리입니다. 사용자는 이를 사용하여 여러 스레드를 생성할 수 있습니다. 스레드는 이 포트에 대한 외부 요청이 있는 경우 해당 요청을 임의 스레드로 전달합니다. . 각 노드 스레드는 수십 메가바이트의 메모리를 차지하므로 PHP처럼 각 요청에 대해 스레드를 생성할 수 없습니다. 일반적으로 생성되는 스레드 수는 최대 CPU 코어 수를 초과하지 않습니다.
if (cluster.isMaster) {
// 포크 작업자.
for (var i = 0; i
Cluster.fork();
}
Cluster.on('exit', function(worker, code, signal) {
console.log('worker ' 작업자.process.pid ' 사망');
});
} 그 밖의 {
// 작업자는 모든 TCP 연결을 공유할 수 있습니다
// 이 경우에는 HTTP 서버입니다
http.createServer(함수(req, res) {
res.writeHead(200);
res.end("hello worldn");
}).listen(8000);
}
위 코드에서 볼 수 있듯이 프로그램이 실행될 때 Cluster.isMaster는 true로 설정됩니다. false로 설정됩니다. 우리는 주로 이 변수를 사용하여 현재 스레드가 하위 스레드인지 여부를 결정합니다.
또한 각 하위 스레드가 생성된 후 충돌을 일으키지 않고 포트 8000을 수신한다는 것을 알 수 있습니다. 이는 클러스터 공유 포트의 기능입니다.
스레드 간 통신
스레드가 생성되면 서로 메모리나 데이터를 공유하지 않습니다. 모든 데이터 교환은 작업자.send 및 작업자.on('message', handler)을 통해 메인 스레드에서만 처리될 수 있습니다. 다음은 브로드캐스트 시스템의 예입니다.
if (cluster.isMaster) {
var Workers=[];
//새 작업자 생성
함수 newWorker(){
var 작업자=cluster.fork();
//정보를 듣고 방송형이면 방송으로 판단
작업자.on('메시지', 함수(msg) {
If(msg.type=='방송'){
var event=msg.event;
//이 방송을 모든 근로자에게 보냅니다
Workers.forEach(함수(작업자){
작업자.send(이벤트);
})
}
});
복귀근로자;
}
for (var i = 0; i
Workers.push(newWorker());
}
Cluster.on('online',function(작업자){
console.log('%d 작업자가 온라인 상태입니다.',worker.id);
})
} 그 밖의 {
var 작업자=cluster.worker;
//Broadcast는 방송형 메시지를 보내는 것이고, Event는 방송 내용
작업자.브로드캐스트=함수(이벤트){
작업자.send({
유형:'방송',
이벤트:이벤트
});
}
//여기서는 Worker.on을 이용하여 반환된 정보를 모니터링할 수 없는 것 같습니다
process.on('메시지',function(이벤트){
console.log('worker: ' Worker.id '가 ' event.workerId에서 이벤트를 수신했습니다.);
})
//브로드캐스트 보내기
작업자.방송({
메시지:'온라인',
작업자ID:worker.id
})
}
주의가 필요한 문제
위에서 언급했듯이 스레드 간 데이터 공유는 불가능하며, 모든 데이터 교환은 스레드 간 통신을 통해서만 가능합니다. 교환된 데이터는 모두 직렬화 가능하므로 함수, 파일 설명자, HttpResponse 등은 전달할 수 없습니다.
클러스터를 사용하는 경우 프로그램 설계 중에 데이터 교환 문제를 고려해야 합니다. 내 자신의 접근 방식은 Redis에 세션과 같은 데이터를 저장하는 것이며 각 스레드는 데이터에 액세스하는 작업을 잘 수행합니다. 노드 메모리에서.
마지막으로, 클러스터는 현재 공식적으로 Node에 의해 Experimental로 표시되어 있으며 API는 향후 변경될 수 있습니다.