The Firestore JOIN Trap
Anda menghadapi masalah Firestore yang biasa. Fungsi Firebase anda mengeluarkan ralat saiz kelompok (batch size) maksimum. Anda perlu menggabungkan (join) pesanan dan pelanggan untuk papan pemuka (dashboard). Anda biasanya menduplikasi data untuk membetulkannya. Tetapi kini data anda sudah lapuk dan tidak konsisten.
Google telah mengumumkan Pipelines API untuk menyelesaikan masalah ini. Ia membolehkan operasi JOIN merentasi koleksi tanpa menduplikasi data. Sesetengah pembangun melaporkan masa pertanyaan (query) yang pantas dalam ujian berskala kecil.
Saya meluangkan masa seminggu menguji API ini di bawah bebanan berat. Inilah perkara yang tidak diberitahu oleh dokumentasi kepada anda.
Kos Tinggi Setiap pelaksanaan pipeline membaca daripada semua koleksi yang terlibat. Satu JOIN antara dua koleksi akan mengenakan caj bacaan untuk kedua-duanya. Jika anda menggabungkan dua koleksi yang mengandungi 50,000 dokumen, kos anda akan meningkat dengan tidak efisien. Ia bukan sekadar kos linear yang mudah.
Had Prestasi Dalam ujian saya, satu pipeline terhadap 10,000 dokumen mengambil masa 380ms. Apabila saya menguji 100,000 dokumen, pertanyaan tersebut mengalami masa tamat (timeout) pada saat ke-30. Anda tidak menyelesaikan masalah tersebut. Anda hanya menukarkan ralat kelompok (batch error) kepada ralat masa tamat (timeout error).
Isu Cold Start Pipelines mencipta konteks pelaksanaan yang berasingan. Dalam persekitaran tanpa pelayan (serverless) seperti Cloud Functions, ini menambah kelewatan selama 2 hingga 4 saat. Pengguna anda akan menyangka aplikasi anda perlahan.
Pipelines API adalah alat untuk prototaip atau koleksi kecil di bawah 5,000 dokumen. Ia bukan pengganti kepada pangkalan data hubungan (relational database). Google menyediakan ini untuk membantu anda kekal dalam ekosistem Firebase daripada berpindah ke PostgreSQL atau Spanner.
Jika anda menggunakan Pipelines, ikut peraturan ini:
• Audit saiz koleksi anda. Jika koleksi melebihi 20,000 dokumen, kira kos JOIN terlebih dahulu. • Hadkan kerumitan. JOIN merentasi tiga atau lebih koleksi adalah petanda buruk. • Jejaki kos bacaan setiap minggu. Bacaan Pipeline muncul secara berbeza pada bil anda. • Kekalkan data denormalized anda. Gunakan Pipelines sebagai tambahan, bukan pengganti sepenuhnya. • Uji dengan trafik sebenar. Penanda aras (benchmarks) pada koleksi yang sunyi tidak mencerminkan realiti produksi.
Jangan gunakan penyelesaian sementara (band-aid) untuk mengelakkan keputusan seni bina (architectural decision) yang sebenar.
Bagaimanakah anda mengendalikan hubungan dalam Firestore? Adakah anda menggunakan denormalization atau client-side joins? Beritahu saya di ruangan komen.
