Я занимаюсь разработкой мессенджера IOS-приложения на основе базы данных Firebase Realtime.Я хочу, чтобы все сообщения были упорядочены на основе отметки времени.
Существует сценарий, как показано ниже.
Есть 3 клиента.A, B и C.
1)
Все клиенты регистрируют слушателя 'figure-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().
Они отправляли сообщения в одно и то же время.
У всех клиентов хорошая скорость Wi-Fi.
Итак, наконец.Данные сервера сохраняются как «figure-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, что события происходят по порядку?
Я искал переполнение стека и гугл и много раз читал официальные документы.Однако я не смог найти четкого ответа.
Я почти потратил на это одну неделю.Пожалуйста, дайте мне совет.