Использование стека Redis для замены Postgres в RESTful API — Обучение и выход

Шаги

  1. Рефакторинг существующей кодовой базы, чтобы разделить логику ДБ и бизнес-логику
  2. Интеграционное тестирование
  3. Реализация
  4. Нагрузочный тест и результат производительности

Нагрузочный тест

Нагрузочный тест используется здесь для измерения производительности.

  • одна и та же машина (мой личный ноутбук 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 для запросов, в этой ветке,
Результат все еще не достаточно хорош, (на самом деле даже хуже), проблемы найдены:

  1. Функция Redis-OM-Python была ограничена, функция sort by не поддерживается,

  2. функция 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

Этот показатель производительности удивляет меня самого, поскольку…

Посмотреть на GitHub

Оцените статью
devanswers.ru
Добавить комментарий