我们正在使用nodejs firebase sdk在片状互联网连接上推送对IoT板上数据集的本地更新。连接损失很多。
现在推送UpdateA,然后将UpdateB推送到firebase(使用set()操作)。由于数据包丢失,UpdateA无法将其发送到Firebase服务器,但UpdateB可以实现。
在这种情况下会发生什么? firebase是否会提交UpdateB并中继到所有连接的客户端,然后当它获得UpdateA时,它会为它做同样的事情吗?或者Firebase服务器是否确保所有写入的提交顺序与本地服务器上的顺序相同,并以相同的顺序进行中继?
注意:UpdateA和UpdateB发生在同一台服务器上
以下是更具体的内容:
我在物联网设备上的nodejs服务中使用Firebase js sdk。该设备具有片状互联网连接,可以在没有警告的情况下关闭电源。将部署数以千计的这些设备,并且它们必须在它们之间同步某些数据集(用户数字钱包)。由于这种情况,我正在使用mongodb实现本地脱机持久缓存。钱包的所有更新首先保留在数据库中,然后将它们推送到firebase。现在,我按照更新顺序将所有更新按顺序推送到firebase。由于将触发set操作的回调,我将记下上次成功完全写入操作的更新时间戳。现在,如果设备关闭并在某个时间后打开,我可以继续从更新的时间将本地更新推送到firebase。
但是,这个逻辑只有在firebase保证我执行写操作的顺序与它们将被提交到firebase服务器的顺序相同时才有效,即按照相同的顺序,也会触发set操作的回调。
答案 0 :(得分:4)
Firebase工程师
请参阅event guarantees:
来自单个客户端的写入将始终写入服务器并按顺序广播给其他用户。
如果您使用Firebase SDK并且与Firebase服务器的连接丢失,SDK将保留其仍需要发送的本地写入操作队列。恢复与服务器的连接后,Firebase客户端将以正确的顺序发送挂起的写入操作。
因此,在您的情况下,UpdateA将在该队列中并在连接恢复时发送到服务器。
但是如果您在写入数据之间存在依赖关系,请考虑使用事务。这样,您的set()
操作可以用&#34来指定;给定属性Y的值X,将其设置为值Z"。