首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Firebase总是按照顺序保证添加的事件吗?

Firebase总是按照顺序保证添加的事件吗?
EN

Stack Overflow用户
提问于 2018-11-13 12:23:30
回答 1查看 402关注 0票数 1

我正在开发基于Firebase实时数据库的messenger应用程序。我希望所有的消息都是根据时间戳排序的。

下面是这样的场景。

有三个客户。A、B和C。

1)

所有客户端都注册“图-1”侦听器以接收来自他人的消息。

代码语言:javascript
复制
<figure-1>

ref.queryOrdered(byChild: "timestamp").queryStarting(atValue: startTime).observe(.childAdded, with:
{
    ....
    // do work for the messages, print, save to storage, etc.
    ....

    // save startTime to storage for next open.     
    startTime = max(timeOfSnapshot, startTime)
    saveToStorage(startTime)
}

2)

代码语言:javascript
复制
Client A write  message 1 to server with ServerValue.timestamp().
Client B write  message 2 to server with ServerValue.timestamp().
Client C write  message 3 to server with ServerValue.timestamp().

他们在同一时刻发送了信息。

所有客户都有速度快的无线网络。

所以,终于。保存的服务器数据,如“图2”

代码语言:javascript
复制
<figure-2>

text : "Message 1",  timestamp : 100000001
text : "Message 2",  timestamp : 100000002
text : "Message 3",  timestamp : 100000003

作为侦听器的代码,我将消息保存在存储中,并在下一个侦听时间戳中防止下载重复的消息。

在这种情况下。

Firebase总是保证按如下顺序触发回调吗?

代码语言:javascript
复制
Message 1
Message 2
Message 3

如果不能保证,我的策略是绝对错误的。

例如,一些客户端收到的消息如下所示。

代码语言:javascript
复制
Message 3  // the highest timestamp.

// app crash or out of storage

Message 1
Message 2

客户端不再有机会获得消息1,2。

我认为,如果已经有一些节点,则Firebase可能会触发这些节点。因为,这是“queryOrdered”功能的角色。

但是,在注册侦听器之前没有节点,然后再添加新节点。会发生什么?

我想Firebase可能会向客户端发送3个数据包。(无论消息到达多快,Firebase都必须在消息到达时立即发送出去。)

代码语言:javascript
复制
Packet1 for message1
Packet2 for message2
Packet3 for message3

ClientA fail to receive for packet 1,2 
ClientA success to receive for packet 3
Firebase re-send packet 1,2 again. 
ClientA success to receive for packet 1,2 

最终,所有数据都是一致的。但是秩序被破坏了。

Firebase是否保证按顺序发生事件?

我已经搜索过堆栈溢出和谷歌,并多次阅读官方文件。然而,我找不到明确的答案。

为此我几乎花了一周的时间。请给我一点建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-13 14:19:48

查询的数据返回顺序是一致的,并由服务器确定。因此,所有客户都保证以相同的顺序得到结果。

对于在附加侦听器之后发送到数据库的新数据,所有远程客户端都将以相同的顺序接收该数据。不过,本地客户端将在数据甚至到达数据库服务器之前立即看到其写操作的事件。

在图2中,它实际上非常简单:因为每个节点都有一个唯一的时间戳,它们将按照时间戳的顺序返回。但是,即使它们具有相同的时间戳,它们也将按照相同的顺序返回(先使用时间戳,然后是键)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53280940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档