Skalowanie z wieloma bazami danych

Najlepszy sposób na optymalizację wydajności i skalowanie danych w Bazie danych czasu rzeczywistego Firebase jest podzielenie danych na wiele instancji Bazy danych czasu rzeczywistego, nazywanych również fragmentacji bazy danych. Fragmentacja zapewnia elastyczność, która umożliwia skalowanie poza limity mające zastosowanie do poszczególnych baz danych równoważenie obciążenia i optymalizację wydajności.

Kiedy należy dzielić dane na fragmenty

Podzielenie danych na wiele baz danych może być przydatne, jeśli korzystasz w bazie danych czasu rzeczywistego, która pasuje do dowolnego z tych scenariuszy:

  • chcesz przeskalować poza limit 200 000 jednoczesnych połączeń, 1000 operacji zapisu na sekundę lub dowolna inna limity pojedynczej instancji bazy danych.
  • Masz wiele odrębnych zbiorów danych i chcesz zoptymalizować skuteczność (np. komunikatora, który obsługuje osobne, niezależne grupy użytkowników).
  • chcesz równoważyć obciążenie w różnych bazach danych, aby poprawić czas działania zmniejsza ryzyko przeciążenia pojedynczej instancji bazy danych.

Jak podzielić dane

Aby podzielić dane, wykonaj te czynności (opisane szczegółowo poniżej):

  1. Mapowanie danych do wielu baz danych odpowiednio do konkretnych potrzeb aplikacji.
  2. Utwórz wiele instancji bazy danych.
  3. Skonfiguruj aplikację tak, aby łączyła się z niezbędną instancją Bazy danych czasu rzeczywistego dla każdego zbioru danych.

Mapowanie danych

Gdy mapujesz dane na wiele baz danych, spróbuj spełnić kryteria następujące warunki:

  • Każde zapytanie jest uruchamiane tylko na 1 instancji bazy danych. Baza danych czasu rzeczywistego nie obsługuje zapytań między instancjami bazy danych.
  • Brak udostępniania lub duplikowania danych między instancjami bazy danych (lub ograniczyć udostępnianie i duplikowanie).
  • Każda instancja aplikacji łączy się w danym momencie tylko z 1 bazą danych.

Podczas mapowania danych możesz zastosować następujące strategie:

Utwórz „fragment główny”

Przechowuj mapę sposobu przechowywania danych w instancjach baz danych. Dzięki temu możesz automatycznie wyszukać bazę danych instancji odpowiada łączącemu klientowi. Pamiętaj, że może to spowodować jest większy niż w przypadku bezpośredniego łączenia się z konkretną bazą danych. w odpowiednim momencie.

Grupowanie danych według kategorii lub klientów

Przechowuj dane w odizolowanych instancjach bazy danych pogrupowanych według użytkownika lub typu danych. Jeśli na przykład tworzysz aplikację czatu, która obsługuje wiele organizacji, możesz utworzyć instancję bazy danych dla każdej organizacji i przechowywać w unikalnych instancjach bazy danych.

W tym przypadku organizacja A i organizacja B nie udostępniają danych, więc powielonych danych w bazach danych, a zapytania wykonujesz tylko w odniesieniu do z jedną instancją bazy danych. Oprócz tego tylko użytkownicy z każdej organizacji połączyć się z bazą danych organizacji podczas korzystania z aplikacji do obsługi czatu.

Możesz potem utworzyć kilka instancji bazy danych wcześniej i używać identyfikatora organizacji, aby zmapować zespół na jej instancję bazy danych. Przykład: organizacja A mapuje się na Bazę danych czasu rzeczywistego A.

Sposób mapowania danych aplikacji zależy od konkretnego przypadku użycia, opisane powyżej warunki i strategie pomogą Ci określić, i skalowalnych danych.

Tworzenie wielu instancji Bazy danych czasu rzeczywistego

Jeśli masz abonament Blaze, możesz utworzyć maksymalnie 1000 w instancjach baz danych w tym samym projekcie Firebase.

