2011-05-23 36 views
9

我試圖設計一個實時羣聊應用程序,專門針對大羣體(> 50個用戶)在每個聊天室中。並非所有的用戶都會一次積極地聊天,但是人們可以期望很多用戶只需閒聊/收聽聊天,並在聊天室聊天時收到更新。設計後端(雲)服務器以避免「熱點」場景

我制定了一個不是面向雲的原型,並且正在爲基於雲的系統重新設計。

我希望有一個重定向/負載平衡服務器(LBServer)重定向到一系列後端「聊天」服務器(CServer)。當用戶請求從客戶端加入特定的聊天室時,客戶端將連接到LBServer,並且LBServer將回復一個特定的CServer的連接信息,該信息在內存中維護聊天室的一個實例。然後客戶端將從LBServer斷開並連接到CServer。只要用戶留在聊天室中,與CServer的連接就會持續。 CServer負責更新後臺數據庫,以記錄聊天室狀態,並通知聊天室中連接到自己的其他客戶端更新。

您可以想象一個聊天室中是否存在太多用戶(因此一個CServer必須與所有這些用戶保持持續連接),如果房間中的活動增加超過CServer的閾值,「熱點」方案將會展開處理速度跟上所有更新。

在這一點上,我想出了一個天真的解決方案,以便我的系統仍然可以擴展。我可以加載一個較大的CServer實例,複製聊天室的狀態,並請求「熱」CServer中的所有用戶重新連接到新的較大實例。我不認爲這是處理這種系統可擴展性的正確方法。

我有幾個問題:

鑑於我想聊天的實時性,有沒有設計我的後端系統,以避免必須堅持到一個服務器實例連接的更合適的方法?

當我正在跟蹤數據庫中的狀態時,我是否甚至需要打擾隔離每個聊天室的處理以發生在一個CServer上?我想留下空間讓用戶能夠同時參加多個聊天室。如果我們使用當前的模型,客戶端將不得不保持與我的雲的多個連接(每個用戶所在的聊天室都有一個連接)。這很糟糕的客戶端。作爲一項修訂,我設想客戶端保持與'通用'CServers的連接,該服務器將監聽用戶當前正在訪問的聊天室中的更改並相應地更新它們。

所有的反饋和意見都會非常感謝,並且我會很樂意詳細說明任何不清楚的事情。謝謝。

+0

什麼是你想要的廣播和接收之間實現延遲?爲什麼沒有現成的東西呢? – Ron 2011-06-04 00:25:52

回答

4

我覺得有幾個設計考慮點擊這裏:

  1. 考慮讓每個聊天室顯示爲DNS子條目。例如,chatroom1.chatservice.com。這樣,您可以在服務器之間進行負載平衡並保持粘性。

  2. 聊天服務器可以通過多播相互通信,並且可以將消息的發送者與接收者分開以提供規模。

  3. 您不需要維護一個持久連接,而是通信流需要包含一個可以處理路由任務的令牌。

詹姆斯·麥戈文 HP

4

你可能想看看IRC http://en.wikipedia.org/wiki/Internet_Relay_Chat怎麼做簡單的多播。 IRC顯然有一些可擴展性問題和設計問題,但通常仍然工作得非常好。 IRC協議的一些問題是:1)網絡對服務器樹有相當的信任; 2)網絡狀態的變化需要客戶端的分裂/連接。對於RFC和其他技術,請參閱:http://www.irc.org/techie.html

這種比較http://en.wikipedia.org/wiki/Comparison_of_instant_messaging_protocols還包括PSYC(協議的同步會議 - 我從來沒有聽說過這件事),就是假定有固定的一些與IRC協議的問題:http://about.psyc.eu/Introduction

也有XMPP http://fi.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol,但不會進行多播,並且可能更適合MSN/Google Talk類型的一對一聊天,儘管FB聊天(使用Erlang編寫)除了使用Google Talk之外還使用它。

並談到Erlang http://en.wikipedia.org/wiki/Erlang_(programming_language) - 它遵循Actor模型http://en.wikipedia.org/wiki/Actor_model的併發性,它具有分佈性和可伸縮性。 Scala,Common Lisp,Python和Haskell等其他語言也支持Actor模型,無論是本地還是通過庫。

PS。我不自稱是設計一個聊天協議的專家,只是碰巧知道兩件事有關網絡協議和最近做的併發編程技術的一些愛好研究...

0

我覺得你可以利用一些MOM主題和訂戶模型。

  1. 您可以創建除聊天室外什麼也沒有的話題庫隊列。

  2. 用戶都不過是參保者。 RabitMQ/ActiveMQ將會有幫助。

  3. 您還可以使用反向AJAX或服務器推與DWR的幫助。

  4. 可以緩存或在類似CSQL/SQLite的,以提高性能的內存數據庫。

  5. 你可以把用戶和他們的DATABSE聊天室中的映射。