【问题标题】:Offline Firebase离线 Firebase
【发布时间】:2014-11-17 08:40:53
【问题描述】:

我正在实现一个以 Firebase 作为后端的 AngularJS 网络应用程序;它也应该离线工作;多用户同步问题应该非常有限,因为根据设计,该应用仅在离线时允许 数据条目。

我了解 Firebase 具有离线功能,即客户端可以承受临时的网络连接故障:任何写入操作都将被延迟并缓存,直到网络再次启动。

我问是否存在任何可能性(或是否有计划实施)扩展 Firebase 离线功能,使客户端能够本地缓存服务器上(部分)数据的快照,从而能够为客户端提供完整的离线体验,也可以进行读取操作。

我看到third part Firebase wrapper 存在,但它的文档非常“有限”(善良... :-)。 native 解决方案应该是首选...

更新:在 Frank van Puffelen 发表评论后,我更好地限定了我的问题:

*Firebase 是否在其 Web API 中原生支持离线数据访问,还是会很快支持?*

【问题讨论】:

  • 您的问题是:Firebase 本身是否支持其 Web API 中的离线数据访问?因为如果是这样,答案是“不”。
  • 是的。更准确地说是:“Firebase 是否在其 Web API 中原生支持离线数据访问,还是很快就会支持?”
  • 在可预见的未来,离线持久化将同时在安卓和网页上发布。它在 iOS 上提供测试版。
  • 我们的意图非常明确:尽快推出离线持久化。它目前是我们的首要任务,并有望在明年的某个时间成为目标。我不能比这更具体,因为我们的内部路线图由大量政策和人员管理,邮件列表或此处的更多问题也不会更快地完成。
  • @Kato 你能在下面做出真正的回应吗?现在这个问题更像是 PouchDb 的广告。 :-)

标签: angularjs couchdb firebase offline-caching pouchdb


【解决方案1】:

为 JS 应用解决此问题的 Firebase 替代方案是 CouchDb (server) <=> PouchDb (JS client)。如果你已经为你的 AngularJS 应用程序实现了一个干净整洁的服务层,那么移植到 PouchDb 应该是相当简单的,因为它们都是 NoSQL/JSON 数据库。

PouchDb 是一个实现完全离线 CouchDb 客户端的Javascript API。它可以自动检测并使用_local storage__IndexDb__WebSQL_ 在在线或离线时永久保存本地数据。 PouchDb API 可用于访问本地或远程数据库(只需更改 URL)并在两者之间连接完全同步或过滤同步。有许多有用的 PouchDb 插件、代码示例和一个小型包装库来支持 AngularJS 的 Q Promise API。

使用 PouchDb,您可以在离线时安全地启动您的应用,然后在几天后重新启动您的应用并将所有 CUD 数据更改同步到服务器。这可能会导致更新冲突,因此 CouchDb 支持旨在检测和跟踪这种情况的记录版本控制。因此,您可能需要服务器端逻辑来解决这些冲突。这对于具有离线同步和 CouchDb 的一个关键特性的分布式系统来说是不可避免的(不太正确……参见 cmets)

PouchDb 基本上是 Apache CouchDb 的重新实现,包括它的高效同步协议。 CouchDb 和 PouchDb 都经过良好测试,免费且开源。开源意味着 CouchDb 服务器也可以部署为 Intranet 服务 - 可选择同步到外部云服务。有许多 CouchDb 托管服务提供商。

Cloudant 托管团队最近将他们的 BigCouch 集群功能添加到 Apache CouchDb 2.0 项目中,因此现在您可以从 Micro Db (PouchDb) => 单服务器 => 多主(复制)=> Big Couch 集群/地理集群进行扩展。与 MongoDb 不同,CouchDb 安全地支持单服务器部署。

注意:PouchDb 也可以使用相同的协议同步到 CouchBase,但 Couchbase !== CouchDb。这是一个商业产品。

链接:

CouchDb 主机:

自己动手

Docker + CouchDb:

插件的卡车负载

