Mengoptimalkan Performa Database

Ada beberapa cara untuk meningkatkan performa Firebase Realtime Database di aplikasi Anda. Guna mengetahui hal yang dapat Anda lakukan untuk mengoptimalkan performa Realtime Database, kumpulkan data menggunakan berbagai alat pemantauan Realtime Database, kemudian terapkan perubahan pada aplikasi atau penggunaan Realtime Database Anda.

Memantau performa Realtime Database

Anda dapat mengumpulkan data mengenai performa Realtime Database melalui sejumlah alat, tergantung pada tingkat perincian yang diperlukan:

  • Ringkasan tingkat tinggi: Gunakan alat profiler untuk melihat daftar kueri yang tidak diindeks dan ringkasan real-time operasi baca/tulis.
  • Estimasi penggunaan yang ditagihkan: Gunakan metrik penggunaan yang tersedia di Firebase console untuk melihat metrik performa tingkat tinggi dan penggunaan yang ditagihkan.
  • Tampilan data terperinci: Gunakan Cloud Monitoring untuk melihat tampilan yang lebih terperinci mengenai performa database Anda dari waktu ke waktu.

Meningkatkan performa berdasarkan metrik

Setelah mengumpulkan data, cobalah praktik terbaik dan strategi berikut berdasarkan area performa yang ingin Anda tingkatkan.

Ringkasan berbagai strategi peningkatan performa
Metrik Deskripsi Praktik terbaik
Beban/Penggunaan Optimalkan jumlah kapasitas database yang digunakan dalam pemrosesan permintaan, kapan pun hal itu dilakukan (tergambar dalam metrik **Load** atau **io/database_load**). Mengoptimalkan struktur data
Melakukan sharding data di seluruh database
Meningkatkan efisiensi pemroses
Membatasi download dengan aturan berbasis kueri
Mengoptimalkan koneksi
Koneksi aktif Seimbangkan jumlah koneksi simultan aktif dengan database Anda agar tetap berada di bawah batas 200.000 koneksi. Melakukan sharding data di seluruh database
Mengurangi koneksi baru
Bandwidth keluar Jika download dari database Anda terlihat lebih tinggi dari seharusnya, Anda dapat meningkatkan efisiensi operasi baca dan mengurangi jumlah overhead enkripsi. Mengoptimalkan koneksi
Mengoptimalkan struktur data
Membatasi download dengan aturan berbasis kueri
Menggunakan kembali sesi SSL
Meningkatkan efisiensi pemroses
Membatasi akses ke data
Penyimpanan Pastikan Anda tidak menyimpan data yang tidak digunakan atau seimbangkan data yang Anda simpan di semua database dan/atau produk Firebase lain agar tetap di bawah kuota. Membersihkan data yang tidak digunakan
Mengoptimalkan struktur data
Melakukan sharding data di seluruh database
Menggunakan Cloud Storage for Firebase

Mengoptimalkan koneksi

Permintaan RESTful, seperti GET dan PUT, masih memerlukan koneksi, meskipun koneksi tersebut tidak bertahan lama. Koneksi yang sering dan tidak lama ini dapat meningkatkan biaya koneksi, beban database, dan bandwidth keluar secara signifikan dibandingkan dengan koneksi real-time aktif ke database Anda.

Kapan pun memungkinkan, gunakan SDK native untuk platform aplikasi Anda, bukan REST API. SDK akan mempertahankan penggunaan koneksi bebas, sehingga mengurangi biaya enkripsi SSL dan beban database yang dapat bertambah di REST API.

Jika Anda menggunakan REST API, pertimbangkan menggunakan keep-alive HTTP agar tetap dapat menggunakan koneksi bebas atau menggunakan peristiwa yang dikirim server yang dapat mengurangi biaya handshake SSL.

Melakukan sharding data di lebih dari satu database

Membagi data di lebih dari satu instance Realtime Database, atau yang dikenal dengan sharding database, memiliki tiga keuntungan:

  1. Meningkatkan total koneksi simultan aktif yang diizinkan di aplikasi Anda dengan membaginya ke sejumlah instance database.
  2. Menyimbangkan beban di berbagai instance database.
  3. Jika Anda memiliki kelompok pengguna independen yang hanya perlu mengakses set data terpisah, gunakan instance database berbeda untuk menghasilkan throughput yang lebih tinggi dan latensi yang lebih rendah.

Jika Anda menggunakan paket harga Blaze, Anda dapat membuat beberapa instance database di project Firebase yang sama dengan menggunakan metode autentikasi pengguna yang sama di semua instance database.

Pelajari lebih lanjut cara dan kapan sharding data sebaiknya dilakukan.

Membuat struktur data yang efisien

