Jest kilka sposobów na poprawę wydajności Firebase Realtime Database w aplikacji. Aby dowiedzieć się, co możesz zrobić, żeby zoptymalizować wydajność Realtime Database, zbierz dane za pomocą różnych narzędzi do monitorowania Realtime Database, a następnie wprowadź odpowiednie zmiany w aplikacji lub Realtime Database.
Monitorowanie skuteczności Realtime Database
Dane o skuteczności Realtime Database możesz zbierać za pomocą kilku różnych narzędzi, w zależności od wymaganego poziomu szczegółowości:
- Ogólne omówienie: użyj narzędzia do profilowania, aby uzyskać listę niezindeksowanych zapytań i ogólne omówienie operacji odczytu i zapisu w czasie rzeczywistym.
- Szacunkowe wykorzystanie podlegające opłacie: użyj wskaźników wykorzystania dostępnych w konsoli Firebase, aby wyświetlić wykorzystanie podlegające opłacie i ogólne wskaźniki skuteczności.
- Szczegółowe informacje: użyj Cloud Monitoring, aby uzyskać bardziej szczegółowe informacje o wydajności bazy danych w czasie.
Zwiększanie skuteczności według danych
Po zebraniu danych zapoznaj się z tymi sprawdzonymi metodami i strategiami, które pomogą Ci poprawić skuteczność w wybranym obszarze.
| Strategie poprawy skuteczności w skrócie | ||
|---|---|---|
| Wskaźnik | Opis | Sprawdzone metody |
| Obciążenie/wykorzystanie | Zoptymalizuj wykorzystanie pojemności bazy danych do przetwarzania żądań w danym momencie (odzwierciedlone we wskaźnikach **Obciążenie** lub **io/database_load**). |
Optymalizacja struktury danych Fragmentowanie danych w bazach danych Zwiększanie wydajności detektorów Ograniczanie pobierania za pomocą reguł opartych na zapytaniach Optymalizacja połączeń |
| Aktywne połączenia | Zrównoważ liczbę jednoczesnych aktywnych połączeń z bazą danych, aby nie przekroczyć limitu 200 000 połączeń. |
Podziel dane na fragmenty między bazami danych Zmniejsz liczbę nowych połączeń |
| przepustowość dla ruchu wychodzącego, | Jeśli pobieranie z bazy danych wydaje się większe, niż chcesz, możesz zwiększyć wydajność operacji odczytu i zmniejszyć obciążenie związane z szyfrowaniem. |
Optymalizacja połączeń Optymalizacja struktury danych Ograniczanie pobierania za pomocą reguł opartych na zapytaniach Ponowne używanie sesji SSL Zwiększanie wydajności detektorów Ograniczanie dostępu do danych |
| Miejsce na dane | Upewnij się, że nie przechowujesz nieużywanych danych, lub rozłóż przechowywane dane na inne bazy danych lub usługi Firebase, aby nie przekroczyć limitu. |
Czyszczenie nieużywanych danych Optymalizacja struktury danych Fragmentowanie danych w bazach danych Korzystanie z Cloud Storage for Firebase |
Optymalizacja połączeń
Żądania RESTful, takie jak GET i PUT, nadal wymagają połączenia, nawet jeśli jest ono krótkotrwałe. Te częste, krótkotrwałe połączenia mogą w rzeczywistości generować znacznie większe koszty połączeń, obciążenie bazy danych i przepustowość dla ruchu wychodzącego niż aktywne połączenia z bazą danych w czasie rzeczywistym.
Jeśli to możliwe, zamiast interfejsu REST API używaj natywnych pakietów SDK dla platformy aplikacji. Pakiety SDK utrzymują otwarte połączenia, co zmniejsza koszty szyfrowania SSL i obciążenie bazy danych, które mogą się sumować w przypadku interfejsu API typu REST.
Jeśli używasz interfejsu REST API, rozważ użycie protokołu HTTP keep-alive, aby utrzymać otwarte połączenie, lub zdarzeń wysyłanych przez serwer, co może obniżyć koszty związane z uzgadnianiem SSL.
Fragmentowanie danych w wielu bazach danych
Podział danych między wiele instancji Realtime Database, czyli fragmentowanie bazy danych, zapewnia 3 korzyści:
- Zwiększ łączną liczbę jednoczesnych aktywnych połączeń dozwolonych w aplikacji, dzieląc je między instancje bazy danych.
- równoważyć obciążenie między instancjami baz danych,
- Jeśli masz niezależne grupy użytkowników, którzy potrzebują dostępu tylko do odrębnych zbiorów danych, użyj różnych instancji bazy danych, aby uzyskać większą przepustowość i mniejsze opóźnienia.
Jeśli korzystasz z abonamentu Blaze, możesz utworzyć wiele instancji bazy danych w tym samym projekcie w Firebase, korzystając ze wspólnej metody uwierzytelniania użytkowników we wszystkich instancjach bazy danych.
Dowiedz się więcej o tym, jak i kiedy dzielić dane na fragmenty.
Tworzenie wydajnych struktur danych
Ponieważ Realtime Database pobiera dane z węzłów podrzędnych ścieżki, a także ze ścieżki, warto zachować jak najbardziej płaską strukturę danych. Dzięki temu możesz selektywnie pobierać potrzebne dane bez pobierania niepotrzebnych danych do klientów.
Podczas tworzenia struktury danych weź pod uwagę zwłaszcza operacje zapisu i usuwania. Na przykład usunięcie ścieżek z tysiącami liści może być kosztowne. Podzielenie ich na ścieżki z wieloma poddrzewami i mniejszą liczbą liści na węzeł może przyspieszyć usuwanie.
Dodatkowo każdy zapis może zająć 0, 1% całkowitego wykorzystania bazy danych.
Uporządkuj dane w taki sposób, aby można było grupować zapisy w jedną operację jako aktualizacje wielościeżkowe za pomocą metod update() w pakietach SDK lub żądań RESTful PATCH.
Aby zoptymalizować strukturę danych i zwiększyć wydajność, postępuj zgodnie ze sprawdzonymi metodami dotyczącymi struktur danych.
Ochrona przed nieuprawnionym dostępem
Zapobiegaj nieautoryzowanym operacjom na bazie danych za pomocą Realtime Database Security Rules. Na przykład użycie reguł może zapobiec sytuacji, w której złośliwy użytkownik wielokrotnie pobiera całą bazę danych.
Dowiedz się więcej o używaniu reguł Bazy danych czasu rzeczywistego Firebase.
Używanie reguł opartych na zapytaniach do ograniczania pobierania
Realtime Database Security Rules ograniczają dostęp do danych w bazie danych, ale mogą też służyć jako limity danych zwracanych przez operacje odczytu. Gdy używasz reguł opartych na zapytaniach, które są zdefiniowane przez wyrażenia query., takie jak query.limitToFirst, zapytania pobierają tylko dane ograniczone przez regułę.
Na przykład ta reguła ogranicza dostęp do odczytu tylko do pierwszych 1000 wyników zapytania uporządkowanych według priorytetu:
messages: {
".read": "query.orderByKey &&
query.limitToFirst <= 1000"
}
// Example query:
db.ref("messages").limitToFirst(1000)
.orderByKey("value")
Dowiedz się więcej o Realtime Database Security Rules.
Zapytania dotyczące indeksu
Indeksowanie danych zmniejsza łączną przepustowość wykorzystywaną przez każde zapytanie uruchamiane przez aplikację.
Ponowne używanie sesji SSL
Zmniejsz koszty narzutu szyfrowania SSL w przypadku wznowionych połączeń, wydając bilety sesji TLS. Jest to szczególnie przydatne, jeśli potrzebujesz częstych, bezpiecznych połączeń z bazą danych.
Zwiększanie wydajności detektora
Umieść detektory jak najdalej na ścieżce, aby ograniczyć ilość synchronizowanych danych. Odbiorcy powinni znajdować się blisko danych, które mają otrzymać. Nie nasłuchuj w katalogu głównym bazy danych, ponieważ spowoduje to pobranie całej bazy danych.
Dodaj zapytania, aby ograniczyć dane zwracane przez operacje nasłuchiwania, i używaj detektorów, które pobierają tylko aktualizacje danych – na przykład on() zamiast once(). Zarezerwuj .once() dla działań, które naprawdę nie wymagają aktualizacji danych.
Dodatkowo, aby uzyskać najlepszą wydajność, sortuj zapytania za pomocą orderByKey(), gdy tylko jest to możliwe. Sortowanie za pomocą orderByChild() może być 6–8 razy wolniejsze, a sortowanie za pomocą orderByValue() może być bardzo wolne w przypadku dużych zbiorów danych, ponieważ wymaga odczytu całej lokalizacji z warstwy trwałości.
Pamiętaj też, aby dodawać detektory dynamicznie i usuwać je, gdy nie są już potrzebne.
Czyszczenie nieużywanych danych
Okresowo usuwaj z bazy danych nieużywane lub zduplikowane dane. Możesz uruchamiać kopie zapasowe, aby ręcznie sprawdzać dane, lub okresowo tworzyć ich kopie zapasowe w zasobniku Google Cloud Storage. Możesz też rozważyć przechowywanie danych w Cloud Storage for Firebase.
Wdrażanie skalowalnego kodu, który można aktualizować
Aplikacje wbudowane w urządzenia IoT powinny zawierać skalowalny kod, który można łatwo aktualizować. Pamiętaj, aby dokładnie przetestować przypadki użycia, uwzględnić scenariusze, w których liczba użytkowników może gwałtownie wzrosnąć, i zapewnić możliwość wdrażania aktualizacji kodu. Dokładnie przemyśl poważne zmiany, które mogą być konieczne w przyszłości, np. jeśli zdecydujesz się na fragmentację danych.