Node.js + MongoDB: performances des transactions

«Parfois, nous payons le plus pour ce que nous obtenons gratuitement.» - A. Einstein


MongoDB 4+ a récemment introduit la prise en charge des transactions multi-documents.



Et depuis que notre projet vient de migrer vers la version 4.2, des questions se sont naturellement posées:



  • Qu'arrivera-t-il à la performance?
  • Dans quelle mesure l'opération va-t-elle ralentir?
  • Sommes-nous prêts à sacrifier la vitesse pour (au moins une certaine) précision?


Lors de l'étude de la documentation et d'Internet, les questions n'ont fait qu'augmenter:



  • Toutes les opérations seront-elles ralenties par les transactions?
  • Dans quelle mesure la combinaison des opérations ralentira-t-elle?


Essayons de le découvrir.



Pour revendiquer au moins une part minime de la vérité, il faut travailler un peu.



Pour faciliter la perception, je vais diviser la mise en œuvre en 3 étapes:



  1. Sélection d'outils
  2. Description des combinaisons d'opérations et obtention des résultats
  3. Analyse des résultats


Maintenant, à propos de chaque étape séparément.



Choix des outils:



  1. Un test MongoDB (réplique avec un nombre minimum de processus mongod) et un pilote pour celui - ci: mongodb-memory-server , mongodb sont nécessaires .
  2. Pour faciliter la mesure du temps, j'ai choisi le module "microsecondes"
  3. : ttest, stdlib.


Description des combinaisons d'opérations et obtention de résultats: Nous



implémentons chacune (des principales) opérations séparées insertOne, updateOne, deleteOne, findOne, insertMany * updateMany * deleteMany * find * et leurs combinaisons insertOne + updateOne + deleteOne, insertOne + updateOne + deleteOne + findOne, insertMany * + updateMany * + deleteMany * insertMany * + updateMany * + deleteMany * + find * avec et sans utiliser de transactions.



Mesurez le temps nécessaire pour terminer chaque opération.



Par exemple - insertMany + updateMany + deleteMany avec et sans transaction











Chaque opération / mesure sera répétée 300 fois (pour l'analyse, nous utiliserons 100 résultats "au milieu", c'est-à-dire du 101e au 200e) ** - appelons cela "microitération" (par itérations d'opérations individuelles ou de combinaisons).



Maintenant, en changeant constamment la séquence, nous allons effectuer 100 "macroiterations" (1 "macroiteration" = le nombre total de "microitérations" * 300) *

* le nombre de 300 est choisi de manière absolument empirique

** pour des informations plus complètes sur l'implémentation, je vous invite à visiter le référentiel github (lien ci-dessous dans le texte)



Analyse des résultats: à l'



issue de toutes les itérations, nous avons reçu 20 000 mesures pour chaque opération et combinaison d'opérations (10 000 en utilisant une transaction, 10 000 sans) sous forme de tableaux







.



Couper les résultats qui se situent clairement en dehors de l'échantillon







Calculer la moyenne







Calculer l'écart type







Déterminer l'existence d'une différence statistiquement significative entre les échantillons à l'aide de ttest (confirmation ou réfutation de l'hypothèse nulle)







À l'aide de graphiques simples, nous visualisons les résultats. Par exemple, prenons la combinaison insertMany + updateMany + deleteMany et insertOne séparément (tous les autres résultats seront présentés au format texte dans la section Conclusions). En conséquence, les fichiers html générés contiennent un graphe dont le nom correspond au nom d'une opération ou à une combinaison d'opération (les itérations non transactionnelles sont indiquées en turquoise et les transactionnelles en orange). «Est statistiquement significatif» (vrai / faux) indique s'il y a eu une différence statistiquement significative. Tout le reste est des valeurs absolues et relatives en microsecondes et en pourcentages, respectivement.











Conclusions:



  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


Pour plus d'informations et la possibilité de tester les résultats en exécutant les scripts vous-même, visitez github .



Merci d'avoir lu.



N'hésitez pas à commenter, j'espère que nous avons une bonne discussion.



Sinon, vous pouvez tout exécuter vous-même et obtenir vos propres résultats. Ce sera cool de les comparer



Liens utiles:

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

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

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