Istnieje kilka sposobów na poprawę Firebase Realtime Databaseskuteczności aplikacji. Aby dowiedzieć się, co możesz zrobić, aby zoptymalizować Realtime Databaseskuteczność, zbieraj dane za pomocą różnych Realtime Databasenarzędzi do monitorowania, a następnie wprowadzaj zmiany w aplikacji lub Realtime Databaseodpowiednio z niej korzystaj.
Sprawdzanie 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 potrzebnego poziomu szczegółowości:
- Ogólny przegląd: użyj profilera, aby uzyskać listę niezindeksowanych zapytań i przegląd operacji odczytu/zapisu w czasie rzeczywistym.
- Szacunkowe wykorzystanie podlegające rozliczeniu: użyj danych o wykorzystaniu dostępnych w Firebase konsoli, aby sprawdzić wykorzystanie podlegające rozliczeniu i ogólne dane o skuteczności.
- Szczegółowe dane: 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.
Szybki przegląd strategii poprawy skuteczności | ||
---|---|---|
Dane | Opis | Sprawdzone metody |
Obciążenie/wykorzystanie | Zoptymalizuj wykorzystanie pojemności bazy danych podczas przetwarzania żądań w danym momencie (odzwierciedlone w metrykach **Obciążenie** lub **io/database_load**). |
Zoptymalizuj strukturę danych Dziel dane między bazami danych Zwiększ wydajność odbiorników Ogranicz pobieranie za pomocą reguł opartych na zapytaniach Zoptymalizuj połączenia |
Aktywne połączenia | Zrównoważ liczbę jednoczesnych aktywnych połączeń z bazą danych, aby nie przekroczyć limitu 200 000 połączeń. |
Dzielenie danych na bazy danych Ograniczanie liczby nowych połączeń |
Przepustowość dla ruchu wychodzącego | Jeśli liczba pobrań z bazy danych wydaje się wyższa niż oczekiwana, możesz zwiększyć wydajność operacji odczytu i zmniejszyć obciążenie związane z szyfrowaniem. |
Optymalizowanie połączeń Optymalizowanie struktury danych Ograniczanie pobierania za pomocą reguł opartych na zapytaniach Ponowne wykorzystywanie sesji SSL Zwiększanie wydajności odbiornika 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. |
Usuwanie nieużywanych danych Optymalizacja struktury danych Dzielenie danych na bazy danych Używanie Cloud Storage for Firebase |
Połączenia z Optimize
Żą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 wyższe koszty połączeń, obciążenie bazy danych i wychodzącą przepustowość niż aktywne połączenia z bazą danych w czasie rzeczywistym.
W miarę możliwości używaj natywnych pakietów SDK dla platformy aplikacji zamiast interfejsu REST API. Zestawy SDK utrzymują otwarte połączenia, co zmniejsza koszty szyfrowania SSL i obciążenie bazy danych, które mogą się zwiększać w przypadku interfejsu API REST.
Jeśli korzystasz z interfejsu API REST, rozważ użycie funkcji HTTP keep-alive, aby utrzymać otwarte połączenie, lub użyj zdarzeń wysyłanych przez serwer, co może zmniejszyć koszty związane z uzgadnianiem połączenia SSL.
Dzielenie danych na fragmenty w wielu bazach danych
Podział danych na kilka instancji Realtime Database, czyli tzw. fragmentowanie bazy danych, ma 3 zalety:
- Zwiększ łączną liczbę jednoczesnych aktywnych połączeń dozwolonych w aplikacji, dzieląc je między instancje bazy danych.
- Równoważenie obciążenia między instancjami bazy danych.
- Jeśli masz niezależne grupy użytkowników, które potrzebują dostępu tylko do oddzielnych zbiorów danych, używaj różnych instancji bazy danych, aby uzyskać większą przepustowość i mniejsze opóźnienie.
Jeśli korzystasz z abonamentu Blaze, możesz utworzyć w tym samym projekcie Firebase wiele instancji bazy danych, korzystając z wspólnej metody uwierzytelniania użytkowników w różnych instancjach bazy danych.
Dowiedz się więcej o tym, jak i kiedy dzielić dane.
Tworzenie wydajnych struktur danych
Funkcja Realtime Database pobiera dane z węzłów podrzędnych ścieżki, a także z samej ścieżki, dlatego warto, aby struktura danych była jak najbardziej płaska. Dzięki temu możesz selektywnie pobierać potrzebne dane bez konieczności pobierania niepotrzebnych danych na urządzenia klienckie.
Podczas strukturyzowania danych zwróć szczególną uwagę na operacje zapisu i usuwania. Na przykład usuwanie ścieżek z tysiącami węzłów 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 wykorzystywać 0, 1% całego wykorzystania bazy danych.
Uporządkuj dane w taki sposób, aby umożliwić wykonywanie operacji zapisu w pakietach w ramach jednej operacji jako aktualizacji wielościeżkowych 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.
Zapobieganie nieautoryzowanemu dostępowi
Zapobiegaj nieautoryzowanym operacjom w bazie danych za pomocą funkcji Realtime Database Security Rules. Na przykład używanie reguł może zapobiec sytuacji, w której złośliwy użytkownik wielokrotnie pobiera całą bazę danych.
Dowiedz się więcej o korzystaniu z reguł Bazy danych czasu rzeczywistego Firebase.
Ograniczanie pobierania za pomocą reguł opartych na zapytaniach
Realtime Database Security Rules ograniczać dostęp do danych w bazie danych, ale mogą też służyć jako ograniczenia danych zwracanych w ramach operacji odczytu. Jeśli używasz reguł opartych na zapytaniach, zdefiniowanych przez wyrażenia query.
, np. 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 do indeksu
Indeksowanie danych zmniejsza całkowitą przepustowość wykorzystywaną przez każde zapytanie uruchamiane przez aplikację.
Ponowne wykorzystywanie sesji SSL
Zmniejsz koszty związane z szyfrowaniem SSL w przypadku wznowionych połączeń, wydając bilety sesji TLS. Jest to szczególnie przydatne, jeśli często potrzebujesz bezpiecznych połączeń z bazą danych.
Zwiększanie skuteczności słuchaczy
Umieść słuchaczy jak najdalej na ścieżce, aby ograniczyć ilość synchronizowanych przez nich danych. Odbiorcy powinni znajdować się blisko danych, które mają otrzymywać. 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 nasłuchiwaczy, które pobierają tylko aktualizacje danych, np. on()
zamiast once()
. Zarezerwuj .once()
dla działań, które naprawdę nie wymagają aktualizacji danych.
Dodatkowo, aby uzyskać najlepsze wyniki, w miarę możliwości sortuj zapytania za pomocą funkcji orderByKey()
. Sortowanie za pomocą funkcji orderByChild()
może być 6–8 razy wolniejsze, a sortowanie za pomocą funkcji orderByValue()
może być bardzo wolne w przypadku dużych zbiorów danych, ponieważ wymaga odczytania całej lokalizacji z warstwy trwałości.
Pamiętaj też, aby dynamicznie dodawać odbiorców i usuwać ich, gdy nie są już potrzebni.
Usuwanie 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 Google Cloud Storage zasobniku. Możesz też rozważyć hostowanie przechowywanych danych za pomocą Cloud Storage for Firebase.
Wysyłaj skalowalny kod, który możesz aktualizować
Aplikacje wbudowane w urządzenia IoT powinny zawierać skalowalny kod, który można łatwo aktualizować. Dokładnie przetestuj przypadki użycia, uwzględnij scenariusze, w których baza użytkowników może się gwałtownie powiększyć, i zadbaj o możliwość wdrażania aktualizacji kodu. Dokładnie rozważ główne zmiany, które mogą być konieczne w przyszłości, np. jeśli zdecydujesz się podzielić dane na fragmenty.