2013-08-20 3 views
0

저는 Node.js 및 Socket.io에서 newby입니다. 사용자가 UI에서 입력 한 데이터가 누적되면 서버에서 수집하고 간격을두고 데이터베이스를 누적하는 것입니다. 예를 들어, 서로 다른 사용자가 자신의 계정에서 메시지를 계속 입력하고 이러한 데이터를 서버에서 수집합니다. 1 분마다 데이터를 데이터베이스로 수집하고 데이터 풀이 끊어집니다. node.js와 socket.io로 가능합니까?Node.js 및 socket.io - 데이터베이스를 푸시하기 전에 데이터를 축적합니다.

답변

1

NodeJS에서 이러한 결과를 쉽게 얻을 수 있습니다.

메시지를 해시 맵 (사용자 당 키를 말하면 됨)에 축적하고 분당 타임 아웃을 트리거하여 해시 맵을 데이터베이스로 플러시하십시오.

var messages = {}; 

io.sockets.on('connection', function (socket) { 

    socket.on('message', function (data) { 
    // data.id is user id, data.content the message 
    if (!(data.id in messages)) { 
     messages[data.id] = [] 
    } 
    messages[data.id].push(data.content); 
    }); 

}); 

var flush = function() { 
    for (userId in messages) { 
    // ... write in database 

    // effectively flush messages 
    messages[userId] = []; 
    } 
    // Don't forget to set agin the next flush 
    setTimeout(flush, 1000); 
} 

setTimeout(flush, 1000); 

설치 및 테스트가 매우 쉬운 순진한 솔루션입니다.

CPU 시간에 verry greedy 인 setInterval은 사용하지 마십시오.

이 예제는 단일 스레드이므로 서버를 (짧은) 시간 동안 사용할 수 없으므로 데이터베이스에 쓰게됩니다.

고 가용성 서버가 필요한 경우 메시지 저장 및 플러시를 위해 다른 프로세스를 사용하고 메시지를 주 (통신) 프로세스에 저장하는 대신 보내십시오.

+0

답장을 보내 주셔서 감사합니다. @Feugy. 서버 성능 문제로 인해 하나씩 데이터베이스에 메시지를 작성해야한다는 의미입니까? – fgokalp

+0

절대적으로 아니오 :) 저는 데이터베이스에 글을 쓰는 데 몇 초가 걸리는 경우 주 프로세스에서 수행하지 말고 다른 작업을이 작업에만 사용해야한다고 말합니다. – Feugy