Вход в систему с высокой нагрузкой FastAPI: как обрабатывать хеширование bcrypt/argon2 без ограничений на блокировку и мPython

Программы на Python
Ответить
Anonymous
 Вход в систему с высокой нагрузкой FastAPI: как обрабатывать хеширование bcrypt/argon2 без ограничений на блокировку и м

Сообщение Anonymous »

Я работаю над высоконагруженным асинхронным веб-приложением с использованием FastAPI, и у меня есть вопрос о реализации логики входа/регистрации с хешированием паролей.
Проблема
Как мы знаем, хеширование паролей (например, с помощью bcrypt или argon2) — это относительно медленная операция, связанная с использованием ЦП. В моем случае я использую bcrypt.
  • Хеширование занимает заметное время на каждый запрос.
  • Оно блокирует выполнение (зависит от процессора).
  • При высокой нагрузке (много одновременных запросов на вход) это становится узким местом.
Я также понимаю что:
  • Bcrypt в Python реализован на языке C, поэтому он может работать в параллельных потоках.
  • В асинхронных приложениях операции блокировки должны быть выгружены в пул потоков.
Что я пробовал
Я пытался разгрузить хеширование используя:

Код: Выделить всё

await asyncio.to_thread(bcrypt.hashpw, password, salt)
а также:

Код: Выделить всё

loop.run_in_executor(...)
Однако под нагрузкой я все равно достиг предела:
  • пропускная способность не масштабируется должным образом
  • увеличение размера пула потоков существенно не повышает производительность
  • ЦП, похоже, становится узким местом
Наблюдения
  • Увеличение количества воркеров (процессов) дает заметное улучшение производительности
  • Увеличение количества потоков (через исполнителя) не дает такого же эффекта
  • Похоже, что я ограничен поведением ЦП и/или GIL
Вопрос
Как эта проблема обычно решается в высоконагруженных веб-приложениях Python?
В частности:
  • Является ли использование ThreadPoolExecutor правильным подходом для bcrypt/argon2 в асинхронных приложениях?
  • Ожидается ли это? что масштабирование в основном достигается за счет нескольких рабочих процессов (процессов), а не потоков?
  • Существуют ли общие архитектурные шаблоны, такие как:
  • выделенная служба аутентификации
  • фоновые рабочие процессы
  • ограничение скорости входа в систему конечные точки
  • Есть ли лучшие альтернативы bcrypt для сценариев с высокой нагрузкой (например, настройка argon2)?
Цель
Я пытаюсь понять, что считается лучшей практикой для обработки хеширования паролей в асинхронном Python с высокой нагрузкой приложения.
Любые реальные подходы или архитектурные шаблоны будут высоко оценены.

Подробнее: https://stackoverflow.com/questions/799 ... locking-an
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»