保存到 3 个网速较慢的 firebase 位置

Save to 3 firebase locations with a slow internet connection

有时,当用户的移动连接速度较慢时,我会遇到 Firebase 问题。当用户将条目保存到 firebase 时,我实际上必须写入 3 个不同的位置。有时,第一个有效,但如果连接速度慢,第二个和第三个可能会失败。

这让我在第一个位置留下了我经常需要清理的条目。

有没有办法帮助防止这种情况发生?

            var newTikiID = ref.child("tikis").push(tiki, function(error){

                if(!error){

                    console.log("new tiki created")

                    var tikiID = newTikiID.key()

                    saveToUser(tikiID)
                    saveToGeoFire(tikiID, tiki.tikiAddress)

                } else {

                    console.log("an error occurred during tiki save")

                }

            });

没有一次写入多个路径的 Firebase 方法。团队计划的一些未来工具(例如触发器)可能会在未来解决这个问题。

这个主题之前已经探讨过,firebase-multi-write README 包含很多关于这个主题的讨论。该存储库还对仅客户端原子写入提供了部分解决方案。但是,没有服务器进程就没有完美的解决方案。

评估您的用例并查看这是否真的很重要,这一点很重要。如果第二次和第三次写入未能写入地理查询,很可能真的没有任何后果。最有可能的是,这与第一次写入失败或所有写入都失败基本相同;它不会出现在按地理位置进行的搜索中。因此,解决这个问题的复杂性可能是一个时间槽。

当然,它确实花费了几个字节的存储空间。如果我们正在处理数百万条记录,那可能很重要。这种情况的一个简单解决方案是 运行 和审计报告,检测数据和 geofire 表之间断开的链接并清理旧数据。

如果确实需要原子操作,例如公平或作弊可能成为问题的游戏机制,或者因部分结果而失去完整性的地方,有几个选项:

1) 主记录方法

选择一个主路径(必须存在的那个)并使用安全规则来确保其他记录不能被写入,除非主路径存在。

".write": "root.child('maste_path').child(newData.child('master_record_id')).exists()"

2) 服务器端脚本方式

不用单独写路径,use a queue strategy

  1. 通过将单个事件写入队列来创建单个事件
  2. 让服务器端进程监视队列和处理事件
  3. 服务器端进程执行多次写入并确保它们 全部成功
  4. 如果任何失败,服务器端进程处理 回滚或重试

通过使用服务器端队列,您可以消除客户端在两次写入之间脱机的风险。使用队列模型时,服务器可以安全地重启并重试事件或失败。

我遇到了同样的问题,我最终选择将条件条件请求与 Firebase REST API 结合使用,以便以事务方式写入数据。看我的问答。

如果您需要同时(但不是事务性地)写入多个路径,您现在可以这样做,因为 Firebase 支持多路径更新https://firebase.google.com/docs/database/rest/save-data https://firebase.googleblog.com/2015/09/introducing-multi-location-updates-and_86.html