离线 Firebase

11
我正在使用Firebase作为后端实现AngularJS Web应用程序;它也应该能够离线工作;多用户同步问题应该非常有限,因为该应用程序 - 根据设计 - 只允许在离线时进行数据输入。

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

我想知道是否存在任何可能性(或是否有计划实现)扩展Firebase离线功能,以使客户端本地缓存服务器上某些数据的快照,以便能够为客户端提供完整的脱机体验,并且也可用于读取操作。

我看到third part Firebase wrapper存在,但其文档相当“有限”(为了友好... :-)。应优先选择本地解决方案...

更新:在Frank van Puffelen的评论之后,我更好地澄清了我的问题:

*Firebase在其Web API中本地支持离线数据访问吗?或者它会在不久的将来支持?*


1
是的。更确切地说是:“Firebase在其Web API中本地支持离线数据访问,还是很快就会支持?” - MarcoS
1
在可预见的未来,离线持久性将在Android和Web上发布。它在iOS上的beta版本已经可用。 - Kato
@Kato:对于“web”,我可以理解为“AngularFire”吗?你能预测一下Web的缓存空间限制会是多少吗? - MarcoS
3
我们的意图非常清晰:尽快推出离线持久化功能。目前,这是我们的首要任务,计划于明年某个时候推出。由于我们内部路线图受到大量政策和人员的制约,我无法提供更具体的信息。在邮件列表或者这里提出更多问题也无法加速进度。 - Kato
1
@Kato,你能否在下面给出一个真正的回答?现在这个问题更像是PouchDb的广告。 :-) - Jon Tirsen
显示剩余2条评论
2个回答

11
一个解决 JavaScript 应用程序此问题的 Firebase 替代品是 CouchDb(服务器)<=> PouchDb(JS 客户端)。如果您为您的 AngularJS 应用程序实现了一个漂亮干净的服务层,那么将其移植到 PouchDb 应该是相当轻松的,因为两者都是 NoSQL/JSON 数据库。

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

使用PouchDb,您可以在离线状态下安全地启动应用程序,然后在几天后重新启动应用程序并将所有CUD数据更改与服务器同步。这可能会导致更新冲突,因此CouchDb支持记录版本控制,旨在检测和跟踪此类冲突。因此,您可能需要服务器端逻辑来解决这些冲突。这对于具有离线同步和CouchDb的分布式系统而言是不可避免的,并且是CouchDb的一个关键功能(不完全正确...请参见注释)
PouchDb基本上是Apache CouchDb的重新实现,包括其高效的同步协议。CouchDb和PouchDb都经过了良好的测试,是免费和开放源代码的。开源意味着可以将CouchDb服务器部署为Intranet服务-可选地同步到外部云服务。有许多CouchDb托管提供商。
Cloudant托管团队最近将其BigCouch集群功能添加到Apache CouchDb 2.0项目中,因此现在您可以从Micro Db(PouchDb)=>单个服务器=>多主(复制)=> Big Couch Clustered / Geo Clustered进行扩展。与MongoDb不同,CouchDb支持安全的单服务器部署。
注意:PouchDb也可以使用相同的协议将数据同步到CouchBase,但是Couchbase!= CouchDb。这是一种商业产品。

链接:

CouchDb主机:

DIY

Docker + CouchDb:

插件的大量装载

PouchDb有许多扩展点和不断增长的插件列表(上次统计有37个):

安全模型

当迁移到CouchDb时,您需要考虑的一个问题是它具有更有限的访问控制模型。这在一定程度上是由于其复制算法。这篇博客文章详细介绍了这一点(比真正的权威指南更好)。


我说:“因此,您可能需要服务器端逻辑来解决这些冲突。对于具有离线同步和CouchDb的关键特性的分布式系统,这是不可避免的。”...并不完全正确。您可以创建“增量”文档来记录更改,从而避免更新和随之而来的冲突。增量文档就像审计跟踪一样。要折叠更改文档,您需要添加一个索引映射/减少视图。Couch视图通过应用自上次读取以来的新更改来进行增量更新,因此非常高效。您还可以在审计上创建多个视图(例如,不同的摘要级别)。 - Tony O'Hagan

1
根据Firebase文档,它确实可以实现:https://www.firebase.com/docs/web/guide/offline-capabilities.html 从该网站上可以看到: Firebase提供了一些简单的基元,允许在客户端与Firebase服务器断开连接时写入数据。这些更新将发生在客户端干净地断开连接或不干净地断开连接时,因此即使连接中断或客户端崩溃,我们也可以依靠它们来清除数据。所有Firebase写操作(包括设置、更新和删除)都可以在断开连接时执行。
我是否错误地解释了问题?
我差点删除了我的帖子,但当我点击OP给出的链接时,我发现第三方包正好与Firebase本身所做的相同,也许是在Firebase改进同步之前完成的?
当我删除帖子时,我想OP可能只想要选择性的一组数据,而不是“活动数据”,这是FB本地存储直到恢复连接的数据。

OP,这里... :-) 我在我的问题中没有表达清楚... 关键是:FB是否会提供真正的离线功能?也就是说,在离线状态下能够发起连接,而不仅仅是在连接正常时承受网络故障,并且数据已经在客户端上。为此,它需要某种客户端缓存(appcache?)。我谈到了“部分”数据,因为任何浏览器的缓存大小都会有限制... 我听说FB将要实现类似的东西,所以我想提前了解一下实施和预期的“上市时间”... :-) - MarcoS
1
我曾经也跟风使用了FB,但很失望地发现它无法缓存离线数据。我们可以说这是为了他们的利益考虑,因为我们无法定义什么是“初始数据”。但令人困惑的问题是,当我们在离线状态下启动FB会话时,应用程序(比如AngularFire)是否允许我们添加记录,还是会显示离线消息?Marco,你可能想要查看appery.io,他们声称他们生成的应用程序可以做到这一点,尽管不是“大规模”的。我不知道他们的意思是什么;他们说如果太复杂,你可以编写自己的js代码进行同步。 - killjoy
谢谢你指引我使用appery.io,但是选择它意味着我需要从头开始重做我的应用程序,这对我来说不是一个选项... :-) 离线使用对我来说并不是必须的要求... 我最好考虑从Firebase切换到自定义数据库解决方案(可部署到客户的局域网/设备)。然而,感谢Kato的预见性,我将等待Firebase团队发布离线Web功能... :-).P.S.:抱歉,我不能接受这个答案,对我来说它没有解决问题... - MarcoS
3
那个离线功能页面让我以为它会在本地缓存数据,但实际上并不是这样。数据只存在于RAM中,任何刷新或重新启动应用程序都会导致没有数据存在。我认为onDisconnect会在服务器上存储一些javascript代码,以便在客户端离开时执行,显然当你离线时无法将数据发送到服务器。Firebase在这个问题上故意闪烁其词,使用模棱两可的措辞让我感到不满。 - MrYellow
关键词是“即使您的应用程序暂时失去网络连接”。换句话说,您必须在线执行FB身份验证,然后他们可以处理临时掉线。是的,在我看来,他们没有非常清楚地表达这一点。这可能会在将来发生变化,但目前不会。 - Tony O'Hagan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接