2013-04-05 179 views
3

我讀過Apache的Tomcat服務器的the document on clustering and load balancing,但我很困惑這將如何工作的通信。聊天服務器負載平衡

比方說,我正在創建一個聊天應用程序,允許用戶通過服務器互相交談。如果兩個用戶在同一臺​​服務器上,那太棒了,但如果一個用戶在一臺服務器上,另一臺用戶在另一臺服務器上呢?服務器如何通信?

我想我的觀點是,我會使用多臺服務器來減少負載,但如果用戶通過服務器進行通信,並且每個用戶都在一臺單獨的服務器上,那麼我的兩臺服務器將成爲彼此的客戶端,負載不會減少。

我的觀點是,每臺服務器的數據輸入/輸出量是相同的,所以當有100萬用戶時,這是如何工作的?

+0

我也在尋找這樣的東西。聊天服務器需要共享共享,並且像我們用於網頁的負載平衡將無濟於事。聊天/狀態服務器羣集是否有任何框架? – Chinta 2013-12-12 09:29:11

回答

0

您可以使用負載平衡器來實現您所需的功能。

基本上,服務器負載均衡器可以是:

  • 傳輸級負載平衡器 - 基於DNS的方法或TCP/IP級的負載平衡
  • 應用級負載平衡器 - 使用應用程序有效載荷以作出負載平衡決定。

基本服務器負載均衡應該是這樣的:

enter image description here

基本上,每個服務器通知有關它的當前連接數的負載均衡。負載均衡器使用此信息來決定向哪個服務器發送新客戶端。

我的意思是,它是相同數量的數據進出每臺服務器, 所以當有100萬用戶時,這是如何工作的?

實際上,如果您認爲不需要向每個客戶端廣播每個信息,它的數據量就不相同,您可以動態優化並顯着降低負載。

有關執行Tomcat的更多詳細信息,請參考以下鏈接:

2

你真的看在兩個不同的要求:

  1. 負載均衡:爲多個W公開單個網絡地址eb(或其他協議)服務器。
  2. 多個服務器之間的通信狀態(消息)。

第一個要求很簡單:使用硬件或軟件負載均衡器,或在多個Java服務器前使用單個Apache Web服務器。

第二個要求是問題。

讓我們考慮一個系統上假設的聊天服務器。收到消息時,將解析請求,並將新消息放入收件人的內存中。例如,需要處理常見情況:用戶在會話中間註銷。您還需要弄清楚如何將收到的消息傳遞迴用戶的瀏覽器。瀏覽器可以輪詢(「在用戶X的#N之後向我發送所有消息」),或者服務器可以使用幾種技術之一推送接收到的消息。如果聊天服務器在Web服務器上運行,這應該都很熟悉。

粘性部分是:你怎麼做到這一點在多臺機器?關於我的頭頂,我可以想到幾種可以縮放OK的方法:

  • 跟蹤收件人所在的服務器。使用另一個傳輸機制將消息發送到該服務器,以便可以將其推入內存,就好像發件人已在本地一樣。請參閱「消息隊列」或「企業服務總線」。
  • 從通訊解耦消息處理:爲活動對話指定一個或多個服務器。讓收件人服務器向這些服務器發送消息;使用通知機制(良好)或輪詢(不太好)來提醒接收方服務器存在等待發送的聊天消息。特殊功能:使用分佈式哈希表將消息郵箱分發到服務器池;如果一臺或多臺服務器發生故障,DHT可以自動調整。
  • 使用廣播:如果收件人不是本地的,則每臺服務器都將廣播到所有其他服務器。每個服務器都會收到通知;只有收件人才能用它做任何事情。

這裏的關鍵是您不能再使用多臺機器之間的共享內存。您必須使用幾種可能的機制之一來在服務器之間移動消息。你不可能爲此使用通用的,相對較高的開銷協議(如HTTP);有很多更好的工具可以提高效率,您可以在多個抽象層次上實現這一點,從使用像Terracotta這樣的共享緩存工具,像JXTA這樣的點對點網絡協議,像ActiveMQ這樣的企業服務總線等。根據用戶的瀏覽器數量,你甚至可以直接在客戶端系統上運行一些消息隊列軟件 - 通知有一條新消息可以直接發送給用戶而不是中間郵箱。

明確的優化是支持一種機制,將用戶與主動對話移動到同一臺服務器,但這不適用於大多數負載平衡機制。應該有某種方式來強制特定服務器之間的用戶親緣關係,但我想不出一個簡單的辦法。