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 ograniczenia, które obowiązują w przypadku 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 którykolwiek z tych warunków:
- Chcesz zwiększyć skalę ponad limit 200 tys. równoczesnych połączeń, 1000 operacji zapisu na sekundę lub inny limit 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 bezawaryjny i zmniejszyć ryzyko przeciążenia pojedynczej instancji bazy danych.
Jak dzielić dane
Aby podzielić dane, wykonaj te czynności (opisane bardziej szczegółowo poniżej):
- Mapuj dane na wiele baz danych zgodnie z potrzebami 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 przypadku instancji bazy danych (lub minimalne udostępnianie lub powielanie).
- Każda instancja aplikacji jest w danym momencie połączona tylko z 1 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 za pomocą kodu 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 konkretną instancją bazy danych, której potrzebujesz.
grupowanie danych według kategorii lub według klienta;
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 opisane powyżej warunki i strategie mogą pomóc Ci określić, co sprawdzi się w przypadku Twoich danych.
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 Tworzenie > 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 zapewniają odpowiedni dostęp 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ł w przypadku 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ł. 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ł w przypadku 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.
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);
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);
// Get the default database instance for an app// Pobieranie instancji bazy danych pomocniczej za pomocą adresu URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference() var ref: DatabaseReference!
ref = Database.database().reference()
// Get the default database instance for an app// Pobierz instancję bazy danych pomocniczej za pomocą adresu URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] reference]; @property (strong, nonatomic) FIRDatabaseReference *ref;
self.ref = [[FIRDatabase database] reference];
// 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
// 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órej 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"
Optymalizacja połączeń 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.