Node.js + MongoDB: Kinerja Transaksi

“Terkadang kami membayar paling tinggi untuk apa yang kami dapatkan secara gratis.” - A. Einstein


MongoDB 4+ baru-baru ini memperkenalkan dukungan untuk transaksi multi-dokumen.



Dan karena proyek kami baru saja bermigrasi ke versi 4.2, pertanyaan tentu saja muncul:



  • Apa yang akan terjadi dengan pertunjukan?
  • Seberapa banyak operasi akan melambat?
  • Apakah kita bersedia mengorbankan kecepatan demi (setidaknya beberapa) ketepatan?


Saat mempelajari dokumentasi dan Internet, pertanyaan hanya bertambah:



  • Apakah semua operasi akan diperlambat oleh transaksi?
  • Berapa kombinasi operasi akan melambat?


Mari kita coba cari tahu.



Untuk mengklaim setidaknya sebagian kecil dari kebenaran, Anda harus bekerja sedikit.



Untuk memudahkan persepsi, saya akan membagi implementasi menjadi 3 langkah:



  1. Pemilihan alat
  2. Deskripsi kombinasi operasi dan memperoleh hasil
  3. Analisis hasil


Sekarang tentang setiap langkah secara terpisah.



Pilihan alat:



  1. Uji MongoDB (replika dengan jumlah minimum proses mongod) dan driver untuknya: mongodb-memory-server , mongodb diperlukan .
  2. Untuk kemudahan mengukur waktu, saya memilih modul "mikrodetik"
  3. : ttest, stdlib.


Deskripsi kombinasi operasi dan memperoleh hasil: Kami



mengimplementasikan setiap (dari utama) operasi terpisah insertOne, updateOne, deleteOne, findOne, insertMany * updateMany * deleteMany * find * dan kombinasinya insertOne + updateOne + deleteOne, insertOne + updateOne + deleteOne + findOne, insertMany * + updateMany * + deleteMany * insertMany * + updateMany * + deleteMany * + find * dengan, dan tanpa menggunakan transaksi.



Ukur waktu untuk menyelesaikan setiap operasi.



Misalnya - insertMany + updateMany + deleteMany dengan, dan tanpa transaksi











Setiap operasi / pengukuran akan diulangi 300 kali (untuk analisis kita akan menggunakan 100 hasil "di tengah", yaitu, dari 101 hingga 200) ** - sebut saja "mikroiterasi" (dengan iterasi operasi atau kombinasi individu).



Sekarang, terus-menerus mengubah urutannya, kami akan melakukan 100 "makroiterasi" (1 "makroiterasi" = jumlah total "mikroiterasi" * 300) *

* jumlah 300 dipilih secara empiris

** untuk informasi lebih lengkap tentang penerapannya, saya mengundang Anda untuk mengunjungi repositori github (tautan di bawah dalam teks)



Analisis hasil:



Sebagai hasil dari semua iterasi, didapatkan 20.000 pengukuran untuk setiap operasi dan kombinasi operasi (10.000 menggunakan transaksi, 10.000 - tanpa) dalam bentuk array.







Selanjutnya, kita perlu melakukan beberapa perhitungan.



Hasil panen yang jelas berada di luar sampel







Hitung rata-rata







Hitung simpangan baku







Tentukan adanya perbedaan yang signifikan secara statistik antara sampel menggunakan uji-t (konfirmasi atau sanggahan dari hipotesis nol)







Menggunakan grafik sederhana, kami memvisualisasikan hasil. Misalnya, mari kita gunakan kombinasi insertMany + updateMany + deleteMany dan insertOne secara terpisah (semua hasil lainnya akan disajikan dalam format teks di bagian "Kesimpulan"). Hasilnya, file html yang dihasilkan berisi grafik yang namanya sesuai dengan nama operasi atau kombinasi operasi (iterasi non-transaksional ditunjukkan dengan warna biru kehijauan, dan transaksional dalam warna oranye). "Apakah signifikan secara statistik" (benar / salah) memberi tahu apakah ada perbedaan yang signifikan secara statistik sama sekali. Yang lainnya masing-masing adalah nilai absolut dan relatif dalam mikrodetik dan persentase.











Kesimpulan:



  1. : insertMany + updateMany + deleteMany ( )
  2. ( 7%): updateMany, find, insertOne + updateOne + deleteOne + findOne, insertMany + updateMany + deleteMany + find
  3. , (91%): updateOne, deleteMany, findOne
  4. ( 197% 792%): insertOne, insertMany, deleteOne, insertOne + updateOne + deleteOne


Untuk informasi lebih lanjut dan kemampuan untuk menguji hasil dengan menjalankan skrip sendiri, kunjungi github .



Terima kasih sudah membaca.



Silahkan berkomentar, semoga ada pembahasan yang bagus.



Atau, Anda dapat menjalankan semuanya sendiri dan mendapatkan hasil Anda sendiri. Keren membandingkannya.



Tautan yang berguna:

medium.com/cashpositive/the-hitchhikers-guide-to-mongodb-transactions-with-mongoose-5bf8a6e22033

blog.yugabyte.com/are-mongodb-acid-transactions-ready-for-high-

media aplikasi kinerja.com/@Alibaba_Cloud/multi-document-transactions-on-mongodb-4-0-eebd662ac237

www.mongodb.com/blog/post/mongodb-multi-document-acid-transactions-general-availability

docs.mongodb.com/manual/core/write-operations-atomicity

www.dbta.com/Columns/MongoDB-Matters/Limitations-in-MongoDB-Transactions-127057.aspx

dzone.com/articles/multi-document-transactions-on-mongodb-40

www.dbta.com/Columns/MongoDB-Matters/MongoDB-Transactions-In-Depth-125890.aspx

www.codementor.io/@christkv/mongodb-transactions-vs-two-phase-commit-u6blq7465

docs.mongodb.com/manual/core/read-isolation-consistency-recency

mathworld.wolfram.com/Outlier.html

support.minitab.com/en-us/minitab-express/1/help-and-how-to/basic-statistics/inference/how-to/two-samples/2-sample-t/interpret-the-results/key-results



All Articles