- Шаги
- Нагрузочный тест
- Результат нагрузочного теста и сравнение производительности
- Почему производительность ухудшается после переключения, 3 потенциальные причины
- 1. Минимальные спецификации для различных БД отличаются
- 2. Преобразование типов данных может замедлить работу API
- 3. Не использовался запрос (RedisSearch),
- Заключение 1
- 2022 Октябрь 25, Избавиться от предположительного преобразования данных в кодах.
- Заключение 2
- Репозитории
- tim-hub / sanic-currency-exchange-rates-api
- Это саморазмещаемый, бесплатный, с открытым исходным кодом Python API форк курсов валют.
- Перенос Sanic Currency Exchange Rates Api на использование стека Redis @Redis Hackathon
- Как это работает
- Как хранятся данные:
- Как осуществляется доступ к данным:
- Бенчмарки производительности
Шаги
- Рефакторинг существующей кодовой базы, чтобы разделить логику ДБ и бизнес-логику
- Интеграционное тестирование
- Реализация
- Нагрузочный тест и результат производительности
Нагрузочный тест
Нагрузочный тест используется здесь для измерения производительности.
- одна и та же машина (мой личный ноутбук macbook)
- одинаковые характеристики для БД
- том 10 ГБ
- тот же экземпляр ARM64
Результат нагрузочного теста и сравнение производительности
-
Результат оригинального Postgres
-
Переход на использование Redis через Redis-Py
-
Переход на использование Redis через Redis OM
Здесь 2 ключевых результата: iterations
(выше — лучше) и iteration_duration(avg)
(ниже — лучше).
Факт | Postgres | Redis-Py | Redis OM |
---|---|---|---|
Итерации | 25.26/s | 5.52/s | 2.30/s |
Продолжительность итерации | 560.15мс | 5.53s | 8.07s |
Этот бенчмарк производительности удивляет и меня самого, Redis является хорошо производительной БД,
в большинстве случаев он дает очень хороший результат производительности.
Почему производительность ухудшается после переключения, 3 потенциальные причины
Это сравнение производительности не может быть объективным, причины этого требуют дополнительных исследований. Вот некоторые потенциальные причины, которые я предполагаю,
1. Минимальные спецификации для различных БД отличаются
Даже спецификации для Postgres и Redis Stack здесь одинаковы, но их минимальные требования к спецификациям могут отличаться.
- Postgres: 1 ГГц процессор. 2 ГБ оперативной памяти. 512 МБ жесткого диска.
- Redis: 2,6 ГГц (2 процессора), 4 ГБ оперативной памяти, 10 ГБ HDD (Redis Stack должен быть выше).
2. Преобразование типов данных может замедлить работу API
Десятичная дробь в Python как класс не может быть сохранена непосредственно как атрибут JSON в RedisJSOM,
поэтому он хранится как строка, и при чтении будет преобразован в десятичную дробь. Это может замедлить работу APP.
3. Не использовался запрос (RedisSearch),
Поэтому при запросе исторических данных в БД отправляется цикл GET
, что неэффективно.
Заключение 1
Этот результат сравнения не говорит о том, что лучше между Postgres и RedisJSON, он говорит только о том, что на текущем этапе, на текущей спецификации экземпляра БД, для этого API,
postgres дает лучшую производительность, а способ Decimal Convert
и Loop of Get
на уровне приложения тоже замедляет работу приложения.
(Если кто-то знает о Redis лучше, чтобы решить эти проблемы, пожалуйста, дайте мне знать). Так что это сравнение кажется не очень справедливым.
2022 Октябрь 25, Избавиться от предположительного преобразования данных в кодах.
Результат находится в 3-й колонке таблицы выше.
Попробуйте решить проблему №2, прекратите использовать Python конвертацию данных на уровне приложения, а №3, попробуйте использовать
find
из Redis Search.
Попробовал использовать Redis-OM для запросов, в этой ветке,
Результат все еще не достаточно хорош, (на самом деле даже хуже), проблемы найдены:
-
Функция Redis-OM-Python была ограничена, функция
sort by
не поддерживается, -
функция
find
не поддерживает 2 + условия (не уверен, что это так, это отличается от официального документа).
Заключение 2
- Redis-OM-Py очень новый, он требует большего вклада сообщества
- Основная причина проблем с производительностью после перехода не на уровне приложения, это все еще что-то либо на уровне БД, либо на уровне SDK/драйвера БД.
Репозитории
tim-hub / sanic-currency-exchange-rates-api
Это саморазмещаемый, бесплатный, с открытым исходным кодом Python API форк курсов валют.
Перенос Sanic Currency Exchange Rates Api на использование стека Redis @Redis Hackathon
Использование стека Redis (RedisJson) для замены Postgres в качестве основного хранилища, плюс некоторый рефакторинг
- README
- Вклад
Как это работает
Как хранятся данные:
Данные хранятся в виде документа, для каждого дня курсов валют.
{ "2020-01-01": { "USD": 1 "EUR": 1.1, "AUD": 0.97 } }
Как осуществляется доступ к данным:
В кодах python доступ к данным осуществляется через простой get
.
r.json().get('2020-01-01')
Бенчмарки производительности
Для измерения производительности здесь используется нагрузочный тест.
- одна и та же машина (мой личный ноутбук macbook)
- одинаковые характеристики для БД
- том 10 ГБ
- тот же экземпляр ARM64
Здесь 2 ключевых результата: iterations
(больше — лучше) и iteration_duration(avg)
(меньше — лучше).
Факт | Postgres | Стек Redis |
---|---|---|
Итерации | 25.26/s | 5.52/s |
Продолжительность итерации | 560.15мс | 5.53s |
Этот показатель производительности удивляет меня самого, поскольку…