-
Andrey Azeev authored
Токен Halyk (opaque, expires_in ~7199с/2ч) обновляли реактивно по 401 — каждые ~2ч первый запрос ловил 401 → шум WARNING+ERROR + лишний round-trip. Теперь перевыпуск проактивный, за 5 мин до истечения: - новый модуль token_cache.py поверх lib_aioredis: токен + refresh_at в Redis, TTL = expires_in; всё в try/except → Redis down не ломает запрос (fail-safe); - _ensure_token читает Redis first, при needs_refresh пускает фоновый перевыпуск и отдаёт запрос текущим живым токеном (не блокирует клиента); - межворкерный дедуп через Redis SET NX (один перевыпуск на деплой из N gunicorn), self-heal по TTL 30с; within-worker дедуп через asyncio.Lock + set; - auth() кладёт токен в Mongo (durable) И Redis с expires_in. Общую модель MerchantAuthorization не трогаем — expires_in живёт только в Redis. README: блок-схема процесса. Тесты: token_cache (41) + proactive refresh (11), conftest: redis-мок (read/create/delete) + очистка новых сетов. 136 passed, cov 91.57%.
fd5eafccAndrey Azeev authoredТокен Halyk (opaque, expires_in ~7199с/2ч) обновляли реактивно по 401 — каждые ~2ч первый запрос ловил 401 → шум WARNING+ERROR + лишний round-trip. Теперь перевыпуск проактивный, за 5 мин до истечения: - новый модуль token_cache.py поверх lib_aioredis: токен + refresh_at в Redis, TTL = expires_in; всё в try/except → Redis down не ломает запрос (fail-safe); - _ensure_token читает Redis first, при needs_refresh пускает фоновый перевыпуск и отдаёт запрос текущим живым токеном (не блокирует клиента); - межворкерный дедуп через Redis SET NX (один перевыпуск на деплой из N gunicorn), self-heal по TTL 30с; within-worker дедуп через asyncio.Lock + set; - auth() кладёт токен в Mongo (durable) И Redis с expires_in. Общую модель MerchantAuthorization не трогаем — expires_in живёт только в Redis. README: блок-схема процесса. Тесты: token_cache (41) + proactive refresh (11), conftest: redis-мок (read/create/delete) + очистка новых сетов. 136 passed, cov 91.57%.
Loading