Saltar al contenido principal

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

1

Token Bucket Global

GLOBAL_BINANCE_RPS

Limita 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
2

Weight Tracking

WEIGHT_BACKOFF_THRESHOLD

Binance 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
3

Circuit Breaker

GLOBAL_CB_THRESHOLD

Má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

errores > {threshold}

OPEN

cooldown activo

cooldown expira →

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.

# Respuesta normal {"code": "000000", "data": [{...}, {...}]} # Soft rate limit — datos vacíos, sin error HTTP {"code": "000000", "data": []}

Estrategias de Reintento por Error

CategoríaCódigosAcción
RETRY_WITH_SYNC-1021, -1022Re-sincroniza tiempo del servidor + reintenta
RETRIABLE_WITH_BACKOFF-1000, 429, -9000Backoff exponencial
RETRY_WITH_VOLUME_SYNC187049, 187040, 187031Sleep 0.3s + re-fetch volumen
AD_OFFLINE83229, 83230Marca pausado + verifica estado
SPECIAL_HANDLER187055Busca precio sin solapamiento

Variables de Entorno

Todas las variables tienen valores por defecto seguros. Ajusta según el volumen de tus operaciones.

VariableDefaultDescripción
GLOBAL_BINANCE_RPS5.0Global token bucket RPS
GLOBAL_MAX_CONCURRENT8Max concurrent Binance requests
GLOBAL_CB_THRESHOLD15Circuit breaker failure threshold
GLOBAL_CB_COOLDOWN45.0Circuit breaker cooldown (seconds)
GLOBAL_CB_HALF_OPEN_REQUESTS1Requests allowed in half-open state
LIMITER_GLOBAL_RPS4.5Per-ad global RPS across all ads
LIMITER_PER_AD_RPS1.5Per-ad max RPS
WEIGHT_BACKOFF_THRESHOLD0.8Weight usage ratio triggering backoff
EMPTY_RESPONSE_THRESHOLD3Empty responses before soft rate limit detection
RETRY_BUDGET5Max retry attempts per call
ERROR_187XXX_RETRY_SLEEP_SEC0.3Sleep before retry on 187xxx errors
BINANCE_RETRY_SYNC_ON_1000falsePer-method flag: sync time on -1000 errors
C2C_AD_NOT_FOUND_TTL_SEC60Negative 404 cache TTL
C2C_AD_NOT_FOUND_CACHE_MAX1024Max entries in 404 cache
ENGINE_BINANCE_RANGE_TTL_SEC300Dynamic 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.