离线应用程序的双向同步(Windows、筛选、嵌入式数据库)



我们正在开发一个应用程序,该应用程序具有本地安装的组件(windows服务+UI,与本地硬件交互),该组件将其数据与基于Azure云的应用程序同步(集中数据,提供报告等)。本地组件必须能够离线运行(在没有连接的远程站点上长达一周)。此外,一个站点可能有多台PC托管该应用程序,并且这些本地应用程序实例中的每一个都必须彼此保持同步,即使它们与云应用程序断开连接也是如此。

  • 我们预计每个企业有10到100个站点,每个站点最多安装10个本地应用程序
  • 我们主要是.NET/C#开发人员
  • 过滤应用于记录级别,主要用于允许通过有时有限的WAN连接配置新站点/机器,并减少在站点上持续传输和存储的数据量
  • 我们更倾向于使用Azure/SQL Azure/.NET

我一直在考虑各种选择,但似乎都达不到:

  • MS Sync Framework似乎已被放弃(我错了吗?不支持SQL Compact 4?)。此外,它似乎在过滤方面有一些限制,在监控和解决问题方面似乎相当不透明,并且在应用过滤时可能存在知识碎片问题
  • 非MS嵌入式关系数据库要么不提供同步机制,仅限于集线器和轮辐,要么一年内似乎没有更新(例如empress)
  • 没有SQL数据库(我承认我只看了大约20个,而且只是表面上看)似乎更专注于分发数据和查询负载,而不是在所有节点上实际复制数据。当LAN上的对等端与WAN断开连接时,我找不到任何允许它们同步的对等端

即使忽略了在与云断开连接时保持局域网上对等端同步的愿望,我也无法从.NET/Azure.中找到任何支持记录级过滤同步的嵌入式数据库

有人解决过类似的问题并找到了解决方案吗?在这种情况下,建立我们自己的解决方案有意义吗?

好吧,最后决定以不同的方式处理这个问题。基本上它相当于:

  • 通过保持尽可能多的操作仅在线,最大限度地减少我们需要同步的数据量
  • 在可能的情况下,只向一个方向传递数据(即在站点生成并传递到云,或在云中生成并发送到站点)
  • 对于我们需要数据来支持必要的离线功能并具有真正的双向同步的其余部分,请使用事件源模型,并在在线时在站点和云之间交换事件
  • 站点会立即将事件应用于其数据,并只保留尚未传递到云的事件的副本
  • 云应用程序将跟踪发送到每个站点的最后一个事件是什么,并从站点连接时开始。它根据接收到的顺序对所有事件进行排序
  • 云为它检测到的任何冲突生成解决事件(在任何情况下都应该是罕见的)

这不是我们最初的想法,也有其自身的挑战和缺点。但这似乎是前进的最佳选择。

最新更新