Saya perlu menulis sejumlah besar dokumen ke Firestore.
Apa cara tercepat untuk melakukan ini di Node.js?
sumber
Saya perlu menulis sejumlah besar dokumen ke Firestore.
Apa cara tercepat untuk melakukan ini di Node.js?
TL; DR: Cara tercepat untuk melakukan pembuatan tanggal massal di Firestore adalah dengan melakukan operasi penulisan individual secara paralel.
Menulis 1.000 dokumen ke Firestore membutuhkan:
~105.4s
saat menggunakan operasi tulis berurutan individual~ 2.8s
saat menggunakan (2) operasi penulisan batch~ 1.5s
saat menggunakan operasi tulis individu paralelAda tiga cara umum untuk melakukan sejumlah besar operasi penulisan di Firestore.
Kami akan menyelidiki masing-masing secara bergantian di bawah ini, menggunakan array data dokumen acak.
Ini adalah solusi yang paling sederhana:
async function testSequentialIndividualWrites(datas) {
while (datas.length) {
await collection.add(datas.shift());
}
}
Kami menulis setiap dokumen secara bergantian, sampai kami telah menulis setiap dokumen. Dan kami menunggu setiap operasi penulisan selesai sebelum memulai yang berikutnya.
Menulis 1.000 dokumen membutuhkan sekitar 105 detik dengan pendekatan ini, sehingga throughput sekitar 10 dokumen menulis per detik .
Ini adalah solusi paling kompleks.
async function testBatchedWrites(datas) {
let batch = admin.firestore().batch();
let count = 0;
while (datas.length) {
batch.set(collection.doc(Math.random().toString(36).substring(2, 15)), datas.shift());
if (++count >= 500 || !datas.length) {
await batch.commit();
batch = admin.firestore().batch();
count = 0;
}
}
}
Anda dapat melihat bahwa kami membuat BatchedWrite
objek dengan memanggil batch()
, mengisinya hingga kapasitas maksimumnya 500 dokumen, dan kemudian menulisnya ke Firestore. Kami memberikan setiap dokumen nama yang dihasilkan yang cenderung unik (cukup baik untuk pengujian ini).
Menulis 1.000 dokumen memakan waktu sekitar 2,8 detik dengan pendekatan ini, sehingga throughput kira-kira 357 dokumen menulis per detik .
Itu sedikit lebih cepat daripada dengan menulis individu berurutan. Faktanya: banyak pengembang menggunakan pendekatan ini karena mereka menganggap itu tercepat, tetapi karena hasil di atas sudah menunjukkan ini tidak benar. Dan kode sejauh ini yang paling kompleks, karena kendala ukuran pada batch.
Dokumentasi Firestore mengatakan ini tentang kinerja untuk menambahkan banyak data :
Untuk entri data massal, gunakan pustaka klien server dengan penulisan individual yang diparalelkan. Batched write berperforma lebih baik daripada penulisan berseri tetapi tidak lebih baik dari penulisan paralel.
Kita dapat mengujinya dengan kode ini:
async function testParallelIndividualWrites(datas) {
await Promise.all(datas.map((data) => collection.add(data)));
}
Kode ini memulai add
operasi secepat mungkin, dan kemudian digunakan Promise.all()
untuk menunggu sampai semuanya selesai. Dengan pendekatan ini operasi dapat berjalan secara paralel.
Menulis 1.000 dokumen membutuhkan waktu sekitar 1,5 detik dengan pendekatan ini, sehingga throughput kira-kira 667 dokumen menulis per detik .
Perbedaannya hampir tidak sehebat antara dua pendekatan pertama, tetapi masih lebih dari 1,8 kali lebih cepat dari batch yang menulis.
Beberapa catatan:
add()
tidak lebih dari menghasilkan ID unik (murni sisi klien), diikuti olehset()
operasi. Jadi hasilnya harus sama. Jika bukan itu yang Anda amati, kirimkan pertanyaan baru dengan case minimal yang mereproduksi apa yang telah Anda coba.