2015-04-01 26 views
2

我正在開發一個我們期待的Web服務將很快大規模擴展。該服務現在使用通過redis層進行通信的socket.io羣集構建。ejabberd與socket.io + redis的benetfits

我想知道的是,如果有任何切換到ejabberd的好處? XMPP服務器能否處理比node.js + socket.io服務器更多的併發用戶?

+0

什麼用socket.i和Redis的呢?聊天?如果我知道它將用於什麼,我可以更好地回答這個問題。 – 2015-04-01 00:27:16

+0

是的,聊天:私人聊天和與多個用戶聊天。所有消息/線程都存儲在服務器中很重要。 – 2015-04-01 00:29:49

+0

大量定義刻度。 10,000,10,000,000 ... – Robin 2015-04-02 14:44:46

回答

2

Socket.io很難像XMPP當前的解決方案(尤其是ejabberd)那樣擴展。

即使您決定使用Redis Store擴展socket.io,因爲大多數文章都提到了Socket.IO的存儲概念是基於同步羣集中每個連接節點之間的所有連接數據的想法。在Socket.IO中使用哪種類型的存儲並不重要,因爲它們都使用這個概念,因爲它構建在Socket.IO存儲接口中,而不是您正在使用的存儲。

爲了解爲什麼同步對Socket.IO存儲不好,我們首先需要知道什麼是同步的。我們可以在Socket.IO管理器的initstore函數中找到這些信息。因此,這是:

  • 握手數據,握手數據包括您在授權期間添加的所有請求標頭,查詢字符串,IP地址,信息,URL和可能的自定義數據。
  • 打開,連接,甚至關閉所有連接的ID。
  • 房間名稱和已加入房間的每個ID。

所有這些數據將通過pub/sub同步到每個連接的Socket.IO服務器。因此,如果您有2個節點進程並且它們都使用Socket.IO存儲,則它們都將擁有其自己進程內存中的所有連接的所有數據。不像你想象的那樣在redis中。如果你有500個連接的用戶,這可能不是問題,但一旦你接近5.000>連接,這可以快速加起來。

檢查下面的文章可能會有所幫助:

Cluster fucks when scaling Socket.IO

Redis Store and Socket.io

How do I scale socket.io servers?

2

老實說,我會說併發用戶的數量將取決於不僅僅是你的實現。谷歌搜索沒有給出明確的答案,哪個更強大。 XMPP是一個標準,因此有規則。 Web Socket也是一種標準,但它並沒有一套非常具體的規則來管理消息。我的意見是測試這兩個,看看你更喜歡哪一個。如果你需要超級控制消息和他們會發生什麼,我會建議socket.io,如果你想要一個經過測試和測試的標準,並且不需要超級控制,請嘗試XMPP。

此外,檢查了這一點:Chat server with websocket+node.js vs a native client with xmpp

1

XMPP的好處是,它是標準的,它提供了現成的功能,一個龐大的數字。取決於你的項目的範圍和雄心壯志,你可能不得不重塑socket.io中的許多東西。

關於可伸縮性,我只能說我們對ejabberd的可伸縮性有很好的結果。我從來沒有嘗試過node.js/socket.io,所以我不能說。

它終於取決於你需要的功能。