Использование базы данных Firebase в режиме реального времени

Мы используем базу данных Firebase в реальном времени, чтобы сохранять оценки для каждого уровня для пользователей, которые связаны с Facebook. Мы все еще тестируем эту функцию, и все работает отлично, но загрузка действительно очень высока. Каждый раз, когда этот пользователь открывает приложение, я загружаю очень небольшое количество данных, около 20 байтов, и дополнительные 5 байтов для каждого уровня, который он запускает. Через несколько минут загрузка стала показывать более 100 КБ, что очень много и не будет масштабироваться в финансовом отношении, когда мы сообщим об этом нашим пользователям. Вот структура данных, которую мы используем:

users{
  facebook_id{
    "firebase_id" : firebaseId,
    "max_level" : maxLevel,
    "stars" : numberOfStars,
    "scores" : {
      level : score,
    }
  }
}

Я также провел профилирование базы данных CLI, и было 0 неиндексированных запросов, и использование показалось правильным. Here Вот скриншот.

Кто-нибудь знает, что может быть не так? Если это просто накладные расходы на SSL (которые все еще кажутся слишком большими), отметим еще, что мы могли бы сделать, но настроить наш собственный сервер.

Ответ 1

Возможно, вы извлекаете намного больше данных из файла JSON, чем намереваетесь. Google разработал некоторые рекомендации о том, как лучше структурировать ваши данные, чтобы вы влияли на как можно меньше информации.

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

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

https://firebase.google.com/docs/firestore/best-practices#indexes

Также может пригодиться этот раздел под индексами:

Избегайте записи в документ более одного раза в секунду. Для большего информацию см. в разделе Обновления для одного документа.

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

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

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

https://firebase.google.com/docs/firestore/best-practices#read_and_write_operations

Надеюсь, это поможет вам!