问题 离线Firebase


我正在使用Firebase作为后端实现AngularJS Web应用程序;它也应该脱机工作;多用户同步问题应该非常有限,因为app - by design - 只允许  离线时的数据条目。

我了解Firebase具有脱机功能,从某种意义上说,客户端可以承受临时网络连接故障:任何写入操作都将被延迟并缓存,直到网络再次出现。

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

我看到了 第三部分Firebase包装器 存在,但它的文档非常“有限”(善良...... :-)。一个 本地人 解决方案应该是首选......

UPDATE:Frank van Puffelen发表评论后,我更有资格证明我的问题:

* Firebase本身是否支持脱机数据 访问 在其Web API中,还是会很快?*


10545
2017-09-23 08:07


起源

您的问题也是如此:Firebase本身是否支持其Web API中的脱机数据访问?因为如果是这样,答案就是“不”。 - Frank van Puffelen
是。更准确地说:“Firebase本身是否支持其Web API中的离线数据访问,或者它很快就会支持?” - MarcoS
在可预见的未来,线下持久性将在Android和Web上发布。它在iOS上提供测试版。 - Kato
我们的意图非常明确:尽快推出离线持久性。它目前是我们的首要任务,并期望在明年的某个时间成为目标。我不能比这更具体,因为我们的内部路线图受到大量政策和人员的支配,邮件列表上的更多问题也不会更快地完成。 - Kato
@Kato你能在下面做出真实的回应吗?现在这个问题更像是PouchDb的广告。 :-) - Jon Tirsen


答案:


Firebase的替代方案可以解决JS应用程序的这个问题 CouchDb (server) <=> PouchDb (JS client)。如果你为AngularJS应用程序实现了一个漂亮的干净服务层,那么移植到PouchDb应该是相当直接的,因为两者都是 NoSQL/JSON 数据库。

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

使用PouchDb,您可以在离线时安全地启动应用程序,然后几天后重新启动应用程序并将所有CUD数据更改同步到服务器。这可能导致更新冲突,因此CouchDb支持用于检测和跟踪此操作的记录版本控制。因此,您可能需要服务器端逻辑来解决这些冲突。对于具有离线同步和CouchDb关键功能的分布式系统而言,这是不可避免的(不完全正确...请参阅注释)

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

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

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

链接:

CouchDb Hosters:

DIY

Docker + CouchDb:

卡车负载的插件

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

安全模型

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


11
2018-05-05 04:21



我说“因此,你可能需要服务器端逻辑来解决这些冲突。对于具有离线同步和CouchDb关键功能的分布式系统来说,这是不可避免的。” ...不太正确你可以创建记录变化的“delta”文档,从而避免更新和随后发生的冲突。 Delta文档就像审计线索一样。要折叠更改文档,请添加索引的地图/缩小视图。 Couch视图通过应用自上次读取后的新更改来逐步更新,因此它非常有效。您还可以在审核中创建多个视图(例如,不同的摘要级别)。 - Tony O'Hagan


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

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

我是否错误地解释了这个问题?

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

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


1
2017-09-23 16:45



OP,这里...... :-)我不够清楚,在我的问题中......重点是:FB(或将会)提供 真实 离线功能?即能够 发起 脱机时的连接,不仅可以在连接启动时承受网络故障,还可以在客户端上存在数据。为此,它需要某种客户端缓存(appcache?)。我谈到了'部分'数据,因为任何浏览器的缓存都会受到限制......我听到一些传闻FB会实现类似的东西,所以我想对实施有所期待,并期望“上市时间”...... :-) - MarcoS
我跳起了FB的潮流,想着同样的想法。很遗憾地得知它无法缓存数据以供离线使用。为了他们的利益,我们可以说我们如何定义应该是“初始数据”的内容。但令人费解的问题是,当我们在离线时启动FB会话时会发生什么,应用程序(比如AngularFire)会让我们添加记录还是会得到dino(离线消息)? Marco,你可能想看看appery.io,他们声称他们生成的应用程序可以做到这一点,尽管不是“很大程度上”。不知道他们的意思;如果它太复杂,他们会说你编写自己的js代码进行同步。 - killjoy
谢谢你把我指向了appery.io,但是用它就意味着要从头开始重新启动我的应用程序,这对我来说不是一个选择... :-)离线使用对我来说不是必须要求...我最好考虑从Firebase交换到自定义数据库解决方案(可部署到客户的局域网/设备)。但是,感谢ti Kato的期待,我将等待Firebase人员发布离线网络功能...... :-)。 P.S。:抱歉,我不接受这个答案,对我来说这不是解决方案...... - MarcoS
离线功能页面让我觉得它在本地缓存了数据。它不是。数据仅存在于RAM中,应用程序的任何刷新或重新启动都不会导致数据存在。我相信onDisconnect会在客户端离开时在服务器上存储一些javascript,显然当你离线时无法将数据发送到服务器。 Firebase故意回避并且在这个问题上使用双重说法让我感觉不好。 - MrYellow
关键词是“......即使您的应用程序丢失了网络连接 暂时“。换句话说,你必须在线进行FB身份验证,然后才能处理临时辍学问题。是的恕我直言,他们对此并不十分清楚。这可能会在未来发生变化,但目前不会发生变化。 - Tony O'Hagan