Istnieje kilka różnych sposobów poprawy wydajności bazy danych Firebase Realtime Database w aplikacji. Aby dowiedzieć się, co możesz zrobić, aby zoptymalizować wydajność Bazy danych czasu rzeczywistego, zbierz dane za pomocą różnych narzędzi do monitorowania bazy danych czasu rzeczywistego, a następnie wprowadź odpowiednie zmiany w aplikacji lub korzystaniu z bazy danych czasu rzeczywistego.
Monitoruj wydajność bazy danych w czasie rzeczywistym
Możesz zbierać dane o wydajności bazy danych czasu rzeczywistego za pomocą kilku różnych narzędzi, w zależności od wymaganego poziomu szczegółowości:
- Przegląd wysokiego poziomu: Użyj narzędzia profilera, aby uzyskać listę niezindeksowanych zapytań i przegląd operacji odczytu/zapisu w czasie rzeczywistym.
- Szacunkowe rozliczenie użycia: użyj wskaźników użytkowania dostępnych w konsoli Firebase , aby zobaczyć rozliczone dane dotyczące wykorzystania i ogólne wskaźniki wydajności.
- Szczegółowa analiza: użyj Cloud Monitoring, aby uzyskać bardziej szczegółowy wgląd w działanie bazy danych na przestrzeni czasu.
Popraw wydajność według wskaźników
Po zebraniu danych zapoznaj się z poniższymi najlepszymi praktykami i strategiami w oparciu o obszar wydajności, który chcesz poprawić.
Strategie poprawy wydajności w skrócie | ||
---|---|---|
Metryczny | Opis | Najlepsze praktyki |
Obciążenie/wykorzystanie | Zoptymalizuj, jaka część bazy danych jest wykorzystywana do przetwarzania żądań w danym momencie (odzwierciedlona w metrykach **Load** lub **io/database_load**). | Zoptymalizuj strukturę danych Dane fragmentów w bazach danych Popraw wydajność słuchacza Ogranicz pobieranie za pomocą reguł opartych na zapytaniach Optymalizuj połączenia |
Aktywne połączenia | Zrównoważ liczbę jednoczesnych, aktywnych połączeń z bazą danych, aby nie przekroczyć limitu 200 000 połączeń. | Dane fragmentów w bazach danych Ogranicz liczbę nowych połączeń |
Pasmo wychodzące | Jeśli liczba pobrań z Twojej bazy danych wydaje się większa niż chcesz, możesz poprawić wydajność operacji odczytu i zmniejszyć obciążenie związane z szyfrowaniem. | Optymalizuj połączenia Zoptymalizuj strukturę danych Ogranicz pobieranie za pomocą reguł opartych na zapytaniach Wykorzystuj ponownie sesje SSL Popraw wydajność słuchacza Ogranicz dostęp do danych |
Składowanie | Upewnij się, że nie przechowujesz nieużywanych danych, lub zrównoważ przechowywane dane w innych bazach danych i/lub produktach Firebase, aby nie przekroczyć limitu. | Wyczyść nieużywane dane Zoptymalizuj strukturę danych Dane fragmentów w bazach danych Użyj Cloud Storage dla Firebase |
Optymalizuj połączenia
Żądania RESTful, takie jak GET
i PUT
, nadal wymagają połączenia, nawet jeśli to połączenie jest krótkotrwałe. Te częste, krótkotrwałe połączenia mogą w rzeczywistości skutkować znacznie większymi kosztami połączeń, obciążeniem bazy danych i przepustowością wychodzącą niż aktywne połączenia z bazą danych w czasie rzeczywistym.
Jeśli to możliwe, używaj natywnych zestawów SDK dla platformy swojej aplikacji zamiast interfejsu API REST. Zestawy SDK utrzymują otwarte połączenia, redukując koszty szyfrowania SSL i obciążenie bazy danych, które może wystąpić w przypadku interfejsu API REST.
Jeśli korzystasz z interfejsu API REST, rozważ użycie funkcji utrzymywania aktywności HTTP w celu utrzymania otwartego połączenia lub użyj zdarzeń wysyłanych przez serwer , co może zmniejszyć koszty związane z uzgadnianiem SSL.
Dane fragmentów w wielu bazach danych
Dzielenie danych na wiele instancji bazy danych czasu rzeczywistego, zwane także fragmentowaniem bazy danych, oferuje trzy korzyści:
- Zwiększ łączną liczbę jednoczesnych, aktywnych połączeń dozwolonych w Twojej aplikacji, dzieląc je między instancje bazy danych.
- Zrównoważ obciążenie między instancjami bazy danych.
- Jeśli masz niezależne grupy użytkowników, którzy potrzebują dostępu tylko do odrębnych zestawów danych, użyj różnych instancji bazy danych, aby uzyskać większą przepustowość i mniejsze opóźnienia.
Jeśli korzystasz z planu cenowego Blaze , możesz utworzyć wiele instancji bazy danych w ramach tego samego projektu Firebase, wykorzystując wspólną metodę uwierzytelniania użytkowników w instancjach baz danych.
Dowiedz się więcej o tym, jak i kiedy fragmentować dane .
Buduj wydajne struktury danych
Ponieważ baza danych czasu rzeczywistego pobiera dane z węzłów podrzędnych ścieżki oraz ze ścieżki, rozsądne jest utrzymywanie możliwie płaskiej struktury danych. W ten sposób możesz selektywnie pobierać potrzebne dane, bez konieczności pobierania niepotrzebnych danych klientom.
W szczególności rozważ zapisy i usunięcia podczas strukturyzacji danych. Na przykład ścieżki z tysiącami liści są potencjalnie kosztowne w usuwaniu. Podział ich na ścieżki z wieloma poddrzewami i mniejszą liczbą liści na węzeł może przyspieszyć usuwanie.
Ponadto każdy zapis może zająć 0,1% całkowitego wykorzystania bazy danych. Ustrukturyzuj dane w sposób umożliwiający grupowanie zapisów w jedną operację w postaci aktualizacji wielościeżkowych za pomocą metod update()
w zestawach SDK lub żądań RESTful PATCH
.
Aby zoptymalizować strukturę danych i poprawić wydajność, postępuj zgodnie z najlepszymi praktykami dotyczącymi struktur danych .
Zapobiegaj nieautoryzowanemu dostępowi
Zapobiegaj nieautoryzowanym operacjom na bazie danych dzięki regułom bezpieczeństwa bazy danych Realtime. Na przykład użycie reguł pozwala uniknąć scenariusza, w którym złośliwy użytkownik wielokrotnie pobiera całą bazę danych.
Dowiedz się więcej o korzystaniu z reguł bazy danych czasu rzeczywistego Firebase .
Użyj reguł opartych na zapytaniach, aby ograniczyć pobieranie
Reguły bezpieczeństwa bazy danych w czasie rzeczywistym ograniczają dostęp do danych w bazie danych, ale mogą również służyć jako ograniczenia danych zwracanych w wyniku operacji odczytu. Kiedy używasz reguł opartych na zapytaniach, zdefiniowanych przez query.
wyrażenia takie jak query.limitToFirst
, zapytania pobierają tylko dane ograniczone regułą.
Na przykład poniższa 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 regułach bezpieczeństwa baz danych w czasie rzeczywistym .
Zapytania indeksowe
Indeksowanie danych zmniejsza całkowitą przepustowość wykorzystywaną przez każde zapytanie uruchamiane przez aplikację.
Wykorzystuj ponownie sesje SSL
Zmniejsz koszty ogólne szyfrowania SSL w przypadku wznowionych połączeń, wystawiając bilety sesji TLS . Jest to szczególnie przydatne, jeśli wymagane są częste i bezpieczne połączenia z bazą danych.
Popraw wydajność słuchacza
Umieść słuchaczy jak najdalej od ścieżki, aby ograniczyć ilość synchronizowanych danych. Twoi słuchacze powinni znajdować się blisko danych, które chcesz im uzyskać. 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 odbiornikó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, jeśli to możliwe, sortuj zapytania za pomocą orderByKey()
, aby uzyskać najlepszą wydajność. Sortowanie za pomocą orderByChild()
może być 6–8 razy wolniejsze, a sortowanie za pomocą orderByValue()
może być bardzo powolne w przypadku dużych zbiorów danych, ponieważ wymaga odczytu całej lokalizacji z warstwy trwałości.
Pamiętaj także o dynamicznym dodawaniu słuchaczy i usuwaniu ich, gdy nie są już potrzebni.
Wyczyść nieużywane dane
Okresowo usuwaj wszelkie nieużywane lub zduplikowane dane z bazy danych. Możesz uruchamiać kopie zapasowe , aby ręcznie sprawdzać swoje dane lub okresowo tworzyć ich kopie zapasowe w zasobniku Google Cloud Storage. Rozważ także hosting przechowywanych danych za pośrednictwem Cloud Storage dla Firebase .
Dostarczaj skalowalny kod, który możesz aktualizować
Aplikacje wbudowane w urządzenia IoT powinny zawierać skalowalny kod, który można łatwo aktualizować. Pamiętaj o dokładnym przetestowaniu przypadków użycia, uwzględnieniu scenariuszy, w których możesz wykładniczo powiększyć bazę użytkowników, i wbudowaniu możliwości wdrażania aktualizacji kodu. Dokładnie rozważ główne zmiany, które mogą być konieczne, jeśli na przykład zdecydujesz się na fragmentację danych.