Node.js + MongoDB: Desempenho de transações

“Às vezes, pagamos mais pelo que recebemos de graça.” - A. Einstein


O MongoDB 4+ introduziu recentemente o suporte para transações de vários documentos.



E como nosso projeto acabou de migrar para a versão 4.2, surgiram questões naturalmente:



  • O que acontecerá com a performance?
  • Quanto a operação diminuirá?
  • Estamos dispostos a sacrificar a velocidade por uma questão de (pelo menos alguma) precisão?


Ao estudar a documentação e a Internet, as perguntas só aumentaram:



  • Todas as operações serão retardadas por transações?
  • Quanto a combinação de operações diminuirá?


Vamos tentar descobrir.



Para reivindicar pelo menos uma parte escassa da verdade, você tem que trabalhar um pouco.



Para facilitar a percepção, vou dividir a implementação em 3 etapas:



  1. Seleção de ferramenta
  2. Descrição das combinações de operações e obtenção de resultados
  3. Análise de resultados


Agora, sobre cada etapa separadamente.



Escolha de ferramentas:



  1. Um MongoDB de teste (réplica com um número mínimo de processos mongod) e um driver para ele: mongodb-memory-server , mongodb são necessários .
  2. Para facilitar a medição do tempo, escolhi o módulo "microssegundos"
  3. : ttest, stdlib.


Descrição das combinações de operações e obtenção de resultados:



Implementamos cada (das principais) operações separadas insertOne, updateOne, deleteOne, findOne, insertMany * updateMany * deleteMany * find * e suas combinações insertOne + updateOne + deleteOne, insertOne + updateOne + deleteOne + findOne, insertMany * + updateMany * + deleteMany * insertMany * + updateMany * + deleteMany * + find * com e sem usar transações.



Meça o tempo para concluir cada operação.



Por exemplo - insertMany + updateMany + deleteMany com e sem uma transação











Cada operação / medição será repetida 300 vezes (para a análise usaremos 100 resultados "no meio", ou seja, do 101º ao 200º) ** - vamos chamá-lo de "microiterações" (por iterações de operações individuais ou combinações).



Agora, mudando constantemente a sequência, faremos 100 "macroiterações" (1 "macroiteração" = o número total de "microiterações" * 300) *

* o número de 300 é escolhido absolutamente empiricamente

** para informações mais completas sobre a implementação, convido você a visitar o repositório github (link abaixo no texto)



Análise dos resultados:



Como resultado de todas as iterações, recebemos 20.000 medições para cada operação e combinação de operações (10.000 usando uma transação, 10.000 - sem) na forma de matrizes.







Em seguida, precisamos realizar alguns cálculos.



Resultados de colheita que claramente estão fora da amostra







Calcular média







Calcular desvio padrão







Determine a existência de uma diferença estatisticamente significativa entre as amostras usando ttest (confirmação ou rejeição da hipótese nula).







Usando gráficos simples, visualizamos os resultados. Por exemplo, vamos pegar a combinação insertMany + updateMany + deleteMany e separadamente insertOne (todos os outros resultados serão apresentados em formato de texto na seção "Conclusões"). Como resultado, os arquivos html gerados contêm um gráfico cujo nome corresponde ao nome de uma operação ou uma combinação de uma operação (iterações não transacionais são indicadas em turquesa e transacional em laranja). "É estatisticamente significativo" (verdadeiro / falso) indica se houve alguma diferença estatisticamente significativa. Todo o resto são valores absolutos e relativos em microssegundos e porcentagem, respectivamente.











Conclusões:



  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 obter mais informações e verificar os resultados executando os scripts você mesmo, visite github .



Obrigado pela leitura.



Sinta-se à vontade para comentar, espero que tenhamos uma boa discussão.



Como alternativa, você pode executá-lo sozinho e obter seus próprios resultados. Vai ser legal compará-los



Links úteis:

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