你真的看在兩個不同的要求:
- 負載均衡:爲多個W公開單個網絡地址eb(或其他協議)服務器。
- 多個服務器之間的通信狀態(消息)。
第一個要求很簡單:使用硬件或軟件負載均衡器,或在多個Java服務器前使用單個Apache Web服務器。
第二個要求是問題。
讓我們考慮一個系統上假設的聊天服務器。收到消息時,將解析請求,並將新消息放入收件人的內存中。例如,需要處理常見情況:用戶在會話中間註銷。您還需要弄清楚如何將收到的消息傳遞迴用戶的瀏覽器。瀏覽器可以輪詢(「在用戶X的#N之後向我發送所有消息」),或者服務器可以使用幾種技術之一推送接收到的消息。如果聊天服務器在Web服務器上運行,這應該都很熟悉。
粘性部分是:你怎麼做到這一點在多臺機器?關於我的頭頂,我可以想到幾種可以縮放OK的方法:
- 跟蹤收件人所在的服務器。使用另一個傳輸機制將消息發送到該服務器,以便可以將其推入內存,就好像發件人已在本地一樣。請參閱「消息隊列」或「企業服務總線」。
- 從通訊解耦消息處理:爲活動對話指定一個或多個服務器。讓收件人服務器向這些服務器發送消息;使用通知機制(良好)或輪詢(不太好)來提醒接收方服務器存在等待發送的聊天消息。特殊功能:使用分佈式哈希表將消息郵箱分發到服務器池;如果一臺或多臺服務器發生故障,DHT可以自動調整。
- 使用廣播:如果收件人不是本地的,則每臺服務器都將廣播到所有其他服務器。每個服務器都會收到通知;只有收件人才能用它做任何事情。
這裏的關鍵是您不能再使用多臺機器之間的共享內存。您必須使用幾種可能的機制之一來在服務器之間移動消息。你不可能爲此使用通用的,相對較高的開銷協議(如HTTP);有很多更好的工具可以提高效率,您可以在多個抽象層次上實現這一點,從使用像Terracotta這樣的共享緩存工具,像JXTA這樣的點對點網絡協議,像ActiveMQ這樣的企業服務總線等。根據用戶的瀏覽器數量,你甚至可以直接在客戶端系統上運行一些消息隊列軟件 - 通知有一條新消息可以直接發送給用戶而不是中間郵箱。
明確的優化是支持一種機制,將用戶與主動對話移動到同一臺服務器,但這不適用於大多數負載平衡機制。應該有某種方式來強制特定服務器之間的用戶親緣關係,但我想不出一個簡單的辦法。
我也在尋找這樣的東西。聊天服務器需要共享共享,並且像我們用於網頁的負載平衡將無濟於事。聊天/狀態服務器羣集是否有任何框架? – Chinta 2013-12-12 09:29:11