【问题标题】:How to keep stateful web clients in sync, when multiple clients are looking at the same data?当多个客户端查看相同的数据时,如何使有状态的 Web 客户端保持同步?
【发布时间】:2011-02-21 06:45:21
【问题描述】:

在使用 GWT 创建的 RIA Web 客户端中,状态在 Web 客户端中维护,而服务器(几乎)是无状态的(这是保持网站可扩展性的首选技术)。

但是,如果多个用户在他们的浏览器中查看相同的数据并且一个用户更改了某些内容,这些内容将发送到服务器并存储在数据库中,那么其他用户的浏览器状态中仍然有旧数据。例如,显示了一棵树,其中一个用户从树中添加/删除了一个项目。

既然客户端中可能有很多状态,那么使客户端中的状态保持同步的最佳技术是什么?是否有任何 java 框架可以解决这个问题?

【问题讨论】:

标签: java gwt webclient stateful


【解决方案1】:

仅推送更改(增量),它适用,如果不适用,则完全重新同步客户端。这就是我们对远程客户端所做的事情(不仅是 GWT,还有 Eclipse RCP)。当更改很小且是本地的时,我们发送增量上下文,并且在全局更改时我们重新同步。这将需要设计一个复杂的差异协议,并且通常需要从头开始重新设计远程客户端协议。

【讨论】:

    【解决方案2】:

    目前我尝试过的最有前途的 HTTP Push (Comet) 库是 StreamHub Project

    StreamHub 是一个高度可扩展的 HTTP Comet 和 Reverse Ajax 服务器允许 您将实时数据推送到网络浏览器 无需任何插件或 安全政策的变化。它使用一个 称为彗星或反向的技术 Ajax 保持持久连接 打开浏览器。

    这可能是您希望让您的客户状态保持最新的方法。他们也有一个GWT adapter 项目。

    【讨论】:

    • StreamHub 是部分商业产品(免费基本版),他们的网站上没有定价,这总是给我一种不好的感觉,读起来很贵。
    【解决方案3】:

    在 GWT 中也可以使用 rocket-gwt 项目支持 Comet(该项目还提供了许多其他很酷的功能,如轻量级集合、拖放等)—— Comet 由 Remoting 提供包。

    【讨论】:

    • Comet 只是在客户端和服务器之间进行“实时”通信的技术,但无助于保持多个客户端同步。还是我错过了什么?
    • 如果服务器和客户端有一个“实时”视图,当服务器收到一个客户端更改的通知时,它可以立即将该更改发布给所有其他客户端。至于确切推送什么的技术,我可能会将增量更改推送到每个客户端,并且还有一个定期工作以确保所有内容都同步,例如每 10 分钟向每个客户端推送更完整的状态图片确定一切都还好。并确保您的服务器能够注意到两个客户端对对象所做的更改并对它们具有弹性,以防万一事情不同步。
    【解决方案4】:

    我的 flex 应用程序也面临同样的困境。

    似乎最好的处理方法是在服务器和客户端之间保持几秒钟的间隔,并强制轮询每个客户端的状态。

    我采用了以下方法,请注意,这并不能解决不同步的情况,它只是大大减少了可能发生的情况。

    我在服务器端,每个集合调用都有一个缓存。 我在客户端,每个应用程序实例都有一个相同集合的缓存。

    Instance one 将一些对象数组加载到网格中。 (与服务器建立一个集合初始状态)

    实例二加载并进行更改,将更改的数据提交到服务器,持久化数据库信息并重建服务器缓存。 (客户端缓存也维护其本地缓存,不需要再次调用服务器集合。)

    实例一不同步。 (将在下一个轮询间隔同步) 实例二是同步的,因为它是负责更改的应用程序。

    两个实例都会不时地轮询服务器,例如每隔 10 秒进行一次更改。 (如果服务器端缓存发生变化,它将在下一次间隔调用时将新信息带给所有客户端。)

    如果服务器端级别没有更改,则不会向已注册的客户端发送任何信息。 (这意味着服务器和客户端之间不交换任何信息,从而减少开销。)

    如果第三个客户端进来,它的状态是新鲜的,并且会执行必要的调用来构建它的当前缓存。

    有一个延迟,但它肯定有助于将更改传播给客户端。

    问题是客户端通过保持缓存状态消耗了一些额外的内存。

    我在每个屏幕的情况下执行此操作,一旦该屏幕不在视野范围内客户端缓存为空一旦再次调用该屏幕会创建本地缓存并启动计时器并开始轮询。

    希望对你有帮助,

    厄纳尼

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 2017-01-26
      • 1970-01-01
      • 2014-03-02
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多