2012-06-04 43 views
6

我將不勝感激,如果有人可以幫我一個小疑問。socket.io廣播功能和Redis的發佈/訂閱架構

請告訴我使用socket.io廣播功能,並與Redis的發佈/訂閱設計架構之間的區別?

例如,在進一步的例子中,node.js服務器正在偵聽(socket.io)「鍵」(模型'todo')的CRUD請求(創建)以及值'data'。收到它時,它會再次發送給同一個用戶,並向在同一「頻道」上收聽的所有用戶進行廣播。

socket.on('todo:create', function (data, callback) { 
    var id = guid.gen() 
     , todo = db.set('/todo/' + id, data) 
     , json = todo._attributes; 

    socket.emit('todos:create', json); 
    socket.broadcast.emit('todos:create', json); 
    callback(null, json); 
}); 

但有「廣播」的東西使用socket.io,並通過一個發佈/訂閱平臺,Redis的關鍵的另一種方式:價值功能。例如,在進一步的情況下,我們正在偵聽基於「鍵」(模型),函數(創建)和值(數據)的CRUD請求。但在這種情況下,一旦其接收的,不是通過「socket.broadcast.emit()」發送,但在公佈的Redis:

socket.on(key + ':create', function (data, callback) { 
    var t = new ModelClass(data) 
    , name = '/' + key + ':create'; 
    t.save(function (err) { 
    pub.publish(key, JSON.stringify({key: name, data: t})); 
    }); 
}); 

所以在服務器端,對模型進行(每改變出版到Redis的),會被逮住了(處理),並將其發送到用戶的客戶端(在我的情況下,Backbone.js的),將根據重點渲染的模型:接收到的值:

sio.on('connection', function (socket) { 

    sub.on('message', function (channel, message) { 
     var msg = JSON.parse(message); 
     if (msg && msg.key) { 
      socket.emit(msg.key, msg.data); 
     } 
}); 

所以我的問題很簡單:-):兩種架構的區別是什麼?哪一個更具可擴展性?更好的設計?模式推進?

在我看來,pub/sub架構適用於自然不支持「實時」的平臺,如Ruby,與Node.js相比,它本身支持它。。我錯了嗎?

+0

嘿@ user1106811!您應該將答案標記爲已接受。謝謝 – jackdbernier

回答

0

Socket.io的廣播方法將廣播到所有連接到當前Node.js服務器的套接字,但如果您的應用程序變得流行,並且您需要多個服務器來承載所有socket.io連接,該怎麼辦?使用Redis的Pub/Sub,您的消息可以一次分發到多臺服務器。