Есть несколько способов повысить Firebase Realtime Database эффективность приложения. Чтобы узнать, как оптимизировать Realtime Database эффективность, соберите данные с помощью различных инструментов Realtime Database мониторинга, а затем внесите изменения в приложение или Realtime Database.
Отслеживайте эффективность Realtime Database
Вы можете собирать данные об эффективности Realtime Database с помощью нескольких инструментов в зависимости от того, насколько подробная информация вам нужна.
- Общие сведения. Используйте инструмент профилирования, чтобы получить список неиндексированных запросов и общие сведения об операциях чтения и записи в реальном времени.
- Оценка использования, за которое взимается плата. Используйте показатели использования, доступные в консоли Firebase, чтобы посмотреть использование, за которое взимается плата, и общие показатели эффективности.
- Подробная детализация. Используйте Cloud Monitoring, чтобы получить более подробную информацию о производительности базы данных за определенный период времени.
Повышение эффективности по показателям
Собрав данные, изучите приведенные ниже рекомендации и стратегии, которые помогут вам улучшить нужные показатели.
| Стратегии повышения эффективности | ||
|---|---|---|
| Показатель | Описание | Рекомендации |
| Нагрузка/использование | Оптимизируйте объем ресурсов базы данных, используемых для обработки запросов в любой момент времени (отражается в показателях **Нагрузка** или **io/database_load**). |
Оптимизируйте структуру данных Разделите данные по базам данных Повысьте эффективность прослушивателей Ограничьте скачивания с помощью правил на основе запросов Оптимизируйте подключения |
| Активные подключения | Следите за тем, чтобы количество одновременных активных подключений к базе данных не превышало 200 000. |
Разделение данных между базами данных Сокращение количества новых подключений |
| Исходящая пропускная способность | Если объем скачиваний из базы данных кажется вам слишком большим, вы можете повысить эффективность операций чтения и снизить нагрузку на шифрование. |
Оптимизация подключений Оптимизация структуры данных Ограничение скачиваний с помощью правил на основе запросов Повторное использование сеансов SSL Повышение эффективности прослушивателя Ограничение доступа к данным |
| Хранилище | Убедитесь, что вы не храните неиспользуемые данные, или распределите хранимые данные по другим базам данных и/или продуктам Firebase, чтобы не превышать квоту. |
Удалите неиспользуемые данные Оптимизируйте структуру данных Разделите данные между базами данных Используйте Cloud Storage for Firebase |
Оптимизация подключений
Для RESTful-запросов, таких как GET и PUT, по-прежнему требуется подключение, даже если оно кратковременное. Эти частые кратковременные подключения могут значительно увеличить затраты на подключение, нагрузку на базу данных и исходящую пропускную способность по сравнению с активными подключениями к базе данных в реальном времени.
По возможности используйте нативные SDK для платформы вашего приложения, а не REST API. SDK поддерживают открытые подключения, снижая затраты на SSL-шифрование и нагрузку на базу данных, которые могут увеличиваться при использовании REST API.
Если вы используете REST API, рекомендуем использовать HTTP keep-alive для поддержания открытого соединения или события, отправляемые сервером. Это может снизить затраты на SSL-рукопожатия.
Разделение данных между несколькими базами данных
Разделение данных между несколькими экземплярами Realtime Database, также известное как сегментирование базы данных, дает три преимущества:
- Увеличьте общее количество одновременных активных подключений, разрешенных в вашем приложении, распределив их по экземплярам базы данных.
- Балансировка нагрузки между экземплярами базы данных.
- Если у вас есть независимые группы пользователей, которым нужен доступ только к отдельным наборам данных, используйте разные экземпляры базы данных, чтобы повысить пропускную способность и снизить задержку.
Если вы используете тарифный план Blaze, то можете создать несколько экземпляров базы данных в одном проекте Firebase, используя общий способ аутентификации пользователей.
Подробнее о том, как и когда разбивать данные…
Создавайте эффективные структуры данных
Поскольку метод Realtime Database извлекает данные как из дочерних узлов пути, так и из самого пути, рекомендуется использовать максимально плоскую структуру данных. Это позволяет выборочно получать нужные данные, не скачивая на клиенты лишнюю информацию.
В частности, при структурировании данных учитывайте операции записи и удаления. Например, удаление путей с тысячами листьев может быть дорогостоящим. Разделение их на пути с несколькими поддеревьями и меньшим количеством листьев на узел может ускорить удаление.
Кроме того, каждая запись может занимать до 0,1% от общего объема использования базы данных.
Структурируйте данные так, чтобы можно было выполнять пакетную запись за одну операцию в виде многопутевых обновлений с помощью методов update() в SDK или REST-запросов PATCH.
Чтобы оптимизировать структуру данных и повысить производительность, следуйте рекомендациям по работе со структурами данных.
Защита от несанкционированного доступа
Предотвращайте несанкционированные операции с базой данных с помощью Realtime Database Security Rules. Например, с помощью правил можно предотвратить сценарий, в котором злоумышленник неоднократно скачивает всю вашу базу данных.
Подробнее об использовании правил Firebase Realtime Database…
Как ограничить скачивание с помощью правил на основе запросов
Realtime Database Security Rules ограничивают доступ к данным в базе данных, но они также могут служить ограничениями на данные, возвращаемые в результате операций чтения. Если вы используете правила на основе запросов, заданные выражениями query., например query.limitToFirst, запросы будут извлекать только данные, ограниченные правилом.
Например, следующее правило ограничивает доступ на чтение только первыми 1000 результатами запроса, упорядоченными по приоритету:
messages: {
".read": "query.orderByKey &&
query.limitToFirst <= 1000"
}
// Example query:
db.ref("messages").limitToFirst(1000)
.orderByKey("value")
Подробнее о Realtime Database Security Rules…
Индекс запросов
Индексирование данных позволяет снизить общую пропускную способность, используемую для каждого запроса, который выполняет приложение.
Повторное использование сеансов SSL
Чтобы снизить накладные расходы на шифрование SSL при возобновлении подключений, используйте билеты сеансов TLS. Это особенно полезно, если вам требуются частые и безопасные подключения к базе данных.
Повышение эффективности прослушивателя
Размещайте прослушиватели как можно дальше по пути, чтобы ограничить объем синхронизируемых данных. Слушатели должны находиться рядом с данными, которые они должны получить. Не прослушивайте корневой каталог базы данных, так как это приведет к скачиванию всей базы данных.
Добавьте запросы, чтобы ограничить данные, возвращаемые операциями прослушивания, и используйте прослушиватели, которые скачивают только обновления данных, например on() вместо once(). Используйте .once() только для действий, которые действительно не требуют обновления данных.
Кроме того, для повышения эффективности по возможности сортируйте запросы с помощью orderByKey(). Сортировка с помощью orderByChild() может быть в 6–8 раз медленнее, а сортировка с помощью orderByValue() может быть очень медленной для больших наборов данных, поскольку для нее требуется чтение всего местоположения из уровня сохраняемости.
Также не забудьте добавить прослушиватели динамически и удалить их, когда они больше не нужны.
Удалите неиспользуемые данные
Периодически удаляйте из базы данных неиспользуемые или повторяющиеся данные. Вы можете вручную запустить резервное копирование, чтобы проверить данные, или настроить периодическое резервное копирование в сегмент Google Cloud Storage. Также рекомендуем размещать сохраненные данные в Cloud Storage for Firebase.
Создавайте масштабируемый код, который можно обновлять
Приложения, встроенные в устройства IoT, должны содержать масштабируемый код, который можно легко обновлять. Тщательно протестируйте варианты использования, учтите сценарии, в которых ваша пользовательская база может расти в геометрической прогрессии, и предусмотрите возможность развертывания обновлений в коде. Тщательно продумайте, какие изменения вам может потребоваться внести в будущем, например если вы решите сегментировать данные.