android–Firestore当离线设备上线时会发生什么?

android–Firestore当离线设备上线时会发生什么?,第1张

概述我正在看firestore,但doc对于android上的持久性数据非常清楚.我的问题是关于设备重新上线时会发生的 *** 作.让我们想象一下,我的在线数据很少:MyCollection|-----------------------MyDocument(empty)如果我有两个设备与此模型同步但离线,两者都写入MyDocument,设备A创建了

我正在看firestore,但doc对于android上的持久性数据非常清楚.我的问题是关于设备重新上线时会发生的 *** 作.

让我们想象一下,我的在线数据很少:

MyCollection| ----------------------- Mydocument (empty)

如果我有两个设备与此模型同步但离线,
两者都写入Mydocument,设备A创建了值为A的字段ID,我的设备B也创建了一个值为B的fIEldID.

设备A首先在线返回,然后与Firestore同步,然后设备B返回在线,问题是字段ID已经存在并带有另一个值.

Firestore如何知道它是在后台自动完成的?是否有机会抓住裁员来解决问题?

解决方法:

在这种情况下,Firestore不会进行任何冲突解决.这意味着在完成整个流程之后,来自设备B的写入将是存储的.在数据库级别这是正确的,因为它无法知道您是否想要其他东西.

如果要阻止从设备B写入,则必须确保这一点.你可以做一些事情:

>在transaction中执行写入.
>使用security rules确保设备B被拒绝.
>使用不允许冲突更新的数据模型.

将写入放在事务中是两者中最简单的.但是,如果客户端脱机,它将失败,因为在这种情况下客户端无法检查并发更新.

或者,您可以使用安全规则,当客户端数据到达服务器时,这些规则在Firebase服务器上进行评估.如果您可以检测到设备B的写入无效/已过时,则可以拒绝它.

一个相当简单的情况是在每个写 *** 作中放置一个时间戳,然后拒绝新的时间戳在数据库中的时间戳之前的写入.这确保了如果进行了更改,则存储最后一个(而不是最后一个返回在线).

正如您所看到的,这两个问题都是解决问题的重要方法.这就是为什么我的第一个建议是找到一个完全防止冲突的数据模型.通过避免冲突写入,您可以防止必须解决冲突.这样做的一个很好的例子是不让客户端更新实际文档,而是让它们将更改存储为单独的数据,而不会覆盖任何内容.

MyCollection| ---- Mydocument (empty)| -------- Change from device A| -------- Change from clIEnt B

现在,所发生事件的整个跟踪存储在数据库中,每个客户端都可以使用此信息根据您拥有的任何业务规则构建实际文档.

这实际上是Nosql数据库中非常常见的方法,特别是在需要大量并发写入的项目中.通过防止冲突写入和使用仅附加数据模型,可扩展性得到极大改善.它也是许多(关系)数据库的“op log”文件背后使用的模型.通过保留所有 *** 作的日志,他们可以从一开始就重建数据库.

在许多情况下,您还会偶尔存储文档状态的快照,以便更快地确定当前文档.这可以由随机客户端完成,也可以由受信任的进程完成,例如在您控制的服务器或Cloud Functions for Firebase上.

总结

以上是内存溢出为你收集整理的android – Firestore当离线设备上线时会发生什么?全部内容,希望文章能够帮你解决android – Firestore当离线设备上线时会发生什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1104569.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存