Мое веб-приложение построено на основе асинхронного FastAPI. Сервер, развертывающий это приложение, запустит 4 рабочих процесса, и каждый рабочий запустит 2 потока для обработки одновременных запросов.
Описание
Большинство служб в моем веб-приложении в значительной степени полагаться на токен, требуемый от внешнего API. Проблема в том, что этот токен имеет определенный срок действия, а это означает, что мне придется получить его снова, когда истечет срок действия существующего.
Чтобы предотвратить многократное обновление токена, я сделал это следующие вещи:
- Кэшируйте токен в базе данных MySQL, чтобы я мог получить доступ к токену в течение срока действия, не вызывая API.
- После истечения срока действия существующего токена Я применяю asyncio.Lock ко всем сопрограммам, чтобы гарантировать, что только одна сопрограмма может выполнять операцию выборки.
Вышеописанный подход решил проблему, но скрыл скрытую проблему. Поскольку я сохранил токен в базе данных MySQL, мне придется держать соединения открытыми в течение всей операции обновления (это плохой подход, как указано в документации SQLAlchemy). Обратившись к документации Python, я понял, что применение asyncio.Lock в веб-приложении с несколькими потоками не является подходящим решением.
В результате я рассматриваю возможность кэширование токена в Redis. Но тогда как мне правильно заблокировать операцию обновления, чтобы в Redis существовал только один токен даже в среде с высоким уровнем параллелизма?
Подробнее здесь: https://stackoverflow.com/questions/792 ... re-web-app