Firebase 推送键的时间顺序不正确

问题描述 投票:0回答:1

雅各布·温格

Firebase 推送 ID 100% 保证按时间顺序排序 (如果不这样做,那就是一个错误)

我刚刚遇到了这个错误。仅供参考,这是我第一次看到这种情况发生。每次数据库中出现新消息时,我的侦听器都会侦听最后/最近的消息,然后将其显示给两个用户。这使车队保持活力。但是,如下所述,-NgWdYah0llBo4rryDd3(msg_1) 和 -NgaAh8_4jwiS2SR2JJq(msg_2) 被卡在底部,并且每条新消息都会出现在它们之前,因此用户永远不会看到他们键入的任何消息,除非他们关闭活动并返回。

我使用以下内容来创建我的推送密钥 ID

val messageId = Firebase.database.reference.child("messages").push().key.toString()

val map = mutableMapOf<String, Any>()
map["timeStamp"] = System.currentTimeMillis()
map["message"] = "msg_xxx"

val messagesRef = "/messages/$messageId"
// ... other refs

val rootDbRef = Firebase.database.reference // The reason I'm using this is because this is an Atomic update with other refs
rootDbRef.updateChildren(map)

发布消息时,msg_1 和 msg_2 的顺序不正确。我先发送它们,但它们却像最后发送一样沉到了底部。我在这两条消息之后发送的每条消息都在它们之前发布,而其他所有消息都应该在它们之后发布。

// all of the timeStamps are the real actual timeStamps

(posted 1st)
-Nga9itauQTt6UiPu8Tc
 message: "msg_1"
 timeStamp: 1697075800547

(posted 2nd)
-NgaAh8_4jwiS2SR2JJq
 message: "msg_2"
 timeStamp: 1697076054763

// ...

(posted 9th)
-NgWdYah0llBo4rryDd3
 message: "msg_9"
 timeStamp: 1697076620975

(posted 10th)
-NgWe5beMpBEyx24eeqQ
 message: "msg_10"
 timeStamp: 1697076768177

在数据库中,顺序错误地显示为:

实际顺序应该是:

-Nga9itauQTt6UiPu8Tc
-NgaAh8_4jwiS2SR2JJq
-NgWdYah0llBo4rryDd3
-NgWe5beMpBEyx24eeqQ

更清楚一点,msg_1 和 msg_2 已按正确的顺序正确发布。

msg_3 至 msg_10 也已发布在正确的位置。然而,它们都出现在 msg_1 和 msg_2 之前,根据 Firebase 推送键,这种情况不应该发生。在上图中,-NgWdYah0llBo4rryDd3(msg_9) 和 -NgWe5beMpBEyx24eeqQ(msg_10) 应位于数据库列表的底部。

我不确定与 -Nga9itauQTt6UiPu8Tc-NgaAh8_4jwiS2SR2JJq 相关的纪元时间,但无论它们是什么,它们都是未来的方式,因为即使在注意到此错误之后和小时,无论我发布什么消息,那些底部有 2 条消息。

firebase kotlin firebase-realtime-database
1个回答
0
投票

Firebase 推送密钥是根据以下内容在客户端生成的:

  • 当前客户端时间
  • 建立连接时确定的时钟偏差(客户端和服务器之间的时差偏移)。

基于此,我可以想象显着差异的唯一方法是客户端连接到服务器时确定的偏差与您调用时确定的偏差之间是否存在差异。

我建议通过监听 

push()

来检查生成这些异常值按键的客户端的偏差,如

时钟偏差
文档中所示。

© www.soinside.com 2019 - 2024. All rights reserved.