Python
集群 TCP 伺服器,因此可以向所有客戶端發送數據
我正在通過在應用程序和伺服器後端之間建立 TCP 連接來開發實時移動應用程序。每個使用者都可以向所有其他使用者發送消息。
(我正在使用Twisted在 Python 中製作 TCP 伺服器,正在創建我自己的“協議”,用於應用程序/後端之間的通信並將其託管在Amazon Web Services上。)
目前我正在嘗試使後端可擴展(且可靠)。據我所知,系統可以通過升級到更大的伺服器(這可能會變得相當有限)或通過在集群配置中添加新伺服器來應對更多使用者 - 即在負載平衡器後面放置多台伺服器,可能與他們都訪問的 1 個數據庫。
我已經勾勒出它的粗略架構:
但是,如果 Red 使用者向所有其他連接的使用者發送消息怎麼辦?Red 的伺服器與 Red 有 TCP 連接,但與 Green 沒有。
我可以想到一種方法來處理這個問題:
- 每台伺服器都可以與其他伺服器建立開放的 TCP(或 SSL)連接。當一個伺服器想要向所有使用者發送消息時,它只需將其傳遞給其他伺服器的連接即可。可以在數據庫中保存哪些伺服器線上(以及它們的 IP 地址)的記錄,其中一台伺服器可以是老闆- 即決定其他伺服器是否啟動並執行,如果沒有,它可以將它們從數據庫中刪除(如果伺服器啟動並失去了與老闆的連接,它可以檢查數據庫並查看它是否已被刪除,如果有則重新啟動 - 否則它可能會假設老闆已關閉。)
顯然,這需要改進,但顯示了一般原則。
或者,我不確定這是否可能( - 對我來說絕對是一廂情願的想法):
- 也許使用者可以只連接到一個盒子或路由器,所有伺服器都可以通過它向所有使用者發送消息?
如果您知道如何有效地集群 TCP 伺服器,或者提供解決方案的設計模式,或者有任何意見,那麼我將非常感激。謝謝 :-)
有多種方法可以做到這一點,具體取決於您最終期望擁有的伺服器數量。最多約 50 台伺服器,您可以選擇兩到三台伺服器作為“集線器”,每個集線器連接到其他集線器。每個非集線器連接到兩個集線器。
向所有連接發送消息,但您收到消息的連接除外。如果您收到重複的消息,請忽略它。您需要跟踪最近收到的消息以檢測重複消息。
您可以跟踪數據庫中的操作伺服器。
或者,使用已經這樣做的伺服器設計。例如,您可以使用 IRC 伺服器作為廣播層。