本地写入是不是以与生成的顺序相同的顺序提交到 firebase

Posted

技术标签:

【中文标题】本地写入是不是以与生成的顺序相同的顺序提交到 firebase【英文标题】:Are local writes committed to firebase in the same order as they were generated本地写入是否以与生成的顺序相同的顺序提交到 firebase 【发布时间】:2015-12-08 11:06:33 【问题描述】:

我们正在使用 nodejs firebase sdk 在不稳定的互联网连接上将本地更新推送到 IoT 板上的数据集。连接是损坏的,有很多数据包丢失。

现在假设 UpdateA 和 UpdateB 被推送到 firebase(使用 set() 操作)。由于数据包丢失,UpdateA 无法到达 Firebase 服务器,但 UpdateB 成功了。

在这种情况下会发生什么? firebase 会提交 UpdateB 并中继到所有连接的客户端,然后当它获得 UpdateA 时,它会为它做同样的事情吗?还是 Firebase 服务器会确保所有写入都按照它们在本地服务器上发生的顺序提交,并以相同的顺序中继它们?

注意:UpdateA 和 UpdateB 发生在同一台服务器上

这里有更多细节:

我在 IoT 设备上的 nodejs 服务中使用 Firebase js sdk。该设备的互联网连接不稳定,可以在没有警告的情况下关闭电源。将部署数以千计的此类设备,它们必须在它们之间同步某些数据集(用户数字钱包)。由于这种情况,我正在使用 mongodb 实现本地离线持久缓存。钱包的所有更新首先保存在数据库中,然后被推送到 firebase。现在,我将钱包的所有更新按更新顺序依次推送到 firebase。由于 set 操作的回调将触发,我将记下最后一次成功的完整写入操作的更新时间戳。现在,如果设备关闭并在一段时间后打开,我可以从更新时间继续将本地更新推送到 firebase。

但是,只有当 firebase 保证我执行写入操作的顺序与它们将提交到 firebase 服务器的顺序相同时,此逻辑才有效,即以相同的顺序触发 set 操作的回调。

【问题讨论】:

【参考方案1】:

Firebase 工程师在这里

见event guarantees:

来自单个客户端的写入将始终写入服务器并按顺序广播给其他用户。

如果您使用 Firebase SDK 并且与 Firebase 服务器的连接丢失,SDK 将保留一个本地写入操作队列,它仍然需要发送。当与服务器的连接恢复时,Firebase 客户端会以正确的顺序发送挂起的写入操作。

因此,在您的情况下,UpdateA 将在该队列中并在连接恢复时发送到服务器。

但是,如果您的写入数据之间存在依赖关系,请考虑使用事务。这样,您的set() 操作可以根据“给定属性 Y 的值 X,将其设置为值 Z”来指定。

【讨论】:

Firebase sdk 是否同步发送本地写入操作,即只有在 Firebase 服务器确认 UpdateA 后才会中继 UpdateB? Firebase 客户端(所有这些都假设您使用其中一个 Firebase SDK)保持与服务器的开放连接。所有请求都通过同一个连接。请注意,如果您指定更多内容(例如您的客户的外观以及您要完成的工作),那么回答问题会容易得多。解释 Firebase 内部结构也很有趣,但对于 *** 来说有点宽泛(而且可能离题)。 假设您使用的是官方 SDK,Writes from a single client will always be written to the server and broadcast out to other users in-order.。请参阅事件保证here。对于多个客户端,有并且不能有任何排序保证,因为这取决于它们到达服务器的顺序。

以上是关于本地写入是不是以与生成的顺序相同的顺序提交到 firebase的主要内容,如果未能解决你的问题,请参考以下文章

multiprocessing.Pool.map_async() 的结果是不是以与输入相同的顺序返回?

$.when 是不是以与数组中相同的顺序解析延迟数组?

以与文件相同的顺序加载图像

其他线程是不是总是以相同的顺序看到不同线程中对同一位置的两次轻松写入?

如何以与 iPhoto 相同的方式订购 ALAssetsGroup

在 Keras 中使用 `predict` 以与给定相同的顺序预测一维数组