2010-11-16 57 views
2

我正在構建一個基於Web的生產力應用程序,該應用程序必須處理適度的用戶併發性,並且我一直在探索各種選項以保持服務器和服務器之間的數據同步客戶。應用程序數據在頁面加載時引導到JavaScript中,並且使用websockets將數據推送到服務器。使用AMQP和Node.JS實現實時數據同步

對於上下文,我目前使用Node.JS和Socket.IO創建一個持久的客戶端 - 服務器網關,它充當Django後端的代理。

難題在於我想讓所有連接的客戶端保持彼此同步,以便在一個客戶端會話上對應用程序進行的任何更改都立即反映在所有連接的客戶端會話中。難點在於並非所有用戶都必須查看所有數據;有各種不同的用戶級別,不同的用戶可以擁有稍微不同的數據集。因此,當一個對象以某種方式被改變並且改變被提交給數據庫時,我需要知道那些當前連接的用戶可以安全地將數據推送到數據庫。

我一直在探索不同的解決方案,我覺得這是可以通過pubsub消息隊列來處理的東西 - 使用類似AMQP的東西,但我正在努力弄清楚應用程序的結構。

在我的腦海中,應用程序的結構是這樣的:

Client < - >Node.JS gateway < - >AMQP messaging queue < - >Django app

我應該建立一個單一的直接交換,處理的Node.js和Django實例作爲單個客戶端,然後在Node.js中以某種方式過濾結果?

或者是這樣的過濾消息系統可以處理的事情,例如,每個連接的客戶端訂閱相關的主題,並且只接收他們被允許看到的數據?

我在使用郵件系統方面的經驗很少,所以我一直在努力讓自己在應用程序中扮演什麼樣的角色。任何建議將不勝感激。

回答

0

我認爲每個客戶端都可以更容易地訂閱到相關的隊列,並且只需要使用節點作爲啞網關。通常最好儘可能將安全性降到最低。另外,我認爲如果客戶端離線一段時間,它會使處理更容易,因爲您可以將其中的內容留在隊列中並稍後推回。

+0

這是我的直覺,但我正在努力研究AMQP如何過濾數據。我知道我可以設置話題交換並以這種方式發佈信息,但我不確定如何在包裝數據的細粒度權限系統中適應這種情況。 – 2010-12-07 12:31:44

+0

我打算接受這個答案,因爲總的原則是絕對正確的;我需要對我的具體用例做更多的研究,但是感謝把我推向了正確的軌道。 – 2010-12-14 09:53:00