gpt4 book ai didi

firebase - Firebase 是否保证使用 updateValues 或 setValue 的数据集在后端作为一个原子单元可用?

转载 作者:行者123 更新时间:2023-12-05 06:39:41 25 4
gpt4 key购买 nike

我们有一个使用 base64 编码内容将附件传输到后端的应用程序。后端然后在一些操作后将内容移动到存储。这样我们就可以享受世界一流的离线支持和同步,同时使用更便宜的存储来最终存储文件。

最初我们使用updateChildren 一次性设置内容。这工作得很好,但随后用户开始同时上传越来越多的文件,导致最终用户设备中的数据库静默卡住。

然后我们更改代码,使用 FirebaseDatabase.getInstance().getReference("/full/uri").setValue(base64stuff) 一个一个地写入文件,然后使用 updateChildren 仅设置元数据。

这允许看似无穷无尽的文件(前提是它被切碎到最大 9 兆 block ),但现在我们面临另一个问题。

我们的后端使用 Firebase 监听器在新内容可用后开始工作。触发器等待元数据,然后开始处理附件。似乎即使客户端设备在我们设置元数据之前写入文件,后端通常在文件内容可用之前接收到元数据。这迫使我们更改后端代码以停止处理并稍后再次检查附件 base64 数据是否可用。

这可行,但不够优雅并且会浪费 CPU 周期并增加延迟。

我没有在文档中找到任何关于 Firebase 是否保证后端接收数据的顺序的任何内容。似乎一次性编写的所有内容(使用 setValueupdateChildren)在后端都可以作为一个原子单元使用。

这是正确的吗?我可以将其视为 future 不会改变的事实吗?

我要解决这个问题的方法(如果上面的假设是正确的)是像这样在客户端中首先使用 updateChildren 编写元数据

"/uri/of/metadata/uid/attachments/attachment_uid1" = "per attachment metadata"
"/uri/of/metadata/uid/attachments/attachment_uid2" = "per attachment metadata"

然后每个 base64 block 使用具有以下有效负载的 updateChildren:

"/uri/of/metadata/uid/uploaded_attachments/attachment_uid2" = true
"/uri/of/base64/content/attachment_uid" = "base64content"

我不能对任何数据使用 setValue 来防止意外覆盖,具体取决于写入最终发生的顺序。

这将允许我收听 /uri/of/base64/content 并尝试在每次新附件完成加载时开始处理元数据包。唯一需要确定是否所有文件都已上传的是获取元数据并查看从/attachments/找到的所有附件 uid 是否也存在/uploaded_attachments/。

最佳答案

来自单个 Firebase 数据库客户端的写入按照它们在客户端上执行的相同顺序传送到服务器。它们还以相同的顺序广播给任何收听的客户端。

另一个客户端不可能在看不到写 A 的结果的情况下看到写 B 的结果(除非 A 被安全规则拒绝)

关于firebase - Firebase 是否保证使用 updateValues 或 setValue 的数据集在后端作为一个原子单元可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44200589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com