2014-06-24 4 views
0

저는 Socket.io를 처음 사용하고 있으며이 문제를 해결하기위한 최선의 방법을 찾고 있습니다.여러 Node.js 호스트가있는 Socket.io는 모든 클라이언트에게 방출합니다.

로드 밸런서 뒤에 네 개의 Node.js 앱 인스턴스가 있습니다.

내가 달성하고자하는 것은로드 밸런서 URL에 일부 데이터를 POST하는 또 다른 응용 프로그램을위한 것입니다.

받는 인스턴스는 데이터를 저장 한 다음 Socket.io를 사용하여 연결된 클라이언트에 데이터를 방출합니다.

브라우저/클라이언트는 한 번에 하나의 인스턴스에만 연결할 수 있습니다.

한 번에 모든 클라이언트에게 보낼 수있는 방법이 있는지 확인하려고합니까?

또는 클라이언트가 io.connect를 사용하여 여러 서버에 연결하도록합니까?

또는 Redis의 경우입니까?

+2

redis의 경우입니다. http://socket.io/docs/using-multiple-nodes/ – generalhenry

답변

5

여기 게시/구독이 필요합니다. Redis는 사용자가 원하는대로 기능을 제공합니다. Redis 클라이언트를 만들고 각 앱 서버 노드에서 업데이트 채널을 구독하기 만하면됩니다. 그런 다음 POST가 성공하면 업데이트를 게시하십시오. 마지막으로, 레디 스 클라이언트가 업데이트 샤넬을 구독 및 메시지에 socketio 이벤트를 방출 있습니다

이 방출 메시지 수신의 JS 응용 프로그램에

var express = require('express') 
    , socketio = require('socket.io') 
    , redis = require('redis') 
    , rc = redis.createClient() 
; 

var app = express(); 
var server = http.createServer(app); 
var io = socketio.listen(server); 

server.listen(3000); 

app.post('/targets', function(req, res){ 
    rc.publish('update', res.body); 
}); 

rc.on('connect', function(){ 
    // subscribe to the update channel 
    rc.subscribe('update'); 
}); 

rc.on('message', function(channel, msg){ 
    // util.log('Channel: ' + channel + ' msg: ' + msg); 
    var msg = JSON.parse(msg); 
    io.sockets.in('update').emit('message', { 
    channel: channel, 
    msg: msg 
    }); 
}); 

다음 (간결하게 잘립니다) :

socket.on('message', function(data){ 
    debugger; 
    // do something with the updated data 
}); 

물론이 새로운 Redis Server를 도입하면 또 다른 단일 실패 지점이 추가됩니다. 좀 더 강력한 구현은 AMQP 또는 ZeroMQ가있는 메시지 브로커 또는 pub/sub 기능을 제공하는 유사한 네트워킹 라이브러리와 같은 것을 사용할 수 있습니다.

+0

마지막 의견에서 카프카와 함께이 문제를 시도 할 것입니다. 그래도 아주 좋은 대답. – Jazzy

관련 문제