«Иногда мы платим больше всего за то, что получаем бесплатно».Теги: #Высокая производительность #JavaScript #node.js #mongodb #производительность #транзакции— А.
Эинштейн Не так давно в 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 * с транзакциями и без них.
- Вам понадобится тестовая MongoDB (реплика с минимальным количеством процессов mongod) и драйвер для нее: сервер памяти mongodb , монгодб .
- Чтобы было проще измерять время, я выбрал модуль "микросекунды"
- Для анализа полученных результатов и визуализации мы используем следующее: ттест , стандартная библиотека .
Измерьте время выполнения каждой операции.
Например — InsertMany + updateMany + deleteMany с транзакцией и без нее.
Каждую операцию/измерение будем повторять 300 раз (для анализа будем использовать 100 результатов «посередине», то есть со 101-го по 200-й) ** - назовем это «микроитерациями» (итерациями отдельных операций или комбинаций) .Теперь, постоянно меняя последовательность, проведем 100 «макроитераций» (1 «макроитерация» = общее количество «микроитераций» * 300)* *число 300 выбрано чисто эмпирически ** для более полной информации о реализации приглашаю посетить репозиторий на github (ссылка ниже по тексту) Анализ результатов: В результате всех итераций мы получили по 20 000 измерений для каждой операции и комбинации операций (10 000 с использованием транзакции, 10 000 без) в виде массивов.
Далее вам нужно сделать некоторые расчеты.Обрезать результаты, которые явно выходят за рамки выборки
Рассчитать среднее
Рассчитать стандартное отклонение
Определить, существует ли статистически значимая разница между выборками с помощью ttest (подтверждая или опровергая нулевую гипотезу)
Визуализируем результаты с помощью простых графиков.Для примера возьмем комбинацию InsertMany + updateMany + deleteMany и InsertOne отдельно (все остальные результаты будут представлены в текстовом формате в разделе «Выводы»).
В результате сгенерированные html-файлы содержат граф, имя которого соответствует названию операции или комбинации операций (бирюзовый цвет обозначает нетранзакционные итерации, оранжевый — транзакционные итерации).
«Статистически значимо» (истина/ложь) указывает, была ли вообще какая-либо статистически значимая разница.
Все остальное — абсолютные и относительные значения в микросекундах и процентах соответственно.
Выводы:Для получения дополнительной информации и проверки результатов путем запуска сценариев самостоятельно: посетите github .
- В целом нет никакой разницы между операциями с использованием транзакций и без: InsertMany + updateMany + deleteMany (ищите иллюстрацию выше)
- Есть небольшая разница (до 7%): updateMany, find, InsertOne + updateOne + deleteOne + findOne,insertMany + updateMany + deleteMany + findOne.
- Транзакции медленнее, но не так критично (91%): updateOne, deleteMany, findOne
- Транзакции существенно медленнее (с 197% до 792%):insertOne,insertMany,deleteOne,insertOne+updateOne+deleteOne.
Спасибо за прочтение.
Не стесняйтесь комментировать, надеюсь, у нас будет хорошая дискуссия.
Вы также можете запустить все это самостоятельно и получить свои собственные результаты.
будет круто их сравнить Полезные ссылки: 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/ ключевые результаты
-
Задание На Конкурс От Aptech
19 Oct, 24 -
Немного Впечатлений От Surface
19 Oct, 24 -
Личные Финансы Онлайн
19 Oct, 24 -
Новый Coolpix P6000 От Nikon
19 Oct, 24 -
Суровые Будни После Новогодних Праздников.
19 Oct, 24 -
Радио-Э №8.2
19 Oct, 24