Node.js + Mongodb: Производительность Транзакций

«Иногда мы платим больше всего за то, что получаем бесплатно».

— А.

Эинштейн Не так давно в MongoDB версии 4+ появилась поддержка транзакций с несколькими документами.

А так как наш проект только что перешёл на версию 4.2, то естественно возникли вопросы:

  • Что будет с спектаклем?
  • Насколько замедлится работа?
  • Готовы ли мы пожертвовать скоростью ради (хотя бы некоторой) точности?
При изучении документации и интернета вопросов только прибавилось:
  • Будут ли транзакции замедлять все операции?
  • Насколько будут замедляться комбинации операций?
Давайте попробуем это выяснить.

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

Для простоты понимания я разделю реализацию на 3 этапа:

  1. Выбор инструментов
  2. Описание комбинаций операций и получение результатов
  3. Анализ результатов
Теперь о каждом шаге отдельно.

Выбор инструмента:

  1. Вам понадобится тестовая MongoDB (реплика с минимальным количеством процессов mongod) и драйвер для нее: сервер памяти mongodb , монгодб .

  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 с транзакцией и без нее.



Node.js + MongoDB: производительность транзакций



Node.js + MongoDB: производительность транзакций

Каждую операцию/измерение будем повторять 300 раз (для анализа будем использовать 100 результатов «посередине», то есть со 101-го по 200-й) ** - назовем это «микроитерациями» (итерациями отдельных операций или комбинаций) .

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



Node.js + MongoDB: производительность транзакций

Далее вам нужно сделать некоторые расчеты.

Обрезать результаты, которые явно выходят за рамки выборки

Node.js + MongoDB: производительность транзакций

Рассчитать среднее

Node.js + MongoDB: производительность транзакций

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

Node.js + MongoDB: производительность транзакций

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

Node.js + MongoDB: производительность транзакций

Визуализируем результаты с помощью простых графиков.

Для примера возьмем комбинацию InsertMany + updateMany + deleteMany и InsertOne отдельно (все остальные результаты будут представлены в текстовом формате в разделе «Выводы»).

В результате сгенерированные html-файлы содержат граф, имя которого соответствует названию операции или комбинации операций (бирюзовый цвет обозначает нетранзакционные итерации, оранжевый — транзакционные итерации).

«Статистически значимо» (истина/ложь) указывает, была ли вообще какая-либо статистически значимая разница.

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



Node.js + MongoDB: производительность транзакций



Node.js + MongoDB: производительность транзакций

Выводы:

  1. В целом нет никакой разницы между операциями с использованием транзакций и без: InsertMany + updateMany + deleteMany (ищите иллюстрацию выше)
  2. Есть небольшая разница (до 7%): updateMany, find, InsertOne + updateOne + deleteOne + findOne,insertMany + updateMany + deleteMany + findOne.
  3. Транзакции медленнее, но не так критично (91%): updateOne, deleteMany, findOne
  4. Транзакции существенно медленнее (с 197% до 792%):insertOne,insertMany,deleteOne,insertOne+updateOne+deleteOne.
Для получения дополнительной информации и проверки результатов путем запуска сценариев самостоятельно: посетите github .

Спасибо за прочтение.

Не стесняйтесь комментировать, надеюсь, у нас будет хорошая дискуссия.

Вы также можете запустить все это самостоятельно и получить свои собственные результаты.

будет круто их сравнить Полезные ссылки: 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/ ключевые результаты

Теги: #Высокая производительность #JavaScript #node.js #mongodb #производительность #транзакции
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.