簡體   English   中英

nodeJS中的發布/訂閱實現

[英]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,所以對你的情況應該沒問題。

https://github.com/maccman/juggernaut

FYI Socket.io v0.7將支持通道,並應簡化現有代碼(不再有pub / sub lib依賴項)

請參閱: http//cl.ly/0B0C3f133K1m3j422n0K

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM