enforce a real 6s cooldown between shared-token lichess.org requests, not just non-overlap
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 13s
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 13s
A bare mutex around games/user and user/activity wasn't enough: Lichess kept rejecting the shared LICHESS_APP_TOKEN with 429 "Please only run 1 request(s) at a time" even when calls were strictly sequential with only ~100-300ms between one finishing and the next starting (confirmed live on prod: near every request was getting 429'd right after the previous mutex fix went out). Track the last release time and force a minimum 6s gap before the next call is allowed to start. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
31e6fdd23d
commit
0dbd0c400b
2 changed files with 57 additions and 23 deletions
|
|
@ -19,7 +19,7 @@ from typing import List, Dict, Any, Optional
|
|||
from datetime import datetime, timedelta
|
||||
import logging
|
||||
import json
|
||||
from rate_limiter import get_rate_limiter, get_shared_token_lock
|
||||
from rate_limiter import get_rate_limiter, get_shared_token_gate
|
||||
|
||||
# Настройка логирования для модуля
|
||||
logger = logging.getLogger(__name__)
|
||||
|
|
@ -48,7 +48,7 @@ class LichessClient:
|
|||
# Сериализует games/user и user/activity между собой (см. rate_limiter.py) —
|
||||
# обе шарят один LICHESS_APP_TOKEN, и Lichess не пускает по нему 2+
|
||||
# запроса одновременно.
|
||||
self.shared_token_lock = get_shared_token_lock()
|
||||
self.shared_token_gate = get_shared_token_gate()
|
||||
# Lichess начал возвращать 404 (вместо честного 401/429) на анонимные
|
||||
# запросы к games/user и user/activity — тот же валидный токен, отправленный
|
||||
# для другого юзера, сразу превращает 404 в 429, то есть эндпоинт жив, просто
|
||||
|
|
@ -84,10 +84,10 @@ class LichessClient:
|
|||
|
||||
headers = {'Authorization': f'Bearer {self.app_token}'} if self.app_token else {}
|
||||
|
||||
# Держим shared_token_lock на весь запрос-ответ (не только на паузу
|
||||
# выше) — LICHESS_APP_TOKEN общий с get_games_of_period, и Lichess
|
||||
# не пускает по нему 2+ запроса одновременно.
|
||||
async with self.shared_token_lock:
|
||||
# Держим shared_token_gate на весь запрос-ответ и с паузой после —
|
||||
# LICHESS_APP_TOKEN общий с get_games_of_period, и Lichess не
|
||||
# пускает 2+ запроса подряд без ощутимой паузы между ними.
|
||||
async with self.shared_token_gate:
|
||||
response = await self.client.get(url, headers=headers)
|
||||
logger.info(f"🔍 Lichess API response status: {response.status_code} for {username}")
|
||||
response.raise_for_status() # Проверяем статус ответа
|
||||
|
|
@ -159,11 +159,12 @@ class LichessClient:
|
|||
|
||||
logger.info(f"Запрос игр для {username} с {since_ms} по {until_ms}")
|
||||
|
||||
# Держим shared_token_lock на весь запрос-ответ (не только на паузу
|
||||
# выше) — LICHESS_APP_TOKEN общий с get_user_activity, и Lichess
|
||||
# не пускает по нему 2+ запроса одновременно (наблюдали 429
|
||||
# "Please only run 1 request(s) at a time" под конкурентной нагрузкой).
|
||||
async with self.shared_token_lock:
|
||||
# Держим shared_token_gate на весь запрос-ответ и с паузой после —
|
||||
# LICHESS_APP_TOKEN общий с get_user_activity, и Lichess не пускает
|
||||
# 2+ запроса подряд без ощутимой паузы между ними (даже строго
|
||||
# последовательные с интервалом ~100-300мс ловили 429 "Please only
|
||||
# run 1 request(s) at a time" под реальной нагрузкой на проде).
|
||||
async with self.shared_token_gate:
|
||||
response = await self.client.get(url, params=params, headers=headers)
|
||||
response.raise_for_status() # Проверяем статус ответа
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue