2014-02-05 83 views
1

我使用Backbone.iobind將我的客戶端Backbone models通過socket.io綁定到後端服務器,後端服務器又將其全部存儲到MongoDB。 我使用的是socket.io,因此我可以將更改同步回其他客戶端主幹模型。將Backbone.iobind(socket.io)與node.js服務器集羣一起使用

當我嘗試在一個node.js服務器集羣上運行同樣的事情時,問題就開始了。 使用connect-mongo設置會話存儲非常簡單,它將會話存儲到MongoDB。 但是現在我無法通知所有客戶端每次更改,因爲客戶端分佈在不同的node.js服務器之間。

我發現的唯一解決方案是在不同的node.js服務器(例如mubsub)之間設置pub/sub隊列,這似乎是一個非常重的解決方案,每次更改都會觸發所有服務器上的事件。

回答

1

您是如何得出pub/sub是「非常重的解決方案」的結論?
聽起來像你直到那部分:-)
哦,並且pub/sub是而不是一個隊列。

讓我們來看看這種說法:
關於發佈/訂閱的好處是,你發佈和訂閱頻道/專題
因此,使用經典的聊天服務器示例,假設您有一百萬個用戶連接在一起,但#myroom中只有50個用戶。
當郵件發送到#myroom時,它將被髮布一次。沒有任何重複。
在大多數使用情況下,您甚至不需要將其存儲在磁盤/ RAM上,所以我們主要在這裏查看網絡/帶寬。而且,我的意思是說,您可能已經向MongoDB投入了更多的數據(可能是通過電匯?),所以我認爲這不是您的瓶頸。

如果您還使用socket.io的房間功能(這基本上是它自己的pub/sub機制),這意味着只有5個用戶將該消息通過websocket發送給他們。
並且不,socket.io不會遍歷1M客戶端以找出它們中的哪些在#myroom ;-)
因此,消息發佈一次,每個訂閱者(node.js實例)將得到一次通知,並且只有相關的客戶端 - socket.io不會浪費CPU週期來查找它們,因爲它們在加入()或離開()房間時會跟蹤它們 - 會收到消息。
這聽起來不是很有效,重量輕嗎?

給Redis一槍。
這是非常簡單的設置,完全運行在內存,超快的,複製是非常簡單的,等

這是socket.io recommends通過節點間事件的方式。
你可以找到更多的信息/代碼here

此外,如果MongoDB無法在任何時候處理負載,則也可以使用Redis作爲會話存儲。

希望這會有所幫助!