Существует несколько способов улучшить производительность 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 keep-alive для поддержания открытого соединения или использования событий, отправляемых сервером , что может снизить затраты на SSL-рукопожатие.
Совместное использование данных в нескольких базах данных.
Разделение данных между несколькими экземплярами Realtime Database , также известное как шардинг базы данных, дает три преимущества:
- Увеличьте общее количество одновременно активных подключений, разрешенных для вашего приложения, распределив их между экземплярами базы данных.
- Сбалансируйте нагрузку между экземплярами базы данных.
- Если у вас есть независимые группы пользователей, которым нужен доступ только к отдельным наборам данных, используйте разные экземпляры базы данных для повышения пропускной способности и снижения задержки.
Если вы используете тарифный план Blaze , вы можете создать несколько экземпляров базы данных в рамках одного проекта Firebase, используя общий метод аутентификации пользователей для всех экземпляров базы данных.
Узнайте больше о том, как и когда следует сегментировать данные .
Создавайте эффективные структуры данных.
Поскольку Realtime Database извлекает данные как из дочерних узлов пути, так и из самого пути, целесообразно поддерживать максимально плоскую структуру данных. Таким образом, вы можете выборочно извлекать необходимые данные, не загружая при этом ненужные данные на клиентские устройства.
В частности, при структурировании данных следует учитывать операции записи и удаления. Например, удаление путей с тысячами листьев может быть дорогостоящим процессом. Разделение таких путей на пути с несколькими поддеревьями и меньшим количеством листьев на узел может ускорить удаление.
Кроме того, каждая операция записи может занимать 0,1% от общего объема используемой базы данных. Структурируйте данные таким образом, чтобы можно было объединять операции записи в одну операцию в виде многопутевых обновлений либо с помощью методов update() в SDK, либо с помощью RESTful 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-устройства, должны содержать масштабируемый код, который легко обновлять. Обязательно тщательно протестируйте варианты использования, учтите сценарии экспоненциального роста вашей пользовательской базы и предусмотрите возможность развертывания обновлений кода. Тщательно продумайте основные изменения, которые могут потребоваться в будущем, например, если вы решите разделить данные на сегменты.