Число операций чтения базы данных Firestore увеличивается, даже когда данные извлекаются из кэша - PullRequest
1 голос
/ 07 марта 2019

Я храню некоторые данные в firestore, которые мое приложение для Android загружает при запуске.Я использую следующий метод для загрузки этих данных при запуске приложения.

FirebaseFirestore.getInstance().collection("users").document(ApplicationEx.getUserId()).collection("items").addSnapshotListener((queryDocumentSnapshots, e) -> {
    if (queryDocumentSnapshots != null) {
        LOGGER.info("items fetched. from cache: " + queryDocumentSnapshots.getMetadata().isFromCache());
        for (QueryDocumentSnapshot queryDocumentSnapshot : queryDocumentSnapshots) {
            items.add(queryDocumentSnapshot.toObject(Item.class));
        }
    }
});

При перезапуске приложения видно, что данные выбираются из кэша, поскольку queryDocumentSnapshots.getMetadata().isFromCache() каждый раз возвращает true.Но когда я проверяю консоль firebase, я вижу, что иногда увеличивается число прочитанных документов.

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

Сохраненные данные не меняются, поэтому это не может быть связано с синхронизацией Androidизмененные данные.

Что может быть причиной этого?

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Согласно документации по выставлению счетов :

Минимальная плата за запросы

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

Итак, ваш запрос будет выполняться по крайней мере за одно чтение, если оно попадет на сервер.

Также в разделе «Прослушивание результатов запроса»:

Если слушатель отключен более чем на 30 минут (например, если пользователь переходит в автономный режим), вы будете платить за чтение, как если бы вы имели выдан новый запрос.

Это означает, что если ваш слушатель уходит и возвращается более чем через 30 минут (например, если приложение фоновое, а позднее -), то с вас снова будет взиматься плата за запрос.

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

0 голосов
/ 20 марта 2019

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

Я использовал следующий механизм, чтобы в некоторой степени преодолеть мою проблему.

Напишите новую облачную функцию Firebase, которая слушает записи коллекции.Он записывает время обновления коллекции в базу данных в реальном времени.

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

exports.onItemModified = functions.firestore.document('users/{userId}/items/{itemId}').onWrite((change, context) => {
    return admin.database().ref('/users/' + context.params.userId + '/items-updated-at').set(Date.now());
});

В Android при запуске приложения отключите сеть, загрузите элементы и снова включите сеть.

FirebaseFirestore.getInstance().disableNetwork().addOnCompleteListener(task -> loadItems());

private void loadItems() {
    Utils.getFirestoreCollection(COLLECTION_NAME_ITEMS).get().addOnCompleteListener(task -> {
        //Cache loaded items in memory
        FirebaseFirestore.getInstance().enableNetwork();
    }
}

ВAndroid, добавьте прослушиватель в путь к базе данных в реальном времени, где записано время последнего обновления элемента.Когда происходит событие обновления, прочитайте элементы еще раз и обновите кэш памяти.Сохраните время обновления элемента в общих настройках Android, поэтому при следующем событии обновления проверьте, больше ли обновленное время RTDB, чем сохраненное время, и снова считывайте элементы, только если время обновления RTDB превышает сохраненное время.

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