Najlepszym sposobem na optymalizację skuteczności i skalowanie danych w usłudze Firebase Realtime Database jest podzielenie danych na wiele instancji Realtime Database, co nazywamy dzieleniem bazy danych. Dzielenie na fragmenty daje Ci elastyczność w skalowaniu poza ograniczeniami, które dotyczą poszczególnych instancji bazy danych, a także równoważenie obciążenia i optymalizację wydajności.
Kiedy dzielić dane
Jeśli używasz Realtime Database, możesz podzielić dane na kilka baz danych, jeśli spełniasz jeden z tych warunków:
- Chcesz zwiększyć skalę ponad limit 200 tys. jednoczesnych połączeń, 1000 operacji zapisu na sekundę lub inne limity dla pojedynczej instancji bazy danych.
- Masz kilka oddzielnych zbiorów danych i chcesz zoptymalizować wydajność (np. aplikacja do czatu, która obsługuje oddzielne, niezależne grupy użytkowników).
- Chcesz wyrównać obciążenie w wielu bazach danych, aby zwiększyć czas działania i zmniejszyć ryzyko przeciążenia pojedynczej instancji bazy danych.
Jak dzielić dane
Aby podzielić dane, wykonaj te czynności (opisane poniżej):
- Mapuj dane na wiele baz danych odpowiednio do potrzeb aplikacji.
- tworzyć wiele instancji bazy danych.
- Skonfiguruj aplikację tak, aby łączyła się z instancją Realtime Database wymaganą dla każdego zbioru danych.
Mapowanie danych
Podczas mapowania danych na wiele baz danych staraj się spełnić te warunki:
- Każde zapytanie jest wykonywane tylko w jednym wystąpieniu bazy danych. Realtime Database nie obsługuje zapytań w przypadku instancji bazy danych.
- Brak udostępniania ani powielania danych w różnych instancjach bazy danych (lub minimalne udostępnianie lub powielanie).
- Każda instancja aplikacji jest w danym momencie połączona tylko z jedną bazą danych.
Podczas mapowania danych możesz zastosować te strategie:
Utwórz „master shard”.
przechowywać mapę sposobu przechowywania danych w różnych instancjach bazy danych; Dzięki temu możesz programowo sprawdzić, która instancja bazy danych odpowiada klientowi nawiązującemu połączenie. Pamiętaj, że może to wymagać więcej zasobów niż bezpośrednie połączenie z poszczególnymi instancjami bazy danych, których potrzebujesz.
grupowanie danych według kategorii lub klientów;
przechowywać dane w oddzielonych od siebie instancjach baz danych pogrupowanych według użytkownika lub typu danych; Jeśli na przykład tworzysz aplikację do czatu, która obsługuje wiele organizacji, możesz utworzyć instancję bazy danych dla każdej organizacji i przechowywać wszystkie dane czatu w unikajnych instancjach baz danych.
W tym przypadku organizacja A i organizacja B nie udostępniają sobie danych, w bazach danych nie ma żadnych duplikatów danych, a zapytania są wykonywane tylko w jednej instancji bazy danych. Dodatkowo użytkownicy każdej organizacji łączą się z bazą danych organizacji tylko wtedy, gdy korzystają z aplikacji do czatu.
Możesz wtedy utworzyć kilka instancji bazy danych z wyprzedzeniem i za pomocą identyfikatora organizacji przypisać zespół do jego instancji bazy danych. Na przykład organizacja A jest mapowana na bazę danych czatu w czasie rzeczywistym A.
Sposób mapowania danych w aplikacji zależy od konkretnego przypadku użycia, ale warunki i strategie opisane powyżej mogą pomóc Ci określić, co sprawdzi się w Twoim przypadku.
Tworzenie wielu instancji Realtime Database
Jeśli korzystasz z abonamentu Blaze, możesz utworzyć w tym samym projekcie Firebase maksymalnie 1000 instancji bazy danych.
Konsola Firebase z menu kontekstowym w sekcji baz danych />
- W konsoli Firebase otwórz kartę Dane w sekcji Rozwijanie > Baza danych.
- W menu w sekcji Realtime Database wybierz Utwórz nową bazę danych.
- Spersonalizuj odniesienie do bazy danych i reguły zabezpieczeń, a potem kliknij Gotowe.
Powtórz ten proces, aby utworzyć dowolną liczbę instancji bazy danych. Każda instancja bazy danych ma własny zestaw Firebase Realtime Database Security Rules, dzięki czemu możesz precyzyjnie dostosować dostęp do danych.
Istniejące instancje bazy danych możesz tworzyć i zarządzać nimi w konsoli Firebase lub za pomocą interfejsu API REST do zarządzania bazą danych w czasie rzeczywistym.
Edytuj i wdróż Realtime Database Security Rules dla każdej instancji.
Upewnij się, że Realtime Database Security Rules mają odpowiednie uprawnienia do każdej instancji bazy danych w projekcie. Każda baza danych ma własny zestaw reguł, które możesz edytować i wdrażać w konsoli Firebase lub za pomocą interfejsu wiersza poleceń Firebase do wdrażania celów.
Aby edytować i wdrażać reguły w konsoli Firebase:
- W sekcji Tworzenie > Baza danych kliknij kartę Reguły.
- Wybierz bazę danych, którą chcesz edytować, a potem zmień reguły.
Aby edytować i wdrażać reguły z poziomu interfejsu wiersza poleceń Firebase:
- Zmień reguły w plikach reguł dla instancji bazy danych (np.
foo.rules.json
). - Utwórz i zastosuj cele wdrażania, aby powiązać bazy danych, które korzystają z tego samego pliku reguł. Na przykład:
firebase target:apply database main my-db-1 my-db-2
firebase target:apply database other my-other-db-3
Zaktualizuj plik konfiguracji
firebase.json
, podając cele wdrożenia:{ "database": [ {"target": "main", "rules": "foo.rules.json"}, {"target": "other", "rules": "bar.rules.json"} ] }
Uruchom polecenie wdrażania:
firebase deploy
- Zmień reguły w plikach reguł dla instancji bazy danych (np.
Pamiętaj, aby zawsze edytować i wdrażać reguły z tego samego miejsca. Wdrażanie reguł z interfejsu wiersza poleceń Firebase zastępuje wszelkie zmiany wprowadzone w konsoli Firebase, a edytowanie reguł bezpośrednio w konsoli Firebase zastępuje wszelkie niedawne zmiany wdrożone za pomocą interfejsu wiersza poleceń Firebase.
Łączenie aplikacji z wieloma instancjami bazy danych
Użyj odwołania do bazy danych, aby uzyskać dostęp do danych przechowywanych w dodatkowych instancjach baz danych. Możesz uzyskać odwołanie do konkretnego wystąpienia bazy danych za pomocą adresu URL lub aplikacji. Jeśli nie podasz adresu URL, otrzymasz odwołanie do domyślnego wystąpienia bazy danych aplikacji.
Web
import { initializeApp } from "firebase/app"; import { getDatabase } from "firebase/database"; const app1 = initializeApp({ databaseURL: "https://testapp-1234-1.firebaseio.com" }); const app2 = initializeApp({ databaseURL: "https://testapp-1234-2.firebaseio.com" }, 'app2'); // Get the default database instance for an app1 const database1 = getDatabase(app1); // Get a database instance for app2 const database2 = getDatabase(app2);
Web
const app1 = firebase.initializeApp({ databaseURL: "https://testapp-1234-1.firebaseio.com" }); const app2 = firebase.initializeApp({ databaseURL: "https://testapp-1234-2.firebaseio.com" }, 'app2'); // Get the default database instance for an app1 var database1 = firebase.database(); // Get a database instance for app2 var database2 = firebase.database(app2);
Swift
// Get the default database instance for an appvar ref: DatabaseReference! ref = Database.database().reference()// Pobieranie instancji bazy danych pomocniczej z adresu URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
// Get the default database instance for an app@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];// Pobierz instancję bazy danych pomocniczej za pomocą adresu URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] reference];
Kotlin+KTX
// Get the default database instance for an app val primary = Firebase.database.reference // Get a secondary database instance by URL val secondary = Firebase.database("https://testapp-1234.firebaseio.com").reference
Java
// Get the default database instance for an app DatabaseReference primary = FirebaseDatabase.getInstance() .getReference(); // Get a secondary database instance by URL DatabaseReference secondary = FirebaseDatabase.getInstance("https://testapp-1234.firebaseio.com") .getReference();
Określanie instancji podczas korzystania z wiersza poleceń Firebase
Użyj opcji --instance
, aby określić, do którego Firebase Realtime Database ma zostać zastosowane polecenie wiersza poleceń Firebase. Aby na przykład uruchomić profilator dla instancji bazy danych o nazwie my-example-shard.firebaseio.com
, użyj tego polecenia:
firebase database:profile --instance "my-example-shard"
Optymalizuj połączenia w poszczególnych bazach danych
Jeśli każdy klient musi łączyć się z kilkoma bazami danych podczas sesji, możesz zmniejszyć liczbę jednoczesnych połączeń z każdą instancją bazy danych, łącząc się z każdą z nich tylko przez czas niezbędny.
Więcej wskazówek
Jeśli potrzebujesz dodatkowej pomocy w podziale danych na wiele instancji baz danych, skontaktuj się z ekspertami Firebase na naszym kanale Slack lub na Stack Overflow.