Node.js + MongoDB: rendimiento de las transacciones

"A veces pagamos más por lo que obtenemos gratis". - A. Einstein


MongoDB 4+ introdujo recientemente soporte para transacciones de múltiples documentos.



Y dado que nuestro proyecto acaba de migrar a la versión 4.2, naturalmente surgieron preguntas:



  • ¿Qué pasará con la actuación?
  • ¿Cuánto se ralentizará la operación?
  • ¿Estamos dispuestos a sacrificar la velocidad en aras de (al menos algo) precisión?


Al estudiar la documentación e Internet, las preguntas solo aumentaron:



  • ¿Se ralentizarán todas las operaciones por las transacciones?
  • ¿Cuánto se ralentizará la combinación de operaciones?


Intentemos averiguarlo.



Para reclamar al menos una pequeña parte de la verdad, tienes que trabajar un poco.



Para facilitar la percepción, dividiré la implementación en 3 pasos:



  1. Selección de herramientas
  2. Descripción de combinaciones de operaciones y obtención de resultados
  3. Análisis de resultados


Ahora sobre cada paso por separado.



Elección de herramientas:



  1. Se requiere una prueba de MongoDB (réplica con un número mínimo de procesos mongod) y un controlador para ello: mongodb-memory-server , mongodb .
  2. Para facilitar la medición del tiempo, elegí el módulo "microsegundos"
  3. : ttest, stdlib.


Descripción de combinaciones de operaciones y obtención de resultados:



Implementamos cada (de las principales) operaciones separadas insertOne, updateOne, deleteOne, findOne, insertMany * updateMany * deleteMany * find * y sus combinaciones insertOne + updateOne + deleteOne, insertOne + updateOne + deleteOne + findOne, insertMany * + updateMany * + deleteMany * insertMany * + updateMany * + deleteMany * + buscar * con y sin usar transacciones.



Mide el tiempo para completar cada operación.



Por ejemplo: insertMany + updateMany + deleteMany con y sin una transacción











Cada operación / medición se repetirá 300 veces (para el análisis usaremos 100 resultados "en el medio", es decir, del 101 al 200) ** - llamémoslo "microiteración" (por iteraciones de operaciones individuales o combinaciones).



Ahora, cambiando constantemente la secuencia, realizaremos 100 "macroiteraciones" (1 "macroiteración" = el número total de "microiteraciones" * 300) *

* el número de 300 se elige de forma absolutamente empírica

** para obtener información más completa sobre la implementación, los invito a visitar el repositorio de github (enlace a continuación en el texto)



Análisis de los resultados:



Como resultado de todas las iteraciones, recibimos 20,000 mediciones para cada operación y combinación de operaciones (10,000 usando una transacción, 10,000 - sin) en forma de matrices.







A continuación, necesitamos realizar algunos cálculos.



Recortar los resultados que claramente quedan fuera de la muestra







Calcular la media







Calcular la desviación estándar







Determinar la existencia de una diferencia estadísticamente significativa entre muestras mediante ttest (confirmación o refutación de la hipótesis nula)







Utilizando gráficos simples, visualizamos los resultados. Por ejemplo, tomemos la combinación insertMany + updateMany + deleteMany e insertOne por separado (todos los demás resultados se presentarán en formato de texto en la sección "Conclusiones"). Como resultado, los archivos html generados contienen un gráfico cuyo nombre corresponde al nombre de una operación o una combinación de una operación (las iteraciones no transaccionales se indican en turquesa y las transaccionales en naranja). "Es estadísticamente significativo" (verdadero / falso) indica si hubo alguna diferencia estadísticamente significativa. Todo lo demás son valores absolutos y relativos en microsegundos y porcentajes, respectivamente.











Conclusiones:



  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


Para obtener más información y comprobar los resultados ejecutando los scripts usted mismo, visite github .



Gracias por leer.



No dude en comentar, espero que tengamos una buena discusión.



Alternativamente, puede ejecutarlo todo usted mismo y obtener sus propios resultados. Será genial compararlos



Enlaces útiles:

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