2012-04-19 4 views
9

저는 Node.js에 익숙하지 않아 UDP 패킷의 페이로드를 수신하고 처리하는 애플리케이션에 대한 요청을 받았습니다.매우 빠른 node.js UDP 서버를 설정하는 방법

나는 초당 400 개 이상의 메시지에 대해 이야기하고 있는데, 이는 200,000 메시지/분에 도달 할 것입니다.

UDP 서버를 설치하기위한 코드를 작성했지만 (실제로 여기에서 문서 http://nodejs.org/api/all.html#all_udp_datagram_sockets을 얻음) 약 5 %의 패킷이 손실됩니다.

내가 실제로 개발해야하는 것은 패킷을 받고 다른 서버로 보내야하는 서버입니다. worker 메시지로 작업하십시오. 하지만 node.js의 스레딩은 악몽처럼 보입니다. 그대로

이 내 핵심입니다 : 당신은 개념을 누락

var dgram = require("dgram"); 
var fs = require("fs"); 
var stream = fs.createWriteStream("received.json",{ flags: 'w', 
    encoding: "utf8", 
    mode: 0666 }); 

var server = dgram.createSocket("udp4"); 
server.on("message", function (msg, rinfo) { 
    console.log("server got: " + msg + " from " + 
    rinfo.address + ":" + rinfo.port); 
    stream.write(msg); 
}); 

server.on("listening", function() { 
    var address = server.address(); 
    console.log("server listening " + 
     address.address + ":" + address.port); 
}); 

server.bind(41234); 
// server listening 0.0.0.0:41234 
+2

TCP 소켓과는 달리 데이터 그램은 보장되지 않는다. 대신 데이터 그램은 개별 메시지를 확인하지 않고 속도에 중점을 둡니다. – skeggse

+0

내가 Go로 전환하고 결코 뒤돌아 보지 않은 것은 이런 것들입니다. –

+0

@AParacha 제발 좀 더 자세히 설명해 드리겠습니다. D –

답변

2

, NodeJS가 당신이 요청주기에 처리한다는 의미의 측면에서 멀티 스레드로 의미하지 않는다. 다른 스레드가 없으므로 컨텍스트 스위치가 발생하지 않습니다. 멀티 코어 환경에서는 노드의 클러스터 모듈을 통해 클러스터를 만들 수 있습니다.이 블로그 게시물은 here입니다.

자식 프로세스를 포크하도록 부모 프로세스를 설정하고 자식 프로세스 만 포트에 바인딩해야합니다. 부모 프로세스는 자식 간의로드 균형 조정을 처리합니다.

: 내 블로그 게시물, 나는 i < os.cpus().length/2;을했다하지만 내가 유사한 구조를 가진 비누/XML 포워딩 서비스를 작성하고, 정보가이 개 패킷에 올 것을 발견 i < os.cpus().length;

+0

죄송합니다. 제 설명을 잘 못했지만, 문제는 UDP 클라이언트에서 초당 10k UDP 패킷을 보낼 수 있지만 UDP 서버가 로컬 호스트에서 로컬 호스트 환경으로 약 5 % 누락되었습니다. 어쨌든, 내 서버는 이미 매우 반응 적이므로 1000 (1kb) 메시지/초 이상으로 응답합니다. – Panthro

+0

"내가 정말로 필요로하는 것은 패킷을 가져 와서 다른 작업자에게 메시지로 보낼 서버"입니다.하지만 5 % 오류율을 줄이고 싶다고 가정 했습니까? 질문을 다시 쓸 수 있습니까? – Mustafa

0

해야한다. 메시지의 절반을 감지하여 다시 코드를 삽입하려면 코드를 업데이트해야했습니다. 이 페이로드 크기 문제는 UDP 문제보다 HTTP 문제가 더 많을 수 있지만, 제안 사항은 로깅을 추가하여받는 모든 것을 작성한 다음 미세한 치아 빗으로 처리하는 것입니다. 현재 얻고있는 것을 로깅하는 것처럼 보이지만 잃어버린 5 %를 파헤쳐 야 할 수도 있습니다.

5 %를 어떻게 알 수 있습니까? 트래픽을 다시 보내면 항상 5 %가됩니까? 은 항상 잃어버린 동일한 메시지입니다.

루비 및 이벤트 머신을 사용하여 VoIP/SIP 호출 데이터 용 UDP 서버를 구축했으며 지금까지는 제대로 작동했습니다. (나는 당신의 테스트 접근법에 대해 궁금해하는데, netcat이나 작은 루비 클라이언트를 통해 모든 일을했다. 나는 결코 10k 메시지를하지 않았다.)

관련 문제