簡體   English   中英

擴展 websocket 節點服務器

[英]Scaling websocket node server

我知道之前已經部分地問過這個問題( How to Scale Node.js WebSocket Redis Server? ),但我想知道是否有任何替代 redis 可以在節點實例之間快速共享 websocket 對象,特別是 ws 類型的套接字( https:// github.com/einaros/ws )。 我嘗試過 redis 並遇到了 Web 套接字對象是循環的且難以序列化的問題。 然后我使用了 Crockford 的 cycle.js ( https://github.com/douglascrockford/JSON-js/blob/master/cycle.js ),但是它似乎去掉了 websocket 對象方法,因為我從節點收到錯誤說在我從 redis 讀回套接字並對其進行回收后,“對象對象沒有發送方法”。 任何幫助將非常感激。

提前致謝,詹姆斯。

海事組織,你應該為此使用消息隊列。.例如(RabbitMQ)

  1. 應用程序在節點A和節點B上啟動並連接到RabbitMQ
  2. 客戶端A連接到節點A並訂閱名為XXX客戶端的隊列
  3. 客戶端B連接到節點B並訂閱名為XXX的隊列
  4. 客戶端A將消息發送到Websocket服務器Websocket服務器將消息發送到節點A
  5. 節點A將消息發布到RabbitMQ隊列XXX
  6. 節點B從RabbitMQ收到消息,因為它已訂閱隊列XXX
  7. 節點B向客戶端B發送消息或將消息發布到節點B上所有連接的客戶端

因此,您所需要做的就是將消息傳遞隊列放入您的體系結構(RabbitMQ,ZeroMQ)等中

有一個庫可以輕松在node.js進程和機器之間擴展WebSocket,您可以簽出:

https://github.com/ClusterWS/ClusterWS

當我們談到可擴展性時,我們期望或希望聽到線性性能提升這兩個詞。 老實說,盡管大多數設置並非如此,因為它們對另一台服務器/服務的依賴太大,因此在您嘗試為用戶托管的網絡中形成了瓶頸。

當我們探索選項時,我們會聽到諸如數據庫、消息隊列和代理之類的東西; 這些很好用,但如上所述,如果對它們中的任何一個過於依賴,你肯定會破壞你的設置。


將 WSS 服務器設計為單獨運行(除非超出要求)。 您確定並設置限制,並讓 API 服務器知道這一點。 因此,如果我有 10 個聊天室,並且它們最多可容納 100 個用戶,並且將我的 WSS 服務器放在板凳上證明我可以容納 400-500 個用戶。 有了這些信息,我會為每台服務器設置 4-5 個房間。 因此,如果兩個人進入房間#1,他們就在 WSS 服務器#1 上; 如果所有 10 個聊天室都已滿,那么 WSS 服務器 #2 現在已滿,第 11 個房間將需要一個 WSS Server#3 直到第 15 個房間。

網絡中最慢的部分現在只是您的 API 服務器處理請求,但這也可能包括數據庫。


如果您的要求是比示例更多的用戶,您可以首先增加核心能力或在 MQ 或 Redis Pub/Sub 類型設置的幫助下添加第二個服務器。


不幸的是,沒有辦法正確地對用戶進行排序,所以如果 3 個房間有 20 個用戶並且所有用戶都坐在 WSS 服務器#1 上,那么仍然會留下一個有數百個用戶槽可用的房間,但這真的是一個問題嗎?

這個房間有可能會被填滿,所以讓他們留在原地,但仍然可能需要幾天時間才能達到最大,因此根據您的需要編寫一些辛辣的東西將提高您制作它的成本效益。

暫無
暫無

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

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