Всегда ли Firebase гарантирует добавленные события по порядку? - PullRequest
0 голосов
/ 13 ноября 2018

Я занимаюсь разработкой мессенджера 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, что события происходят по порядку?

Я искал переполнение стека и гугл и много раз читал официальные документы.Однако я не смог найти четкого ответа.

Я почти потратил на это одну неделю.Пожалуйста, дайте мне совет.

1 Ответ

0 голосов
/ 13 ноября 2018

Порядок, в котором возвращаются данные для запроса, согласован и определяется сервером.Таким образом, все клиенты гарантированно получают результаты в одном и том же порядке.

Для новых данных, отправляемых в базу данных после подключения прослушивателей, все удаленные клиенты будут получать их в том же порядке.Локальный клиент сразу увидит события для своей операции записи, еще до того, как данные даже достигнут сервера базы данных.

На рисунке 2 это на самом деле довольно просто: каждый узел имеет уникальную метку времени, и они будутбыть возвращены в порядке этой отметки времени.Но даже если бы они имели одинаковую метку времени, они были бы возвращены в том же порядке (сначала метка времени, а затем ключ) для каждого клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...