Melakukan Penskalaan dengan Beberapa Database

Cara terbaik untuk mengoptimalkan performa dan menskalakan data Anda di Firebase Realtime Database adalah membagi data Anda ke beberapa instance Realtime Database, yang juga disebut sebagai sharding database. Sharding memberi Anda fleksibilitas untuk melakukan penskalaan di atas batas yang berlaku untuk instance database individual, serta 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 berlainan dan ingin mengoptimalkan performa (misalnya, aplikasi chat yang melayani beberapa kelompok pengguna terpisah dan independen).
  • Anda ingin menyeimbangkan beban di beberapa database guna meningkatkan 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 khusus aplikasi Anda.
  2. Buat beberapa instance database.
  3. Konfigurasikan 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 terhadap satu instance database. Realtime Database tidak mendukung kueri lintas instance database.
  • Tidak ada pembagian atau penggandaan data lintas instance database (atau pembagian atau penggandaan minimal).
  • Setiap instance aplikasi hanya terhubung ke satu database dalam satu waktu.

Saat memetakan data, pertimbangkan untuk menerapkan strategi berikut:

Membuat "sharding master"

Simpan peta mengenai cara data Anda disimpan di 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 dalam instance database terisolasi yang dikelompokkan menurut pengguna atau jenis data. Misalnya, jika mem-build 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 di semua database Anda, dan Anda hanya menjalankan kueri terhadap satu instance database. Selain itu, pengguna di setiap organisasi hanya terhubung ke database organisasi mereka saat menggunakan aplikasi chat.

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

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

Membuat beberapa instance Realtime Database

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

buat database di Firebase console dengan menu konteks di bagian database

  1. Di Firebase console, buka tab Data di bagian Develop > Database.
  2. Pilih Buat database baru dari menu di bagian Realtime Database.
  3. Sesuaikan Referensi database dan Aturan keamanan Anda, lalu klik Oke.

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

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

Mengedit dan men-deploy Aturan Realtime Database untuk setiap instance

Pastikan Anda telah menyiapkan Aturan 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 Aturan 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, dan 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.

Web versi 9

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 versi 8

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 app
var ref: DatabaseReference!

ref = Database.database().reference()
// Get a secondary database instance by 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];
// Get a secondary database instance by URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"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();

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

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.