Límites de Tasa
Arquitectura de tres capas de rate limiting con circuit breaker, token bucket y weight tracking. Cada capa opera de forma independiente; las tres deben permitir el paso para que una solicitud llegue a Binance.
Arquitectura de Tres Capas
Token Bucket Global
GLOBAL_BINANCE_RPSLimita el número máximo de solicitudes por segundo a Binance para toda la instancia. Por defecto 5.0 RPS. Usa un token bucket con reposición continua — no ventanas fijas. Cuando el bucket está vacío, las solicitudes se encolan o rechazan según la configuración de concurrencia máxima.
Variables clave
- GLOBAL_BINANCE_RPS = 5.0
- GLOBAL_MAX_CONCURRENT = 8
- LIMITER_GLOBAL_RPS = 4.5
- LIMITER_PER_AD_RPS = 1.5
Comportamiento
- Token bucket con reposición continua
- Sin ventanas fijas de tiempo
- Cola de espera hasta MAX_CONCURRENT
- Backoff exponencial al superar umbral
Weight Tracking
WEIGHT_BACKOFF_THRESHOLDBinance asigna un peso (weight) a cada endpoint. El sistema rastrea el consumo acumulado y activa backoff automático cuando el ratio de uso supera el umbral configurado. El backoff es exponencial y se restablece cuando Binance responde sin cabecera de rate limit.
Umbral de backoff
# Activa backoff cuando: uso_actual / límite_binance > WEIGHT_BACKOFF_THRESHOLD # Default: 0.8 (80% del límite)
Variables clave
- WEIGHT_BACKOFF_THRESHOLD = 0.8
- RETRY_BUDGET = 5
- EMPTY_RESPONSE_THRESHOLD = 3
Circuit Breaker
GLOBAL_CB_THRESHOLDMáquina de estados con tres fases: CLOSED (operación normal), OPEN (rechaza solicitudes, cooldown activo) y HALF-OPEN (prueba con solicitudes limitadas). Se abre cuando el número de errores consecutivos supera GLOBAL_CB_THRESHOLD.
CLOSED
operación normal
OPEN
cooldown activo
HALF-OPEN
prueba limitada
Variables clave
- GLOBAL_CB_THRESHOLD = 15
- GLOBAL_CB_COOLDOWN = 45.0s
- GLOBAL_CB_HALF_OPEN_REQUESTS = 1
Errores que incrementan el contador
- HTTP 429 (Too Many Requests)
- Binance -9000 (rate limit interno)
- Timeouts de conexión
- Errores -1000 (según configuración)
Detección de Soft Rate Limit (BAPI)
El endpoint público de búsqueda de anuncios (EP-0) no devuelve HTTP 429 cuando se excede el límite. En cambio, responde con un array de datos vacío. AutoP2P detecta este patrón y trata EMPTY_RESPONSE_THRESHOLD respuestas vacías consecutivas como un soft rate limit, activando backoff automático.
Estrategias de Reintento por Error
| Categoría | Códigos | Acción |
|---|---|---|
| RETRY_WITH_SYNC | -1021, -1022 | Re-sincroniza tiempo del servidor + reintenta |
| RETRIABLE_WITH_BACKOFF | -1000, 429, -9000 | Backoff exponencial |
| RETRY_WITH_VOLUME_SYNC | 187049, 187040, 187031 | Sleep 0.3s + re-fetch volumen |
| AD_OFFLINE | 83229, 83230 | Marca pausado + verifica estado |
| SPECIAL_HANDLER | 187055 | Busca precio sin solapamiento |
Variables de Entorno
Todas las variables tienen valores por defecto seguros. Ajusta según el volumen de tus operaciones.
| Variable | Default | Descripción |
|---|---|---|
| GLOBAL_BINANCE_RPS | 5.0 | Global token bucket RPS |
| GLOBAL_MAX_CONCURRENT | 8 | Max concurrent Binance requests |
| GLOBAL_CB_THRESHOLD | 15 | Circuit breaker failure threshold |
| GLOBAL_CB_COOLDOWN | 45.0 | Circuit breaker cooldown (seconds) |
| GLOBAL_CB_HALF_OPEN_REQUESTS | 1 | Requests allowed in half-open state |
| LIMITER_GLOBAL_RPS | 4.5 | Per-ad global RPS across all ads |
| LIMITER_PER_AD_RPS | 1.5 | Per-ad max RPS |
| WEIGHT_BACKOFF_THRESHOLD | 0.8 | Weight usage ratio triggering backoff |
| EMPTY_RESPONSE_THRESHOLD | 3 | Empty responses before soft rate limit detection |
| RETRY_BUDGET | 5 | Max retry attempts per call |
| ERROR_187XXX_RETRY_SLEEP_SEC | 0.3 | Sleep before retry on 187xxx errors |
| BINANCE_RETRY_SYNC_ON_1000 | false | Per-method flag: sync time on -1000 errors |
| C2C_AD_NOT_FOUND_TTL_SEC | 60 | Negative 404 cache TTL |
| C2C_AD_NOT_FOUND_CACHE_MAX | 1024 | Max entries in 404 cache |
| ENGINE_BINANCE_RANGE_TTL_SEC | 300 | Dynamic price range cache TTL |
Caché Negativa de Anuncios (404)
Cuando un anuncio retorna 404, se registra en una caché negativa para evitar solicitudes repetidas al mismo recurso inexistente. Controlado por C2C_AD_NOT_FOUND_TTL_SEC (TTL) y C2C_AD_NOT_FOUND_CACHE_MAX (máximo de entradas). Después de 3600s de 404 persistentes, el tracker lo marca como permanentemente inactivo.