Существует несколько способов повысить производительность Firebase Realtime Database в вашем приложении. Чтобы узнать, как оптимизировать производительность Realtime Database , соберите данные с помощью различных инструментов мониторинга Realtime Database , а затем внесите соответствующие изменения в ваше приложение или использование Realtime Database .
Мониторинг производительности Realtime Database
Вы можете собирать данные о производительности вашей Realtime Database с помощью нескольких различных инструментов, в зависимости от необходимого вам уровня детализации:
- Общий обзор: используйте инструмент профилирования для получения списка неиндексированных запросов и обзора операций чтения/записи в реальном времени.
- Оценка использования по выставленным счетам: используйте метрики использования, доступные в консоли Firebase , чтобы просмотреть ваши выставленные счета за использование и общие метрики производительности.
- Подробная детализация: используйте Cloud Monitoring для более детального анализа работы вашей базы данных с течением времени.
Улучшение производительности по метрикам
После сбора данных изучите следующие передовые практики и стратегии, соответствующие области производительности, которую вы хотите улучшить.
Краткий обзор стратегий повышения производительности | ||
---|---|---|
Метрическая | Описание | Лучшие практики |
Нагрузка/Использование | Оптимизируйте объем использования емкости вашей базы данных для обработки запросов в любой момент времени (отражается в показателях **Load** или **io/database_load**). | Оптимизируйте структуру данных Разделение данных по базам данных Повышение эффективности работы слушателей Ограничьте загрузку с помощью правил на основе запросов Оптимизировать соединения |
Активные соединения | Сбалансируйте количество одновременных активных подключений к базе данных, чтобы не превышать лимит в 200 000 подключений. | Разделение данных по базам данных Уменьшить количество новых подключений |
Исходящая пропускная способность | Если объемы загрузок из вашей базы данных превышают желаемые, вы можете повысить эффективность операций чтения и сократить накладные расходы на шифрование. | Оптимизировать соединения Оптимизируйте структуру данных Ограничьте загрузку с помощью правил на основе запросов Повторное использование сеансов SSL Повышение эффективности работы слушателей Ограничить доступ к данным |
Хранилище | Убедитесь, что вы не храните неиспользуемые данные, или распределите хранимые данные по другим базам данных и/или продуктам Firebase, чтобы не превышать квоту. | Очистите неиспользуемые данные Оптимизируйте структуру данных Разделение данных по базам данных Используйте Cloud Storage for Firebase |
Оптимизировать соединения
RESTful-запросы, такие как GET
и PUT
, по-прежнему требуют подключения, даже если оно кратковременное. Эти частые и кратковременные соединения могут значительно увеличить стоимость подключения, нагрузку на базу данных и исходящую пропускную способность, чем активные подключения к базе данных в режиме реального времени.
По возможности используйте собственные SDK для платформы вашего приложения вместо REST API. SDK поддерживают открытые соединения, снижая затраты на SSL-шифрование и нагрузку на базу данных, которые могут возникнуть из-за REST API.
Если вы используете REST API, рассмотрите возможность использования HTTP-подтверждения активности для поддержания открытого соединения или использования событий, отправляемых сервером , что может сократить затраты на SSL-подтверждения.
Разделение данных по нескольким базам данных
Разделение данных между несколькими экземплярами Realtime Database , также известное как сегментирование базы данных, дает три преимущества:
- Увеличьте общее количество одновременных активных подключений, разрешенных в вашем приложении, распределив их между экземплярами базы данных.
- Распределите нагрузку между экземплярами базы данных.
- Если у вас есть независимые группы пользователей, которым нужен доступ только к отдельным наборам данных, используйте разные экземпляры базы данных для более высокой пропускной способности и меньшей задержки.
Если вы используете тарифный план Blaze , вы можете создать несколько экземпляров базы данных в рамках одного проекта Firebase, используя общий метод аутентификации пользователей во всех экземплярах базы данных.
Узнайте больше о том, как и когда следует сегментировать данные .
Создавайте эффективные структуры данных
Поскольку Realtime Database извлекает данные как из дочерних узлов пути, так и из самого пути, имеет смысл поддерживать максимально плоскую структуру данных. Это позволит выборочно извлекать нужные данные, не загружая при этом ненужные данные на клиенты.
В частности, при структурировании данных учитывайте операции записи и удаления. Например, удаление путей с тысячами листьев может быть дорогостоящим. Разделение их на пути с несколькими поддеревьями и меньшим количеством листьев на узел может ускорить удаление.
Кроме того, каждая запись может занимать 0,1% от общего использования базы данных. Структурируйте данные таким образом, чтобы можно было объединять записи в одну операцию в виде многоканальных обновлений с помощью методов update()
в SDK или RESTful PATCH
запросов.
Чтобы оптимизировать структуру данных и повысить производительность, следуйте рекомендациям по структурам данных .
Предотвратить несанкционированный доступ
Предотвратите несанкционированные операции с вашей базой данных с помощью Realtime Database Security Rules . Например, использование правил может предотвратить ситуацию, когда злоумышленник многократно загружает всю вашу базу данных.
Узнайте больше об использовании правил базы данных Firebase Realtime .
Используйте правила на основе запросов для ограничения загрузок
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 .
Масштабируемый код, который можно обновлять
Приложения, встроенные в устройства Интернета вещей, должны включать масштабируемый код, который можно легко обновлять. Тщательно тестируйте варианты использования, учитывайте сценарии, в которых ваша база пользователей может расти экспоненциально, и предусмотрите возможность развертывания обновлений кода. Тщательно продумайте, какие серьёзные изменения вам может потребоваться внести в будущем, например, если вы решите шардировать данные.