PouchDb 有许多扩展点和不断增长的列表插件(最后计数 37 个):

安全模型

迁移到 CouchDb 时需要考虑的一个问题是它的访问控制模型更加有限。这部分是由于它的复制算法。这篇博文详细介绍了这一点(比真正的权威指南更好)。

【讨论】:

  • 我说“因此,您可能需要服务器端逻辑来解决这些冲突。这对于具有离线同步和 CouchDb 关键特性的分布式系统来说是不可避免的。” ...不太正确您可以创建记录更改的“增量”文档,从而避免更新和随后的冲突。 Delta 文档就像一个审计线索。要折叠更改文档,您可以添加索引地图/减少视图。 Couch 视图通过应用自上次读取以来的新更改来增量更新,因此非常有效。您还可以创建多个审核视图(例如不同的摘要级别)。
【解决方案2】:

根据 Firebase 文档,确实如此:https://www.firebase.com/docs/web/guide/offline-capabilities.html

来自网站: Firebase 提供了一些简单的原语,允许在客户端与 Firebase 服务器断开连接时写入数据。无论客户端是否完全断开连接,这些更新都会发生,因此即使连接断开或客户端崩溃,我们也可以依靠它们来清理数据。所有 Firebase 写入操作,包括设置、更新和删除,都可以在断开连接时执行。

我是不是对问题的解释有误?

我几乎删除了我的帖子,但是当我点击 OP 给出的链接时,我看到第三方包的功能与 Firebase 本身的功能完全相同,可能是在 Firebase 改进同步之前完成的?

当我删除帖子时,我认为 OP 可能只想要一组选择性数据,而不是 FB 在本地存储的“活动数据”,直到连接恢复

【讨论】:

  • OP,在这里... :-) 我的问题还不够清楚... 重点是:FB 是否(或将)离线提供 real能力? IE。能够在离线时启动连接,而不仅仅是在连接建立时承受网络故障,并且数据已经在客户端上。为此,它需要某种客户端缓存(appcache?)。我谈到了“部分”数据,因为任何浏览器的缓存大小都会受到限制......我听说一些谣言 FB 将实施类似的东西,所以我想对实施和预期的“上市时间”有所期待...... :-)
  • 我也是这么想的。得知它无法缓存数据以供离线使用时感到非常失望。为了他们的利益,我们可以说我们如何定义什么应该是“初始数据”。但令人费解的问题是,当我们在离线状态下发起 FB 会话时会发生什么,应用程序(比如 AngularFire)会允许我们添加记录还是会收到一条恐龙(离线消息)? Marco,您可能想查看 appery.io,他们声称他们生成的应用程序可以做到这一点,尽管不是“很大程度上”。不知道它们是什么意思;他们说如果太复杂,您可以编写自己的 js 代码进行同步。
  • 感谢您将我指向 appery.io,但使用它意味着从头开始重新启动我的应用程序,这不是一个选项,对我来说...... :-) 离线使用不是对我的迫切要求......我最好考虑从 Firebase 交换到自定义数据库解决方案(可部署到客户的局域网/设备)。但是,感谢 ti Kato 的期待,我将等待 Firebase 人员发布离线 Web 功能... :-)。 P.S.:对不起,我不接受这个答案,这对我来说不是解决方案......
  • 那个离线功能页面给我的印象是它在本地缓存数据。它不是。数据仅存在于 RAM 中,应用程序的任何刷新或重新启动都会导致数据不存在。我相信 onDisconnect 会在服务器上存储一些 javascript 以在客户端离开时执行,显然当您离线时无法将数据发送到服务器。 Firebase 故意回避并在这个问题上使用双关语,这让我感觉很糟糕。
  • 关键词是“...即使您的应用暂时失去其网络连接”。换句话说,您必须在线执行 FB 身份验证,然后他们才能处理临时退出。是的,恕我直言,他们对此不是很清楚。这可能会在未来发生变化,但目前不会。
猜你喜欢
  • 1970-01-01
  • 2018-06-23
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多