Skalowanie z wieloma bazami danych

Najlepszym sposobem na optymalizację wydajności i skalowanie danych w Bazie danych czasu rzeczywistego Firebase jest podział danych między wiele instancji Bazy danych czasu rzeczywistego, co jest nazywane fragmentacją bazy danych. Fragmentacja umożliwia skalowanie poza limity obowiązujące w poszczególnych instancjach bazy danych, a także z równoważeniem obciążenia i optymalizacją wydajności.

Kiedy należy dzielić dane na fragmenty

Jeśli korzystasz z Bazy danych czasu rzeczywistego, możesz podzielić dane na kilka baz danych i spełnić któryś z tych scenariuszy:

  • chcesz przeskalować poza limit 200 tys. jednoczesnych połączeń, 1000 operacji zapisu na sekundę lub dowolny inny limit dla pojedynczej instancji bazy danych.
  • Masz wiele odrębnych zbiorów danych i chcesz zoptymalizować wydajność (np. komunikator, który obsługuje osobne, niezależne grupy użytkowników).
  • Chcesz równoważyć obciążenie wielu baz danych, aby skrócić czas działania i zmniejszyć 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 instancją Bazy danych czasu rzeczywistego niezbędną dla każdego zbioru danych.

Mapowanie danych

Gdy mapujesz dane do wielu baz danych, spróbuj spełnić te 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 i powielania danych między instancjami bazy danych (lub minimalne 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ę przechowywania danych w instancjach baz danych. W ten sposób możesz programowo wyszukać instancję bazy danych odpowiadającą łączącemu klienta. Pamiętaj, że może to wiązać się z większym nakładem pracy niż bezpośrednie łączenie się z konkretną instancją bazy danych, gdy jest to potrzebne.

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 z nich i przechowywać wszystkie dane czatu w unikalnych instancjach bazy danych.

W tym przypadku organizacja A i organizacja B nie współdzielą danych, w bazach danych nie ma żadnych zduplikowanych danych, a zapytania wykonujesz tylko w odniesieniu do jednej instancji bazy danych. Dodatkowo użytkownicy w każdej organizacji łączą się z bazą danych organizacji tylko wtedy, gdy używają aplikacji do obsługi czatu.

Następnie możesz utworzyć kilka instancji bazy danych z wyprzedzeniem i użyć identyfikatora organizacji do mapowania zespołu na jej instancję bazy danych. Na przykład organizacja A mapuje ją na Bazę danych czasu rzeczywistego A.

Sposób mapowania danych 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 Bazy danych czasu rzeczywistego

Jeśli korzystasz z abonamentu Blaze, możesz utworzyć maksymalnie 1000 instancji 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 w sekcji 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żda instancja bazy danych ma własny zestaw reguł zabezpieczeń Bazy danych czasu rzeczywistego Firebase, co pozwala precyzyjnie dostosować dostęp do danych.

Możesz tworzyć instancje bazy danych i zarządzać nimi w konsoli Firebase lub za pomocą interfejsu API typu REST zarządzania bazą danych czasu rzeczywistego.

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

Sprawdź, czy reguły zabezpieczeń Bazy danych czasu rzeczywistego 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ć z poziomu konsoli Firebase lub za pomocą interfejsu wiersza poleceń Firebase do wdrażania celów.

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

    1. Otwórz kartę 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ł. 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. Wdrożenie reguł z poziomu wiersza poleceń Firebase zastępuje wszystkie zmiany wprowadzone w konsoli Firebase, a edytowanie reguł bezpośrednio w konsoli Firebase zastępuje wszystkie ostatnie zmiany wprowadzone 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źć z adresu URL lub z aplikacji. Jeśli nie podasz adresu URL, otrzymasz odwołanie do domyślnej instancji bazy danych aplikacji.

Web Modular API

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);

Interfejs API internetowej przestrzeni nazw

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 według 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];
// Pobierz dodatkową instancję bazy danych za pomocą 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ć, do której Bazy danych czasu rzeczywistego Firebase chcesz zastosować polecenie interfejsu wiersza poleceń Firebase. Na przykład za pomocą tego polecenia uruchom 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 łączyć się z wieloma bazami danych podczas jednej sesji, możesz zmniejszyć liczbę jednoczesnych połączeń z każdą instancją bazy danych, łącząc się z poszczególnymi instancjami bazy danych na tak długo, jak jest to konieczne.

Więcej porad

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