изменение архитектуры


Шаги

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


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

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

  • та же машина (мой личный ноутбук MacBook)
  • та же спецификация для БД
    • Объем 10 ГБ
    • Тот же экземпляр ARM64


Результат нагрузочного теста и сравнение производительности

2 ключевых результата здесь: iterations (чем выше, тем лучше) и iteration_duration(avg)(ниже — лучше)

ФактПостгресRedis-PyВернуться к ОМ
Итерации25,26/с5,52/с2,30/с
Продолжительность итерации560,15 мс5,53 с8,07 с

Этот тест производительности меня тоже удивил, Redis как БД с хорошей производительностью,
в большинстве случаев это дает очень хороший результат производительности.


Почему производительность ухудшается после переключения, 3 возможные причины

база данных

Это сравнение производительности может быть необъективным, причины этого требуют дополнительных исследований. Я предполагаю, что это некоторые потенциальные причины,


1. Минимальные характеристики для разных БД отличаются

Даже спецификации для Postgres и Redis Stack здесь одинаковы, но их минимальные требования к спецификациям могут отличаться.

  • Постгрес: Процессор 1 ГГц. 2 ГБ оперативной памяти. 512 МБ жесткого диска.
  • Редис: 2,6 ГГц (2 ЦП), 4 ГБ оперативной памяти, 10 ГБ жесткого диска (стек Redis должен быть выше)


2. Преобразование типа данных может замедлить работу API

Decimal в Python как класс нельзя было сохранить напрямую как атрибут JSON в RedisJSOM,
поэтому он хранится в виде строки, и при чтении он будет преобразован в десятичный формат. Это может замедлить работу приложения.


3. Запрос не использовался (RedisSearch) не использовался,

Таким образом, когда запрашиваются данные истории, цикл GET отправляются в БД, что неэффективно


Вывод 1

Этот результат сравнения не говорит о том, что лучше между Postgres и RedisJSON, он только говорит, что на текущем этапе, в текущей спецификации экземпляра БД, для этого API
postgres обеспечивает лучшую производительность, а способ Decimal Convert а также Loop of Get на уровне приложения также замедляет работу приложения.
(Если кто-то лучше знает Redis для решения этих проблем, дайте мне знать). Так что это сравнение кажется не очень справедливым.


25 октября 2022 г. Избавьтесь от предположения № 2

думать перед столом

Попробуйте решить проблему № 2, прекратите использовать преобразование данных Python на уровне приложения и № 3, попытавшись использовать find из поиска Redis

Пытался использовать Redis-OM для запросов, в эта ветка,
Результат по-прежнему неудовлетворителен (на самом деле даже хуже), обнаружены проблемы:

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

  2. find функция не поддерживает 2 + условия (не уверен, что это отличается от официального документа)


Вывод 2

панель результатов

  • Redis-OM-Py очень новый, он требует большего вклада сообщества
  • Основная причина проблемы с производительностью после переключения не на уровне приложения, а на уровне базы данных или производительности db SDK/драйвера.


Репо

Это бесплатный форк Python Currency Exchange Rate API с открытым исходным кодом.

Используйте Redis Stack (RedisJson) для замены Postgres в качестве основного хранилища, а также некоторый рефакторинг

изменение стека

Как это работает

Как хранятся данные:

Данные хранятся в виде документа для каждого дня курсов валют.

{
   "2020-01-01": {
      "USD": 1
      "EUR": 1.1,
      "AUD": 0.97
   }
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

Как осуществляется доступ к данным:

В кодах Python доступ к данным осуществляется через простой get

r.json().get('2020-01-01')
Войти в полноэкранный режим

Выйти из полноэкранного режима

Тесты производительности

производительность постгреса
Redis JSON производительность

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

  • та же машина (мой личный ноутбук MacBook)
  • та же спецификация для БД
    • Объем 10 ГБ
    • Тот же экземпляр ARM64

2 ключевых результата здесь: iterations (чем выше, тем лучше) и iteration_duration(avg)(ниже — лучше)

ФактПостгресСтек Redis
Итерации25,26/с5,52/с
Продолжительность итерации560,15 мс5,53 с

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