Node.js + MongoDB: Transaktionsleistung

"Manchmal zahlen wir am meisten für das, was wir kostenlos bekommen." - A. Einstein


MongoDB 4+ hat kürzlich die Unterstützung für Transaktionen mit mehreren Dokumenten eingeführt.



Und da unser Projekt gerade auf Version 4.2 migriert wurde, stellten sich natürlich Fragen:



  • Was wird mit der Aufführung passieren?
  • Wie stark wird der Betrieb verlangsamt?
  • Sind wir bereit, Geschwindigkeit für (zumindest einige) Genauigkeit zu opfern?


Beim Studium der Dokumentation und des Internets nahmen die Fragen nur zu:



  • Werden alle Vorgänge durch Transaktionen verlangsamt?
  • Um wie viel verlangsamt sich die Kombination von Operationen?


Versuchen wir es herauszufinden.



Um zumindest einen geringen Anteil an der Wahrheit zu beanspruchen, muss man ein wenig arbeiten.



Zur Erleichterung der Wahrnehmung werde ich die Implementierung in drei Schritte unterteilen:



  1. Werkzeugauswahl
  2. Beschreibung der Kombinationen von Operationen und Erhalten von Ergebnissen
  3. Analyse der Ergebnisse


Nun zu jedem Schritt einzeln.



Auswahl der Werkzeuge:



  1. Ein Test MongoDB (Replikat mit einer minimalen Anzahl von Mongod-Prozessen) und ein Treiber dafür: Mongodb-Memory-Server , Mongodb sind erforderlich .
  2. Um die Zeitmessung zu vereinfachen, habe ich das Modul "Mikrosekunden" gewählt
  3. : ttest, stdlib.


Beschreibung der Kombinationen von Operationen und Erhalten von Ergebnissen: Wir



implementieren jede (der Haupt-) separaten Operationen insertOne, updateOne, deleteOne, findOne, insertMany * updateMany * deleteMany * find * und ihre Kombinationen insertOne + updateOne + deleteOne, insertOne + updateOne + deleteOne + findOne, insertMany * + updateMany * + deleteMany * insertMany * + updateMany * + deleteMany * + find * mit und ohne Verwendung von Transaktionen.



Messen Sie die Ausführungszeit jeder Operation.



Zum Beispiel - insertMany + updateMany + deleteMany mit und ohne Transaktion











Jede Operation / Messung wird 300 Mal wiederholt (für die Analyse werden 100 Ergebnisse "in der Mitte" verwendet, dh vom 101. bis zum 200.) ** - nennen wir es "Mikroiterationen". (durch Iterationen einzelner Operationen oder Kombinationen).



Wenn wir nun die Reihenfolge ständig ändern, werden wir 100 "Makroiterationen" durchführen (1 "Makroiteration" = die Gesamtzahl der "Mikroiterationen" * 300) *

* Die Anzahl der 300 wird absolut empirisch gewählt

** für umfassendere Informationen über die Implementierung lade ich Sie ein, das Github-Repository zu besuchen (Link unten im Text)



Analyse der Ergebnisse:



Als Ergebnis aller Iterationen erhielten wir 20.000 Messungen für jede Operation und Kombination von Operationen (10.000 unter Verwendung einer Transaktion, 10.000 - ohne) in Form von Arrays.







Als nächstes müssen wir einige Berechnungen durchführen.



Ernteergebnisse, die deutlich außerhalb der Stichprobe liegen







Mittelwert







berechnen Standardabweichung berechnen







Bestimmen Sie das Vorhandensein eines statistisch signifikanten Unterschieds zwischen Proben mithilfe von ttest (Bestätigung oder Widerlegung der Nullhypothese).







Mit einfachen Diagrammen visualisieren wir die Ergebnisse. Nehmen wir zum Beispiel die Kombination insertMany + updateMany + deleteMany und separate insertOne (alle anderen Ergebnisse werden im Abschnitt Schlussfolgerungen im Textformat dargestellt). Infolgedessen enthalten die generierten HTML-Dateien ein Diagramm, dessen Name dem Namen einer Operation oder einer Kombination einer Operation entspricht (nicht-transaktionale Iterationen werden in Türkis und transaktionale in Orange angezeigt). "Ist statistisch signifikant" (wahr / falsch) gibt an, ob überhaupt ein statistisch signifikanter Unterschied bestand. Alles andere sind absolute und relative Werte in Mikrosekunden bzw. Prozent.











Schlussfolgerungen:



  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


Weitere Informationen und die Möglichkeit, die Ergebnisse zu testen, indem Sie die Skripte selbst ausführen , finden Sie unter github .



Danke fürs Lesen.



Fühlen Sie sich frei zu kommentieren, hoffentlich haben wir eine gute Diskussion.



Alternativ können Sie alles selbst ausführen und Ihre eigenen Ergebnisse erzielen. Es wird cool sein, sie zu vergleichen.



Nützliche Links:

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

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

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