Есть несколько различных способов улучшить производительность 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 bucket. Также рассмотрите возможность размещения сохраненных данных через Cloud Storage for Firebase .
Поставка масштабируемого кода, который можно обновлять
Приложения, встроенные в устройства IoT, должны включать масштабируемый код, который вы можете легко обновлять. Обязательно тщательно протестируйте варианты использования, учтите сценарии, в которых вы можете экспоненциально увеличить свою базу пользователей, и встройте возможность развертывания обновлений в свой код. Тщательно продумайте основные изменения, которые вам может потребоваться сделать в дальнейшем, например, если вы решите разбить свои данные на части.