我正在开发基于Firebase实时数据库的messenger应用程序。我希望所有的消息都是根据时间戳排序的。
下面是这样的场景。
有三个客户。A、B和C。
1)
所有客户端都注册“图-1”侦听器以接收来自他人的消息。
<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)
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”
<figure-2>
text : "Message 1", timestamp : 100000001
text : "Message 2", timestamp : 100000002
text : "Message 3", timestamp : 100000003作为侦听器的代码,我将消息保存在存储中,并在下一个侦听时间戳中防止下载重复的消息。
在这种情况下。
Firebase总是保证按如下顺序触发回调吗?
Message 1
Message 2
Message 3如果不能保证,我的策略是绝对错误的。
例如,一些客户端收到的消息如下所示。
Message 3 // the highest timestamp.
// app crash or out of storage
Message 1
Message 2客户端不再有机会获得消息1,2。
我认为,如果已经有一些节点,则Firebase可能会触发这些节点。因为,这是“queryOrdered”功能的角色。
但是,在注册侦听器之前没有节点,然后再添加新节点。会发生什么?
我想Firebase可能会向客户端发送3个数据包。(无论消息到达多快,Firebase都必须在消息到达时立即发送出去。)
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是否保证按顺序发生事件?
我已经搜索过堆栈溢出和谷歌,并多次阅读官方文件。然而,我找不到明确的答案。
为此我几乎花了一周的时间。请给我一点建议。
发布于 2018-11-13 14:19:48
查询的数据返回顺序是一致的,并由服务器确定。因此,所有客户都保证以相同的顺序得到结果。
对于在附加侦听器之后发送到数据库的新数据,所有远程客户端都将以相同的顺序接收该数据。不过,本地客户端将在数据甚至到达数据库服务器之前立即看到其写操作的事件。
在图2中,它实际上非常简单:因为每个节点都有一个唯一的时间戳,它们将按照时间戳的顺序返回。但是,即使它们具有相同的时间戳,它们也将按照相同的顺序返回(先使用时间戳,然后是键)。
https://stackoverflow.com/questions/53280940
复制相似问题