2013-10-21 4 views
3

실시간 감지 응용 프로그램, 여러 클라이언트 및 하나의 처리 서버가 있습니다.노드 JS의 Socket.IO에 패킷이 떨어지면

나는 Socket.IO와 NodeJS를 사용하여 최대한 빨리 클라이언트에 데이터를 전달하는 문제가 있습니다. 문제는 서버에서 전송 된 들어오는 데이터가 클라이언트에서 쌓이기 시작하고 클라이언트가 뒤쳐져 (동기화되지 않음) 나타나는 것입니다.

충분한 처리량으로 클라이언트는 잘 유지합니다. 서버/클라이언트가 지정된 기간보다 오래된 방출을 삭제할 수있는 정책을 시행 할 수있는 방법이 있습니까?

데이터가 사라지고 클라이언트가 최신 상태로 유지되어야하므로 2 초보다 오래된 데이터가 손실 될 염려는 없습니다.

답변

1

휘발성 메시지를 보낼 수 없으면 삭제할 수 있습니다.

socket.volatile.emit('event', data); 

이 무엇이다 : Socket.IO는 일반적으로 클라이언트가 메시지를받은 경우를 추적하지만, 휘발성 메시지를 대신 대기의,이 검사가 수행되지 않고 Socket.IO 프로세스를 계속할 수 있습니다 문서 상태 :이

불이 기본적으로하고, 이러한 메시지는 클라이언트가 클라이언트가 네트워크 문제가 있거나하는 경우, 예를 들어 메시지를 를받을 수없는 경우 내부적으로 버퍼링 이없는 기능적 잊지 클라이언트는 폴링을 사용하는 경우 요청/응답주기의 중간에 있습니다.

클라이언트가 몇 가지 메시지 또는 이벤트를 놓친 경우 상관 없으면 이러한 이벤트를 휘발성 메시지로 보낼 수 있습니다.

+0

나는 이것이 올바른 생각하지 말아. 나는 휘발성으로 테스트했지만 아무런 영향을 미치지 않는 것으로 보인다. 브라우저가 수신 할 수 있도록 데이터가 계속 대기 중입니다. 이 경우에는 실패한 메시지 시도에 대해서만 데이터를 다시 보내려고 시도하지 않습니다. 나는 메시지 수명과 같은 것이 필요하지만 문서에서 아무것도 찾을 수 없기 때문에 그것이 존재하지 않는다고 가정하고있다. – fungus1487

+0

메시지를 삭제할 수있는 유일한 곳은 클라이언트와 서버입니다. 타임 스탬프가 포함 된 메시지를 보낼 경우에도 클라이언트는 메시지를 삭제해야합니다. 그렇습니다. 구현되지 않았습니다. – hexacyanide

+0

나는 클라이언트가 주기적으로 메시지 번호를 전송하는 경로를 가야 할 것이라고 생각한다. (이 메시지가 지나치게 멀리 떨어져있는 경우 각 메시지와 함께 전달되는 번호가 증가한다) 서버에서 일부를 건너 뛸 수 없다. . 이상적이지는 않지만 여전히 socket.io를 사용하면서 이것이 유일한 방법 일 수 있다고 생각합니다. – fungus1487

2

이 문제가 발생할 수있는 다른 사람들을 돕기 위해 서버가 소켓이 비어있을 때만 서버가 데이터를 게시 할 수 있도록 잠금 시스템을 고안했습니다.

이것은 서버가 가능한 빨리 게시된다는 것을 의미합니다. 즉, 나가는 데이터 요청을 여러 개 스택하지 않습니다. 메시지가 버려지고 최신 정보가 필요한 경우에만 유효합니다. 또한 클라이언트가 서버에 알릴 필요가 있으므로 메시지 사이에 약간의 오버 헤드가 있음을 의미합니다.

그러나 이는 내 응용 프로그램이 최신 상태를 유지하며 요청이 겹쳐서 발생하지 않는다는 것을 의미합니다. 이는 한 브라우저를 로컬로 실행하고 네트워크를 통해 실행 한 경우에 두드러졌습니다.

Server.js

var socket = ...; // Create socket 

// Create my data, in my project this updates very quickly 
// roughly 60 times per second 
var my_data = ...; 

// Initially set receiving to false as the socket 
// has no outgoing data 
socket.set('receiving', false); 

// Listen for received event, this indicates 
// that the client has received an update 
// and is now ready to receive more 
socket.on('received', function() { 
    socket.set('receiving', false); 
}); 

// Function will be called repeatedly to send out data 
function update() { 
    // Check if the socket is receiving any data 
    socket.get('receiving', function(receiving) { 
     if(!receiving) { 
      // Lock the socket from receiving future updates 
      // by setting the receiving variable to true 
      socket.set('receiving', true, function() { 
       // Now emit data 
       socket.emit('update', my_data); 
      }); 
     } 
    }); 

    setTimeout(update, 0); // Recursively call update 
} 
setTimeout(update, 0); // Start update 

Client.js는

var socket = io.connect(); 

socket.on('update', function(data) { 
    // Store the data for processing 

    // Tell the server we have received the data 
    socket.emit('received'); 
});