2010-05-19 92 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