2010-05-19 91 views
6

在使用GWT創建的RIA Web客戶端中,狀態保留在Web客戶端中,而服務器幾乎是無狀態的(這是保持站點可伸縮性的首選技術)。但是,如果多個用戶在其瀏覽器中查看相同的數據,並且一個用戶更改了某些內容(將其發送到服務器並存儲在數據庫中),則其他用戶仍將舊數據保留在其瀏覽器狀態中。例如,顯示樹並且其中一個用戶從樹中添加/移除項目。當多個客戶端查看相同的數據時,如何保持有狀態的Web客戶端同步?

由於客戶端中可能有很多狀態,保持客戶端狀態同步的最佳技術是什麼?有沒有任何Java框架來處理這個問題?

+0

結賬這次演講,OT和閱讀了更多有關 - http://docs.google.com/present/view?id=dggjrx3s_1573xdhxprd – Anurag 2010-05-21 03:12:49

回答

1

僅推送更改(增量),適用,如果不更改 - 完全重新同步客戶端。這就是我們用我們的遠程客戶端(不僅是GWT,而且還有Eclipse RCP)。我們發送增量上下文時,變化是小而本地的,我們重新同步全球變化。這將需要設計一個複雜的差異協議,並且通常需要重新設計遠程客戶端協議。

0

最有前途的HTTP推送(彗星)庫我試過到目前爲止是StreamHub Project

StreamHub是一個高度可擴展HTTP Comet和反轉Ajax服務器允許 你實時數據推送到網絡瀏覽器 ,無需任何插件或 安全策略更改。它使用名爲Comet的 技術或者反向 Ajax來保持持久連接 對瀏覽器開放。

這可能是你在找什麼,讓你的客戶指出最新的。他們也有一個GWT adapter項目。

+0

StreamHub偏一個商業產品(免費的基本版本),他們沒有在他們的網站上定價,這總是給我一個不好的感覺,看起來很貴。 – 2010-05-19 22:08:11

0

使用rocket-gwt項目(其中還提供了一些其他很酷的功能,如輕量級收藏,拖放等),GWT中也支持Comet。彗星由Remoting包提供。

+0

彗星只是在客戶端和服務器之間進行「實時」通信的技術,但並不能幫助保持多個客戶端同步。或者我錯過了什麼? – 2010-05-19 22:13:41

+1

如果服務器和客戶端具有彼此的「實時」視圖,則當服務器收到一個客戶端更改的通知時,它可以立即將該更改發佈給所有其他客戶端。至於技術究竟推動什麼,我可能會增加更改推送給每個客戶端,並且還有一個週期性的工作,以確保一切都是同步的,就像每隔10分鐘一個更全面的狀態推送到每個客戶端確保一切都還好。 並確保您的服務器可以注意到並且能夠適應兩個客戶端對對象所做的更改,以防事情發生不同步。 – 2010-05-19 23:08:45

0

我在我的flex應用程序中遇到了同樣的困境。

看來解決這個問題的最好方法是在服務器和客戶端之間保持一段時間間隔,並強制輪詢每個客戶端的狀態。

我做了以下的方法,注意這並不能解決不同步的情況,它只是大大減少了可能出現的情況。

我在服務器端,每個集合調用一個緩存。 我在客戶端,每個應用程序實例,相同集合的一個緩存。

實例一將一些對象數組加載到網格中。 (與服務器建立收集初始狀態)

實例二加載並進行更改,將更改的數據提交給服務器,db信息被保留並重建服務器高速緩存。 (客戶端緩存也維護其本地緩存,不需要再次調用服務器集合。)

實例一不同步。 (將在下一輪詢間隔同步) 實例2由於是負責更改的應用程序而同步。

這兩個實例都會不時地輪詢服務器,例如更改間隔爲10秒。 (如果服務器端緩存遭遇的變化,它會帶來新的信息到所有客戶端上的一個區間通話。)

如果在服務器端的水平沒有變化,沒有信息被髮送到一個已註冊的客戶端。 (這意味着沒有信息是服務器和客戶端,減少開銷之間進行交換。)

如果有第三個客戶端進來,它的狀態是新鮮的,將執行必要的調用來構建其當前的緩存。

存在延遲,但它確實有助於將更改傳播到客戶端。

問題是客戶端通過保持緩存狀態來消耗一些額外的內存。

我在每屏這樣情況,一旦屏幕是拿出來看客戶端緩存零化一旦屏幕又被稱爲地方緩存被創建並且定時器開始並且輪詢開始。

希望幫助,

Ernani