Melakukan Penskalaan dengan Beberapa Database

Cara terbaik untuk mengoptimalkan performa dan menskalakan data Anda di Firebase Realtime Database adalah membagi data Anda di beberapa instance Realtime Database, yang juga disebut sebagai database sharding. Dengan sharding, Anda memiliki fleksibilitas untuk melakukan penskalaan di atas batas yang berlaku untuk instance database individual, selain load balancing dan pengoptimalan performa.

Kapan sharding data perlu dilakukan

Sharding data ke beberapa database perlu dilakukan jika Anda menggunakan Realtime Database dan cocok dengan skenario berikut:

  • Anda ingin melakukan penskalaan melebihi 200.000 koneksi simultan, 1.000 operasi tulis/detik, atau batas lainnya untuk satu instance database.
  • Anda memiliki beberapa set data berbeda dan ingin mengoptimalkan performa (misalnya, aplikasi chat yang melayani beberapa kelompok pengguna terpisah dan independen).
  • Anda ingin menyeimbangkan beban di beberapa database untuk mengoptimalkan waktu beroperasi dan mengurangi risiko kelebihan beban pada satu instance database.

Cara melakukan sharding data

Untuk melakukan sharding data, ikuti langkah-langkah berikut (diuraikan secara lebih mendetail di bawah):

  1. Petakan data ke beberapa database sesuai dengan kebutuhan spesifik aplikasi Anda.
  2. Buat beberapa instance database.
  3. Konfigurasi aplikasi agar terhubung ke instance Realtime Database yang diperlukan untuk setiap set data.

Memetakan data Anda

Saat Anda memetakan data ke beberapa database, upayakan untuk memenuhi kondisi berikut:

  • Setiap kueri hanya dijalankan pada satu instance database. Realtime Database tidak mendukung kueri lintas instance database.
  • Data tidak dibagikan atau diduplikasi lintas instance database (atau dibagikan atau diduplikasi secara minimal).
  • Setiap instance aplikasi hanya terhubung ke satu database dalam satu waktu.

Saat memetakan data, pertimbangkan untuk menerapkan strategi berikut:

Membuat "sharding master"

Simpan catatan berisi bagaimana data Anda dipetakan ke berbagai instance database. Dengan cara ini, Anda dapat secara terprogram mencari instance database mana yang sesuai dengan klien yang terhubung. Ingatlah bahwa cara ini mungkin memerlukan lebih banyak overhead daripada menghubungkan langsung ke instance database tertentu yang Anda butuhkan, saat Anda membutuhkannya.

Mengelompokkan data dalam bucket menurut kategori atau pelanggan

Simpan data di instance database bersilo, dikelompokkan menurut pengguna atau jenis data. Misalnya, jika membangun aplikasi chat yang melayani beberapa organisasi, Anda dapat membuat satu instance database untuk setiap organisasi dan menyimpan semua data chat di instance database yang unik.

Dalam kasus ini, organisasi A dan organisasi B tidak berbagi data, tidak ada data duplikat dalam database, dan Anda hanya menjalankan kueri pada satu instance database. Selain itu, pengguna di setiap organisasi hanya terhubung ke database organisasi mereka saat menggunakan aplikasi chat.

Anda kemudian dapat membuat beberapa instance database di muka dan menggunakan ID organisasi untuk memetakan suatu tim ke instance database-nya. Misalnya, organisasi A dipetakan ke Realtime Database A.

Cara pemetaan data untuk aplikasi bergantung pada kasus penggunaan spesifik Anda, tetapi kondisi dan strategi yang diuraikan di atas dapat membantu menetapkan cara yang tepat untuk data Anda.

Membuat beberapa instance Realtime Database

Jika menggunakan paket harga Blaze, Anda dapat membuat hingga 1.000 instance database di project Firebase yang sama.

membuat database di Firebase console dengan menu konteks di bagian database

  1. Di Firebase console, buka tab Data di bagian Develop > Database.
  2. Pilih Create new database dari menu di bagian Realtime Database.
  3. Sesuaikan setelan di Database reference dan Security rules, lalu klik Got it.

Ulangi proses tersebut untuk membuat instance database sebanyak yang Anda butuhkan. Setiap instance database memiliki kumpulan Aturan Keamanan Firebase Realtime Database sendiri, sehingga Anda dapat menyesuaikan akses ke data Anda secara mendetail.

Anda dapat membuat dan mengelola instance database di Firebase console atau menggunakan Realtime Database Management REST API.

Mengedit dan men-deploy Aturan Keamanan Realtime Database untuk setiap instance

Pastikan Anda telah menyiapkan Aturan Keamanan Realtime Database untuk memberikan akses yang sesuai ke setiap instance database dalam project. Setiap database memiliki kumpulan aturan tersendiri yang dapat Anda edit dan deploy dari Firebase console, atau menggunakan Firebase CLI untuk men-deploy target.

  • Untuk mengedit dan men-deploy aturan dari Firebase console, ikuti langkah berikut:

    1. Buka tab Rules di bagian Develop > Database.
    2. Pilih database yang ingin Anda edit, lalu ubah aturannya.
  • Untuk mengedit dan men-deploy aturan dari Firebase CLI, ikuti langkah-langkah berikut:

    1. Ubah aturan dalam file aturan untuk instance database Anda (misalnya, foo.rules.json).
    2. Buat dan terapkan target deploy untuk mengaitkan database yang menggunakan file aturan yang sama. Contoh:
      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3
    3. Perbarui file konfigurasi firebase.json Anda dengan target deploy:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. Jalankan perintah deploy:

      firebase deploy

Pastikan Anda mengedit dan men-deploy aturan secara konsisten dari tempat yang sama. Men-deploy aturan dari Firebase CLI akan menggantikan semua pengeditan yang telah Anda buat di Firebase console. Sebaliknya, mengedit aturan secara langsung di Firebase console akan menggantikan perubahan terbaru yang telah Anda deploy melalui Firebase CLI.

Menghubungkan aplikasi Anda ke beberapa instance database

Gunakan referensi database untuk mengakses data yang tersimpan dalam instance database sekunder. Anda bisa mendapatkan referensi untuk instance database tertentu dengan URL atau aplikasi. Jika tidak menentukan URL, Anda akan mendapatkan referensi untuk instance database default aplikasi.

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

API dengan namespace 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
Catatan: Produk Firebase ini tidak tersedia di target App Clip.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Dapatkan instance database sekunder melalui URL var ref: DatabaseReference. ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
Catatan: Produk Firebase ini tidak tersedia di target App Clip.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Dapatkan instance database sekunder dengan URL @property (strong, nonatom) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"]]

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

Menentukan instance saat menggunakan Firebase CLI

Gunakan opsi --instance untuk menentukan Firebase Realtime Database yang Anda inginkan untuk mendapat penerapan perintah Firebase CLI. Misalnya, gunakan perintah berikut untuk menjalankan profiler untuk instance database bernama my-example-shard.firebaseio.com:

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

Mengoptimalkan koneksi di setiap database

Jika setiap klien perlu terhubung ke beberapa database dalam satu sesi, Anda dapat mengurangi jumlah koneksi simultan ke setiap instance database dengan terhubung ke setiap instance database hanya selama diperlukan.

Mendapatkan saran lainnya

Jika butuh bantuan sharding data lebih lanjut di beberapa instance database, hubungi pakar Firebase melalui saluran Slack atau Stack Overflow.