离线/在线数据同步设计(Javascript)[关闭]

Posted

技术标签:

【中文标题】离线/在线数据同步设计(Javascript)[关闭]【英文标题】:Offline / Online Data Synchronization Design (Javascript) [closed] 【发布时间】:2011-03-18 03:41:23 【问题描述】:

我目前正在编写一个离线 web 应用程序,使用所有 html5 好东西来提供离线支持。但是,我现在开始考虑编写同步模块,以确保将任何离线数据发送到服务器并将服务器数据发送回客户端。现在我确信这已经完成了,我的意思是它是一个非常经典的设计问题,会影响移动设备和许多其他事情。所以我想知道有人能指点我一些好的设计资源吗?

现在我真的不需要太复杂了,我的意思是我不处理访问相同数据的多个用户,我很高兴不合并冲突(只取最新的)但我仍然想要一个让我在未来有这些选择的设计。

另外,是否有任何开源项目实现了这种类型的东西?我不会抄袭别人的代码(如果许可允许的话),我很乐意移植。

【问题讨论】:

【参考方案1】:

我个人建议您在 indexedDB API 之上编写一个包装器,以检查您是否在线/离线。

如果离线,只需存储在 indexedDB 中并将所有文档的持久化标志设置为 false 如果在线,获取所有持久化为 false 的文档,并将它们存储在 mongodb 或后端的等价物中,然后将新文档存储在 indexedDB 和服务器上,并将持久化标志设置为 true。

I've written a small one

您必须增加隧道以自动设置持久化标志,并将这些文档的同步通过隧道传输到后端

【讨论】:

【参考方案2】:

DerbyJS 可能是最好的解决方案。然而,Derby 仍在开发中,离线支持仅在规划中,尚未实施。在 Google 群组 (http://groups.google.com/group/derbyjs/browse_thread/thread/7e7f4d6d005c219c) 中,您可以找到有关未来计划的更多信息。

【讨论】:

【参考方案3】:

查看 Derby,这是一个 Node MVC 框架,它具有一些非常好的同步和冲突解决功能。 http://derbyjs.com/

【讨论】:

Derby 使用 RacerJS 进行数据同步,因此您不必必须使用完整的 Derby 框架。根据他们自己的说法,RacerJS 仍处于 alpha 阶段。 RacerJS 似乎不再积极开发。最后一次发布是在 2017 年 7 月,那是次要版本。【参考方案4】:

如果您准备使用可能很重的 Ext JS / Sencha 框架,它有一个很好的数据 API,支持离线(例如 localStorage)和一个代理方法,用于写入本地然后服务器。我使用 Sencha Touch(特定于移动设备)。

要调试网络存储,请查看 Weinre。

【讨论】:

【参考方案5】:

我目前正在开发类似的 webapp。我决定制作这样的工作流程:

    表单并未真正提交 - “提交”按钮实际上将序列化的表单数据保存到 localStorage(在某个队列中)。这样可以避免提交捕获的麻烦,也可以避免编写额外的错误处理代码来处理表单提交期间的断开连接。 数据保存后触发传输脚本。它检查在线/离线状态。 在线时,它会尝试将最新数据从队列发送到服务器(AJAX 请求),并在成功时将其从队列中删除(并在短暂超时后继续从队列中发送下一个数据)。 它会在一段时间后重新检查(通过 setTimeout())。

【讨论】:

【参考方案6】:

在我们的团队中,我们已经开发了离线/在线模式的应用程序。

我们正在使用以下库:

rack-offline jquery backbonejs backbonejs-localStorage backbonejs-queues jammit

使用 rack-offline 我们缓存所有资源文件和 jst 模板以在页面上呈现内容。骨干js和骨干js-localStorage有助于在客户端制作MVC应用程序。它非常棒,你应该试试。我们总是使用本地存储来保存数据。当我们为模型对象创建帖子并保存到本地存储时,我们正在触发同步队列(我们也有计时器后台工作人员用于自动运行同步过程)。对于每个模型,我们都有单独的同步类,应该由队列同步触发器运行。如果您的 navigator.onLine => true 我们正在向服务器发送请求,其中包含要更新的数据。如果您关闭浏览器,无论如何您都不会丢失数据,因为您在 localStorage 中有队列。下次客户端将在第一次加载时使用 navigator.onLine => true 同步数据。

rack-offline使用方法可以在github查看我的小项目:

pomodoro-app

祝你好运!

【讨论】:

【参考方案7】:

我的类似设计计划(尚未尝试)是使用PouchDB 之类的东西在本地存储数据,然后将其与远程沙发实例同步。

【讨论】:

嘿!你成功了吗?我想听听你的经验。【参考方案8】:

我遇到了同样的问题,最终使用 XML 文件进行存储,并使用 git 来跟踪更改并在连接可用时自动提交它们。同步是通过 shell 脚本中的常用 git commit / push / pull 命令和启动脚本的 cronjob 完成的。如果您将 JSON 存储在文本文件中,这也将起作用。

【讨论】:

【参考方案9】:

我遇到了类似的问题。我决定使用纯 JSON 进出方法。我在提交表单时采取的解决方案是:

    捕捉表单提交事件 检查用户是否在线 如果用户在线然后将表单作为普通表单 POST 提交 如果用户离线然后将 JSON 请求字符串化并将其存储在本地(我决定使用 Web SQL 数据库)。队列表就是简单的 Uri 和 Payload。

然后我有在线/离线事件的全局事件挂钩。当用户重新上线时,它会检查队列,如果队列中有项目,则将它们作为 JSON POST 请求发送。

如果您主要对获取 JSON 数据并将其缓存以供离线使用感兴趣,请查看jquery.offline。

双向同步的挑战是您需要使用已排队的任何 CRUD 工作更新本地缓存列表。

我想找到一种更通用的方法来做到这一点。

【讨论】:

我已经实现了这种方法,但在其中遇到了这个问题 如果您有一个网站,那么用户可以在多个标签中打开该网站,用户可以选择在他想要的多少个标签中打开网站。我正在使用唯一标识符,我正在使用 javascript 为每条记录生成一个唯一键,并且在将记录放入数据库之前检查该键,但它不起作用,因为每个选项卡都有相同的数据并且订阅了在线和离线事件所以所有请求都是并行发送的,这意味着每个选项卡每次都发送相同的请求,因此每个选项卡都会发送一个相同的请求。

以上是关于离线/在线数据同步设计(Javascript)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

离线/在线数据同步策略

推荐一款 在线+离线数据 同步框架 Dotmim.Sync

谷歌浏览器离线在线同步所有数据以及跨浏览器同步数据

Redis技术探索「数据迁移实战」手把手教你如何实现在线+离线模式进行迁移Redis数据实战指南(在线同步数据)

Redis技术探索「数据迁移实战」手把手教你如何实现在线+离线模式进行迁移Redis数据实战指南(在线同步数据)

Redis技术探索「数据迁移实战」手把手教你如何实现在线 + 离线模式进行迁移Redis数据实战指南(离线同步数据)