保持服务器和GUI之间的状态实时同步

时间:2013-02-10 17:47:21

标签: user-interface sync distributed-caching

我正在寻找一个可以帮助我“实时”保持服务器和GUI之间状态同步的库。我有消息和中间件排序(推送更新等),但我需要的是一个协议,它保证数据在一个合理有限的时间内保持同步 - 错误/丢弃的消息/异常可能导致数据离开syn几秒钟,但它应该重新同步或至少知道它在几秒钟内不同步。

这似乎应该是之前已经解决过的东西,但我似乎找不到合适的东西 - 任何帮助都非常感激

更多细节 - 我有一个富客户端(Silverlight,但很可能很快转向Javascript / C#或Java)由JMS类型中间件提供服务的GUI。 我希望重新设计一些数据交互,如下所示

每个用户对以下项目的几个相当小的数据集都有自己的视图:

  • 权利(要显示的GUI元素)
  • GUI数据(例如填写下拉菜单等)
  • 业务数据网格(例如订单网格)
  • 偏好设置(例如GUI的布局方式)

所有这些数据集都可以随时在服务器上更改,数据应该尽快在客户端上更新。 通过服务器更改数据 - 客户端要求更改(例如取消请求),服务器根据权利和业务规则对其进行验证,并更新其内部数据集,然后将更改发送回GUI。为了提供用户反馈,可以在gui(取消提交或类似)上设置临时状态,该状态由服务器响应覆盖。

目前工作流程为:

  • 用户身份验证
  • GUI从服务器下载初始数据集(从数据库或其缓存的其他业务对象加载它们)
  • GUI渲染
  • GUI下载业务数据的快照
  • GUI订阅业务数据的更新
  • 当GUI中的更新更新屏幕上的模型和视图时

我正在寻找一个可以改进此

的通用库
  • 使用有效的有效载荷格式(例如Java后端,C#前端,protobuf数据格式)应该是跨语言
  • 应该与传输无关(我们使用JMS样式的中间件,我们现在不想替换)
  • 当服务器端数据集发生更改时,应向客户端发送更新
  • 客户端和服务器应该能够检查更改以确保它们是最新的
  • 发送的数据应该是最小的(最小增量)
  • 客户端和服务器应该处理多个不同步的修订
  • 客户端应该能够在会话之间缓存到磁盘,然后才能在登录时获得增量。

我认为理想的解决方案可以像

那样使用
  • 任何对象(或对象树)都可以在库代码中注册(这应该适用于通过Hibernate加载的数据/对象)。
  • 当对象更改时,库通知使用更改delta
  • 的侦听器/回调
  • 侦听器使用我的JMS
  • 将该delta发送到客户端
  • 客户端获取更新并将其返回到库的客户端版本,该版本将更新对象的客户端版本
  • 客户端应该从更新中获取足够的信息,以便能够决定需要采取哪些UI操作(通知用户,更新网格等)
  • 客户端和服务器定期检查它们是否在同一版本的对象上(例如,服务器将版本号发送给客户端),并且必要时可以通过发送增量的服务器或必要时完全刷新来修复。

感谢您的任何建议

1 个答案:

答案 0 :(得分:0)

哇,这太多了!

我有一个项目正在处理前端Javascipt中的同步方面。在Node.JS中写了一个测试服务器(一旦客户端被解决,它实际上很容易)。

基本上,数据按键存储在数据集中,并且每个单独的键都是版本化的。服务器具有所有数据的所有版本,客户端可以从服务器提供更改。在客户端和服务器上修改某些内容时的版本冲突由冲突解决回调处理。

它并不完整,事实上它目前只有内存商店,但会在新的一周左右发生变化。

实际的通知/下载和上传超出了库的范围,但您可以使用Sockets.IO。

它目前适用于jQuery,Dojo和NodeJS,实际上它几乎没有任何依赖。

项目(带演示)位于https://github.com/forbesmyester/SyncIt