Utwórz bazę danych w konsoli Firebase, korzystając z menu kontekstowego w sekcji Bazy danych

  1. W konsoli Firebase otwórz kartę Dane Programowanie > Baza danych .
  2. Wybierz Utwórz nową bazę danych w menu w sekcji Baza danych czasu rzeczywistego.
  3. Dostosuj odniesienie do bazy danych i Reguły zabezpieczeń, a następnie kliknij OK .

Powtórz ten proces, aby utworzyć tyle instancji bazy danych, ile potrzebujesz. Każdy instancja bazy danych ma własny zestaw reguł zabezpieczeń Bazy danych czasu rzeczywistego Firebase, dzięki czemu możesz by precyzyjniej dostosowywać dostęp do swoich danych.

Możesz tworzyć instancje bazy danych i zarządzać nimi w konsoli Firebase lub za pomocą Interfejs Realtime Database Management API.

Edytuj i wdrażaj reguły zabezpieczeń bazy danych czasu rzeczywistego dla każdej instancji

Upewnij się, że reguły zabezpieczeń Bazy danych czasu rzeczywistego zezwalają na odpowiedni dostęp do każdego instancję bazy danych w projekcie. Każda baza danych ma własny zestaw reguł, które możesz edytować i wdrożyć z poziomu konsoli Firebase. Do wdrażania celów przy użyciu interfejsu wiersza poleceń Firebase.

  • Aby edytować i wdrażać reguły w konsoli Firebase, wykonaj te czynności:

    1. Przejdź do Karta Reguły w sekcji Programowanie > Baza danych.
    2. Wybierz bazę danych, którą chcesz edytować, a następnie zmodyfikuj reguły.
  • Aby edytować i wdrażać reguły z poziomu interfejsu wiersza poleceń Firebase:

    1. Zmodyfikuj reguły w plikach reguł dla instancji bazy danych (np. foo.rules.json).
    2. Utwórz i zastosuj cele wdrożenia w celu powiązania baz danych, które używają 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
    3. Umieść w pliku konfiguracji firebase.json miejsca docelowe wdrożenia:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. Uruchom polecenie wdrożenia:

      firebase deploy

Pamiętaj, aby konsekwentnie edytować i wdrażać reguły w tym samym miejscu. Wdrażam z wiersza poleceń Firebase zastępuje wszystkie zmiany wprowadzone w konsoli Firebase i edytowanie reguł bezpośrednio w konsoli Firebase, zastępuje wszystkie ostatnie zmiany wdrożone za pomocą interfejsu wiersza poleceń Firebase.

Łączenie aplikacji z wieloma instancjami bazy danych

Za pomocą odwołania do bazy danych możesz uzyskać dostęp do danych przechowywanych w dodatkowych instancjach bazy danych. Odwołanie do konkretnej instancji bazy danych możesz znaleźć według adresu URL lub aplikacji. Jeśli nie podasz adresu URL, otrzymasz domyślnej instancji bazy danych.

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
Uwaga: ta usługa Firebase nie jest dostępna w celu wycinka aplikacji.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Pobranie dodatkowej instancji bazy danych z adresu URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
.
Objective-C
Uwaga: ta usługa Firebase nie jest dostępna w celu wycinka aplikacji.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Pobranie dodatkowej instancji bazy danych z adresu URL @property (silna, nieatomowa) 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();

Jeśli używasz interfejsu wiersza poleceń Firebase, oznacz instancję

Użyj opcji --instance, aby określić, która Baza danych czasu rzeczywistego Firebase ma być używana po zastosowaniu polecenia interfejsu wiersza poleceń Firebase. Na przykład do uruchomienia możesz użyć tego polecenia program profilujący dla instancji bazy danych o nazwie my-example-shard.firebaseio.com:

firebase database:profile --instance "my-example-shard"

Zoptymalizuj połączenia w każdej bazie danych

Jeśli każdy klient musi połączyć się z wieloma bazami danych podczas sesji, możesz zmniejsz liczbę jednoczesnych połączeń z każdą instancją bazy danych o łączyć się z każdą instancją bazy danych tylko tak długo, jak to konieczne.

Więcej porad

Jeśli potrzebujesz pomocy w dzieleniu danych na wiele instancji bazy danych, skontaktuj się z ekspertami Firebase na Kanał na Slacku lub na stronie Stack Overflow.