- PVSM.RU - https://www.pvsm.ru -
“Иногда мы платим больше всего за то, что получаем бесплатно.” — А.Эйнштейн
Не так давно в MongoDB версии 4+ появилась поддержка мульти-документных транзакций.
А поскольку наш проект как раз мигрировал на версию 4.2, закономерно возникли вопросы:
При изучении документации и интернетов вопросов только прибавилось:
Давайте попробуем узнать.
Для того, чтобы претендовать хотя бы на какую-то мизерную долю истины придется немного потрудиться.
Для простоты восприятия разделю имплементацию на 3 шага:
Теперь о каждом шаге отдельно.
Выбор инструментов:
Описание комбинаций операций и получения результатов:
Имплементируем каждую (из основных) отдельную операцию insertOne, updateOne, deleteOne, findOne, insertMany * updateMany * deleteMany * find * и их комбинации insertOne + updateOne + deleteOne, insertOne + updateOne + deleteOne + findOne, insertMany * + updateMany * + deleteMany * insertMany * + updateMany * + deleteMany * + find * с, и без использования транзакций.
Измерить время выполнения каждой операции.
Для примера — insertMany + updateMany + deleteMany с, и без транзакции


Каждую операцию / измерение повторим 300 раз (для анализа будем использовать 100 результатов «посередине», то есть с 101-го по 200-й) ** — назовем это «микроитерациямы» (итерациями отдельных операций или комбинаций).
Теперь, постоянно меняя последовательность, проведем 100 «макроитерации» (1 «макроитерация» = общее количество «микроитараций» * 300) *
* количество 300 выбрано абсолютно эмпирически
** для более полной информации об имплементации приглашаю посетить github репозиторий (ссылка ниже по тексту)
Анализ результатов:
В результате всех итераций мы получили 20000 замеров для каждой операции и комбинации операций (10000 с использованием транзакции, 10000 — без) в виде массивов

Далее необходимо провести некоторые расчеты.
Обрезать результаты, которые явно выпадают за пределы выборки

Вычислить среднее значение

Вычислить стандартное отклонение

Определить существование статистически достоверной разницы между выборками с помощью ttest (подтверждение или опровержение нулевой гипотезы)

С помощью простых графиков визуализируем результаты. Для примера возьмем комбинацию insertMany + updateMany + deleteMany и отдельно insertOne (все остальные результаты будут изложены в текстовом формате в разделе «Выводы»). В результате в сгенерированных html-файлах есть график, название которого соответствует названию операции или комбинации операции (бирюзовым цветом обозначены безтранзакционные итерации, оранжевым — транзакционные). «Is statistically significant» (true / false) говорит о том, была ли вообще какая-то статистически значимая разница. Все остальное — абсолютные и относительные значения в микросекундах и процентах соответственно.


Выводы:
Для получения дополнительной информации и возможности проверить результаты, запустив сценарии самостоятельно, посетите github [6].
Спасибо за то, что прочитали.
Не стесняйтесь комментировать, надеюсь, что у нас выйдет хорошая дискуссия.
Также вы можете запустить все это самостоятельно и получить собственные результаты. Будет круто их сравнить
Полезные ссылки:
medium.com/cashpositive/the-hitchhikers-guide-to-mongodb-transactions-with-mongoose-5bf8a6e22033 [7]
blog.yugabyte.com/are-mongodb-acid-transactions-ready-for-high-performance-applications [8]
medium.com/@Alibaba_Cloud/multi-document-transactions-on-mongodb-4-0-eebd662ac237 [9]
www.mongodb.com/blog/post/mongodb-multi-document-acid-transactions-general-availability [10]
docs.mongodb.com/manual/core/write-operations-atomicity [11]
www.dbta.com/Columns/MongoDB-Matters/Limitations-in-MongoDB-Transactions-127057.aspx [12]
dzone.com/articles/multi-document-transactions-on-mongodb-40 [13]
www.dbta.com/Columns/MongoDB-Matters/MongoDB-Transactions-In-Depth-125890.aspx [14]
www.codementor.io/@christkv/mongodb-transactions-vs-two-phase-commit-u6blq7465 [15]
docs.mongodb.com/manual/core/read-isolation-consistency-recency [16]
mathworld.wolfram.com/Outlier.html [17]
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 [18]
Автор: Novokhatskyi Oleksii
Источник [19]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/news/355142
Ссылки в тексте:
[1] mongodb-memory-server: https://www.npmjs.com/package/mongodb-memory-server
[2] mongodb: https://www.npmjs.com/package/mongodb
[3] “microseconds”: https://www.npmjs.com/package/microseconds
[4] ttest: https://www.npmjs.com/package/ttest
[5] stdlib: https://www.npmjs.com/package/@stdlib/stdlib
[6] посетите github: https://github.com/novokhatskyioleksii/MongoDBTransactionsPerformance
[7] medium.com/cashpositive/the-hitchhikers-guide-to-mongodb-transactions-with-mongoose-5bf8a6e22033: https://medium.com/cashpositive/the-hitchhikers-guide-to-mongodb-transactions-with-mongoose-5bf8a6e22033
[8] blog.yugabyte.com/are-mongodb-acid-transactions-ready-for-high-performance-applications: https://blog.yugabyte.com/are-mongodb-acid-transactions-ready-for-high-performance-applications/
[9] medium.com/@Alibaba_Cloud/multi-document-transactions-on-mongodb-4-0-eebd662ac237: https://medium.com/@Alibaba_Cloud/multi-document-transactions-on-mongodb-4-0-eebd662ac237
[10] www.mongodb.com/blog/post/mongodb-multi-document-acid-transactions-general-availability: https://www.mongodb.com/blog/post/mongodb-multi-document-acid-transactions-general-availability
[11] docs.mongodb.com/manual/core/write-operations-atomicity: https://docs.mongodb.com/manual/core/write-operations-atomicity/
[12] www.dbta.com/Columns/MongoDB-Matters/Limitations-in-MongoDB-Transactions-127057.aspx: http://www.dbta.com/Columns/MongoDB-Matters/Limitations-in-MongoDB-Transactions-127057.aspx
[13] dzone.com/articles/multi-document-transactions-on-mongodb-40: https://dzone.com/articles/multi-document-transactions-on-mongodb-40
[14] www.dbta.com/Columns/MongoDB-Matters/MongoDB-Transactions-In-Depth-125890.aspx: http://www.dbta.com/Columns/MongoDB-Matters/MongoDB-Transactions-In-Depth-125890.aspx
[15] www.codementor.io/@christkv/mongodb-transactions-vs-two-phase-commit-u6blq7465: https://www.codementor.io/@christkv/mongodb-transactions-vs-two-phase-commit-u6blq7465
[16] docs.mongodb.com/manual/core/read-isolation-consistency-recency: https://docs.mongodb.com/manual/core/read-isolation-consistency-recency/
[17] mathworld.wolfram.com/Outlier.html: https://mathworld.wolfram.com/Outlier.html
[18] 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: https://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/
[19] Источник: https://habr.com/ru/post/511522/?utm_source=habrahabr&utm_medium=rss&utm_campaign=511522
Нажмите здесь для печати.