Karena Realtime Database mengambil data dari node turunan suatu jalur dan dari jalur itu sendiri, pastikan struktur data Anda serata mungkin. Dengan demikian, Anda dapat mengambil data yang Anda perlukan secara selektif, tanpa perlu mendownload data yang tidak diperlukan oleh klien.

Khususnya, pertimbangkan operasi penulisan dan penghapusan saat Anda sedang membuat struktur data. Misalnya, jalur yang memiliki ribuan cabang berpotensi memerlukan biaya yang tinggi jika dihapus. Membaginya ke dalam beberapa jalur yang memiliki sub-hierarki dan lebih sedikit cabang per node bisa mempercepat penghapusan.

Selain itu, setiap penulisan bisa memakan hingga 0,1% dari total penggunaan database Anda. Atur struktur data dengan cara yang membuat Anda dapat mengelompokkan operasi tulis ke dalam satu operasi sebagai update multijalur melalui metode update() dalam permintaan PATCH RESTful atau SDK.

Untuk mengoptimalkan struktur data dan meningkatkan performa, ikuti praktik terbaik seputar struktur data.

Mencegah akses tanpa izin

Cegah operasi tanpa izin di database Anda dengan Aturan Keamanan Realtime Database. Misalnya, penggunaan aturan dapat menghindari skenario yang memungkinkan pengguna yang berbahaya mendownload seluruh database Anda berulang kali.

Pelajari lebih lanjut cara menggunakan Aturan Firebase Realtime Database.

Menggunakan aturan berbasis kueri untuk membatasi download

Aturan Keamanan Realtime Database membatasi akses ke data di database Anda, tetapi dapat pula berfungsi sebagai pembatas untuk data yang ditampilkan melalui operasi baca. Jika Anda menggunakan aturan berbasis kueri, seperti yang ditetapkan oleh ekspresi query. seperti query.limitToFirst, kueri hanya akan mengambil data yang dibatasi oleh aturan.

Misalnya, aturan berikut membatasi akses baca hanya untuk 1.000 hasil kueri pertama, yang diurutkan berdasarkan prioritas:

messages: {
  ".read": "query.orderByKey &&
            query.limitToFirst <= 1000"
}

// Example query:
db.ref("messages").limitToFirst(1000)
                  .orderByKey("value")

Pelajari Aturan Keamanan Realtime Database lebih lanjut.

Mengindeks kueri

Dengan mengindeks data, jumlah bandwidth yang digunakan setiap kueri yang dijalankan oleh aplikasi Anda akan berkurang.

Menggunakan kembali sesi SSL

Kurangi biaya overhead enkripsi SSL pada koneksi yang dilanjutkan dengan membuat tiket sesi TLS. Hal ini sangat membantu jika Anda memerlukan koneksi yang sering dan aman ke database.

Meningkatkan efisiensi pemroses

Letakkan pemroses Anda pada jalur sebawah mungkin agar Anda dapat membatasi jumlah data yang disinkronkan. Pemroses Anda harus dekat dengan data yang ingin didapatkan. Jangan letakkan pemroses di root database karena akan menyebabkan seluruh database Anda terdownload.

Tambahkan kueri untuk membatasi data yang dihasilkan oleh operasi pemrosesan, dan gunakan pemroses yang hanya mendownload pembaruan data — misalnya, on() bukan once(). Gunakan .once() hanya untuk tindakan yang benar-benar tidak memerlukan pembaruan data. Selain itu, urutkan kueri Anda menggunakan orderByKey() kapan pun memungkinkan demi mendapatkan performa terbaik. Pengurutan menggunakan orderByChild() bisa 6-8 kali lebih lambat, dan pengurutan dengan orderByValue() bisa sangat lambat untuk set data berukuran besar, karena memerlukan pembacaan seluruh lokasi dari lapisan persistensi.

Pastikan juga Anda menambahkan pemroses secara dinamis dan menghapusnya jika sudah tidak diperlukan.

Membersihkan data yang tidak terpakai

Hapus setiap data duplikat atau yang tidak terpakai secara berkala di database Anda. Anda dapat menjalankan pencadangan untuk memeriksa data secara manual atau melakukannya secara berkala ke bucket Google Cloud Storage. Pertimbangkan juga untuk menghosting data yang disimpan melalui Cloud Storage for Firebase.

Mengirimkan kode yang dapat diskalakan dan diperbarui

Aplikasi yang terpasang di perangkat IoT harus menyertakan kode yang dapat Anda skalakan dan ubah dengan mudah. Pastikan Anda menguji kasus penggunaan secara menyeluruh, memperhitungkan skenario berkembangnya basis pengguna Anda secara eksponensial, dan menyertakan kemampuan untuk men-deploy perubahan kode Anda. Pertimbangkan perubahan penting yang mungkin perlu Anda lakukan nanti, misalnya seandainya Anda memutuskan untuk melakukan sharding data.