Node.js + MongoDB:トランザクションパフォーマンス

「無料で手に入るものに最もお金を払うこともあります。」-A。アインシュタイン


MongoDB 4+は最近、マルチドキュメントトランザクションのサポートを導入しました。



そして、私たちのプロジェクトがバージョン4.2に移行したばかりなので、当然のことながら疑問が生じました。



  • パフォーマンスはどうなりますか?
  • 操作はどのくらい遅くなりますか?
  • (少なくともある程度の)正確さのために速度を犠牲にしても構わないと思いますか?


ドキュメントとインターネットを研究するとき、質問は増加しただけでした:



  • トランザクションによってすべての操作が遅くなりますか?
  • 操作の組み合わせはどのくらい遅くなりますか?


調べてみましょう。



真実の少なくともいくらかのわずかなシェアを主張するために、あなたは少し働かなければなりません。



わかりやすくするために、実装を3つのステップに分けます。



  1. ツールの選択
  2. 操作の組み合わせと結果の取得の説明
  3. 結果の分析


次に、各ステップについて個別に説明します。



ツールの選択:



  1. テストMongoDB(mongodプロセスの数が最小のレプリカ)とそのドライバー:mongodb-memory-servermongodbが必要です
  2. 時間を測定しやすくするために、「マイクロ秒」モジュールを選択しました
  3. : ttest, stdlib.


操作の組み合わせと結果の取得の説明:(



メインの)個別の操作insertOne、updateOne、deleteOne、findOne、insertMany * updateMany * deleteMany * find *とそれらの組み合わせのそれぞれを実装しますinsertOne + updateOne + deleteOne、insertOne + updateOne + deleteOne + findOne、insertMany * + updateMany * + deleteMany * insertMany * + updateMany * + deleteMany * + find *トランザクションを使用する場合と使用しない場合。



各操作を完了するまでの時間を測定します。



例-insertMany + updateMany + deleteManyトランザクションあり、トランザクションなし











各操作/測定は300回繰り返されます(分析では、「中間」、つまり101番目から200番目までの100件の結果を使用します)**-「マイクロイテレーション」と呼びましょう(個々の操作または組み合わせの繰り返しによる)。



ここで、シーケンスを絶えず変更しながら、100回の「マクロ反復」を実行します(1回の「マクロ反復」=「マイクロ反復」の総数* 300)*

* 300の数は、絶対に経験的に選択され

ています**実装の詳細については、githubリポジトリにアクセスしてください(テキストの下のリンク)。



結果の分析:



すべての反復の結果、各操作および操作の組み合わせに対して20,000の測定値(トランザクションを使用して10,000、トランザクションを使用しない場合は10,000)を配列の形式で







取得しました次に、いくつかの計算を実行する必要があります。



明らかにサンプルの範囲外の結果をトリミング







する平均を







計算する標準偏差を計算する







ttest(ヌル仮説の確認または反論)







を使用して、サンプル間の統計的に有意な差の存在を判断します。単純なグラフを使用して、結果を視覚化します。たとえば、insertMany + updateMany + deleteManyの組み合わせと、個別にinsertOneを考えてみましょう(他のすべての結果は、「結論」セクションにテキスト形式で表示されます)。その結果、生成されたhtmlファイルには、操作の名前または操作の組み合わせに対応する名前のグラフが含まれます(非トランザクションの反復はターコイズで示され、トランザクションはオレンジで示されます)。 「統計的に有意」(true / false)は、統計的に有意な差があったかどうかを示します。他のすべては、それぞれマイクロ秒とパーセンテージで表した絶対値と相対値です。











結論:



  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


詳細と、スクリプトを自分で実行して結果をテストする機能については、githubアクセスしてください



読んでくれてありがとう。



気軽にコメントしてください。良い議論ができれば幸いです。



または、すべて自分で実行して、独自の結果を取得することもできます。それらを比較するのはクールでしょう



便利なリンク:

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

blog.yugabyte.com/are-mongodb-acid-transactions-ready-for-high-パフォーマンス・アプリケーション

medium.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