[英]Pub/sub implementation in nodeJS
我一直在玩nodeJS的不同發布/訂閱實現,並且想知道哪一個最適合特定的應用程序。 該應用程序的要求涉及在多通道,多用戶3D環境中實時同步對象。
我開始使用socket.io,創建了一個基本的通道數組,當用戶發送消息時,它會循環通過該通道中的用戶並向用戶的客戶端發送消息。 這很好用,我沒有遇到任何問題。
對於對象持久性,我使用node_redis添加了Redis支持。 然后我用Redis pub / sub替換了通道數組上的client.send循環作為抽象層。 但我注意到我需要為每個訂閱用戶創建一個新的Redis客戶端。 而且我仍然需要存儲socket.io客戶端信息以便在發布時發送消息。 這有多可擴展? 是否有其他(更好的)實現或進一步優化? 你會怎么做?
對於對象持久性,我使用node_redis添加了Redis支持。 然后我用Redis pub / sub替換了通道數組上的client.send循環作為抽象層。 但我注意到我需要為每個訂閱用戶創建一個新的Redis客戶端。 而且我仍然需要存儲socket.io客戶端信息以便在發布時發送消息。 這有多可擴展? 是否有其他(更好的)實現或進一步優化? 你會怎么做?
是的,您必須為每個io請求創建一個新的redis客戶端。 它很重,不可擴展。 但是創建新的redis客戶端連接不會消耗太多內存。 因此,如果您的系統用戶數不超過5000,那就沒問題。 要擴展,您可以添加slave redis服務器來解決繁重的發布和訂閱,如果您擔心創建大量連接,那么您可以增加您的操作系統使用權。
您不需要在發送的消息中存儲socket.io客戶端。 一旦redis收到訂閱的頻道消息。 它會向特定的io客戶端發送消息。
subscribe.on("message",function(channel,message) {
var msg = { message: [client.sessionId, message] };
buffer.push(msg);
if (buffer.length 15) buffer.shift();
client.send(msg); > });
訂閱多頻道。 我建議你預先存儲多個頻道的所有用戶(你可以使用存儲Mongodb或redis)。
var store = redis.createClient();
var subscriber= redis.createClient()
store.hgetall(UID, function(e, obj){
subscriber.subscribe(obj.ChannelArray.toArray());
})
我用Faye.js。 嚴重的是我能找到的最簡單的pub / sub實現。 也許這會有所幫助!
試着看看有關redis pub / sub和socket.io的這個問題。
或者你可以試試juggernaut。 它使用socket.io + redis pub子中間件+ node.js. 支持所有運輸。 它可以幫助您處理所有通道訂閱或在客戶端和redis之間發布。 Juggernaut是可擴展的,但只關注redis的開銷,它不支持身份驗證(你可以做一些技巧)。 但是redis可以每秒寫入/讀取> 150 k,所以對你的情況應該沒問題。
FYI Socket.io v0.7將支持通道,並應簡化現有代碼(不再有pub / sub lib依賴項)
請參閱: http : //cl.ly/0B0C3f133K1m3j422n0K
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.