2012-06-02 55 views
1

我正在構建一個node.js應用程序。當用戶連接時,他們將其狀態作爲在線傳輸。當它們斷開連接時,狀態會切換到脫機狀態。另外,當用戶連接時,他會得到他的連接列表,以及這些朋友的狀態(在線或離線)。好的,很好,沒有問題。如何實現一個Node.js廣播給多個客戶端

但我遇到的麻煩是如何動態地向用戶發送的FREIND的狀態,而我參與的登錄所以,操作步驟如下所示:。

  1. 我登錄
  2. 我得到了我所有的朋友列表:用戶1,用戶2,用戶3
  3. 我得到狀態的列表中的所有用戶:用戶1:在線,用戶2:在線用戶3:下線
  4. USER1註銷
  5. 我如何動態獲取用戶1的狀態變化?

請記住,這些用戶沒有互相連接,並且還要記住,用戶的狀態需要傳送給所有其他用戶,並將他作爲好友。假設user1有100個朋友,我就是其中之一。我(與其他99一起)需要獲取user1現在處於脫機狀態的通知。還要注意,這些人可能不在同一臺物理服務器上(多臺服務器每臺都處理X個連接)。解決這個問題最好的理論方法是什麼?

我能想出的唯一答案是我將狀態保存在數據庫中,並且該節點將查詢數據庫,並且狀態更改時會更新。但是看起來很瘋狂,節點必須監視db的更改,這是無法擴展的。有一個更好的方法來做到這一點 - 也許是一個明顯的方式,我錯過了它。

+1

做一些關於「發佈/訂閱」的閱讀。 – ebohlman

回答

3

正如ebohlman在評論中暗示的那樣,發佈/訂閱模式(也稱爲「pub/sub」)聽起來適用於您的問題。在發佈/訂閱體系結構中,發佈者不是將發送消息發送到特定客戶端,而是將消息發送到某個中央發佈/訂閱服務器。訂閱者通知這個服務器他們感興趣的消息類型或「主題」。關鍵是發佈者和訂閱者從不知道甚至關心彼此,使得模式非常可擴展(可以有任何數量的發佈者或訂閱者)。

Publish/Subscribe Pattern

在你的情況,每個處理用戶登錄的服務器/註銷可能訂閱「login_changed」主題。每當用戶登錄或註銷時,處理更改的服務器都會向主題爲「login_changed」的發佈/訂閱服務器發送一條消息,並附帶一些數據以指示發生了什麼事情(例如,使用JSON編碼的字符串)。每個訂閱了「login_changed」主題的服務器都會收到該消息,並且每個服務器都可以確定是否負責跟蹤相關用戶。

有幾種管理pub/sub模式的常用工具。 Redis,一個共同的鍵值存儲,has support for pub/sub,是我的任務的個人最喜愛的工具。 AMQP是一個開放標準,包含多種消息傳遞相關行爲,包括pub/sub,並且有many implementations,其中最常見的可能是RabbitMQ。如果你有興趣通過HTTP連接網絡客戶端,你可能會對Faye感興趣。有關該主題的許多文獻以及許多語言的許多實現;谷歌搜索應該帶你遠去。

+0

這是一個很好的答案,非常清楚,非常翔實,並且有很大的幫助。非常感謝布蘭登。 –

相關問題