Node.js + MongoDB:事务处理性能

“有时候,我们为免费获得的东西付出了最高的代价。” -爱因斯坦


MongoDB 4+最近引入了对多文档事务的支持。



由于我们的项目刚刚迁移到4.2版,因此自然产生了问题:



  • 性能会如何?
  • 操作将减慢多少?
  • 我们是否愿意为了(至少是某些)准确性而牺牲速度?


在研究文档和Internet时,问题只会增加:



  • 交易会降低所有操作的速度吗?
  • 操作组合将减慢多少速度?


让我们尝试找出答案。



为了声称至少一部分真相,您必须付出一些努力。



为了便于理解,我将实现分为三个步骤:



  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 * +查找*有和没有使用事务。



测量每个操作的执行时间。



例如-具有和不具有事务的insertMany + updateMany + deleteMany











每个操作/度量将重复300次(为了进行分析,我们将在“中间”使用100个结果,即从101到200)**-我们称其为“微迭代” (通过单个操作或组合的迭代)。



现在,不断更改顺序,我们将执行100次“宏迭代”(1次“宏迭代” =“微迭代”的总数* 300)*

*绝对凭经验选择300的数量

**有关实现的更完整信息,我邀请您访问github存储库(本文下面的链接)



结果分析:



作为所有迭代的结果,我们以数组的形式获得了每个操作和操作组合的20,000个测量值(使用事务处理10,000个,不使用事务处理10,000个),







接下来,我们需要进行一些计算。



明显超出样本的作物结果







计算平均值







计算标准偏差







使用ttest(确认或否定原假设)确定样本之间是否存在统计学上的显着差异。







使用简单的图形,我们将结果可视化。例如,让我们结合使用insertMany + updateMany + deleteMany和insertOne的组合(所有其他结果将在“结论”部分以文本格式显示)。结果,生成的html文件包含一个图形,该图形的名称与操作或操作组合的名称相对应(非事务性迭代以青绿色表示,而事务性迭代以橙色表示)。 “具有统计学意义”(是/否)表示是否存在任何统计学意义上的差异。其他所有内容都是绝对值和相对值,分别以微秒和百分比为单位。











结论:



  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