Синхронизирует ли локальный экземпляр Android Firestore свои внутренние часы с сервером? - PullRequest
0 голосов
/ 25 сентября 2018

Причина, по которой я спрашиваю, в том, что мы знаем, что локальные записи в Firestore выполняются мгновенно.Это означает, что локально написанные объекты могут быть запрошены мгновенно.Документация также сообщает нам, что существует аннотация ServerTimestamp .

ServerTimestamp

public abstract @interface ServerTimestamp реализует аннотацию

Аннотация, используемая для пометки поля метки времени, которое должно быть заполнено меткой времени сервера.Если записываемый POJO содержит значение NULL для поля, аннотированного @ ServerTimestamp, оно будет заменено сгенерированной сервером отметкой времени.

Похоже, что поле объекта аннотировано и объект записанлокально, затем запрашивается локально, тогда поле будет содержать current server timestamp.Конечно, это будет означать, что локальный экземпляр Firestore в какой-то момент синхронизирует свои часы с сервером.Это правда?

Если это правда, то такой прием можно использовать для запроса текущего времени сервера Firebase, эффективно синхронизируя часы.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Похоже, что в документации Android Firestore есть Точность синхронизации

Точность синхронизации

Пока firebase.database.ServerValue.TIMESTAMPгораздо более точен и предпочтителен для большинства операций чтения / записи, иногда может быть полезно оценить отклонение тактовой частоты клиента относительно серверов базы данных Firebase Realtime.Вы можете прикрепить обратный вызов к расположению /.info/serverTimeOffset, чтобы получить значение в миллисекундах, которое клиенты базы данных Firebase Realtime добавляют к локальному сообщаемому времени (время эпохи в миллисекундах) для оценки времени сервера.Обратите внимание, что на точность этого смещения может влиять сетевая задержка, и поэтому он полезен, прежде всего, для обнаружения больших (> 1 секунды) расхождений во времени.

DatabaseReference offsetRef = FirebaseDatabase.getInstance().getReference(".info/serverTimeOffset");
offsetRef.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    double offset = snapshot.getValue(Double.class);
    double estimatedServerTimeMs = System.currentTimeMillis() + offset;
  }

  @Override
  public void onCancelled(DatabaseError error) {
    System.err.println("Listener was cancelled");
  }
});

Это может быть достаточным способом синхронизациичасы.

0 голосов
/ 25 сентября 2018

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

  • ESTIMATE

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

Оценочное значение получено из того, что клиентский SDK считает текущим временем,используя местные часы.Когда запись будет полностью зафиксирована, временная метка, скорее всего, изменится на фактическое значение сервера.

  • ПРЕДЫДУЩАЯ

Возвращает предыдущее значение для ServerTimestamps, которые не имеютпока не установлено окончательное значение.

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