Skip to content
  • Andrey Azeev's avatar
    fd5eafcc
    feat(halyk): упреждающий перевыпуск токена через Redis · fd5eafcc
    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%.
    fd5eafcc
    feat(halyk): упреждающий перевыпуск токена через Redis
    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%.
Loading