QB
Rate Limiting Backoff exponencial
Problema
QuickBooks limita a 500 llamadas/minuto. Durante sincronizaciones masivas, el sistema recibia errores 429 Too Many Requests que causaban:
| Sintoma | Impacto |
| Error buscando clientes | Fallback a cliente generico (#27) |
| Error creando clientes | Factura asignada incorrectamente |
| Sincronizaciones incompletas | Facturas pendientes sin procesar |
Backoff exponencial
El sistema reintenta automaticamente con delays crecientes: 1s → 2s → 4s → 8s
const resultado = await this.ejecutarConRetry(requestFn, maxRetries, baseDelay);
// Internamente:
// intento 1: espera 1000ms
// intento 2: espera 2000ms
// intento 3: espera 4000ms
// intento 4: espera 8000ms
Funciones de retry
| Funcion | Proposito |
ejecutarConRetry(fn, retries, delay) | Wrapper generico con backoff exponencial para cualquier peticion QB |
buscarClienteConRetry(query) | Busqueda de clientes resistente a 429, con delays inteligentes |
crearClienteConRetry(data) | Creacion de clientes con proteccion automatica contra rate limiting |
Sincronizacion inteligente
El metodo sincronizarConEndpoint() implementa pausas dinamicas que se adaptan a la carga.
| Mecanismo | Detalle |
| Pausa base | 1000ms entre cada factura |
| Pausa por error | +500ms por cada error previo acumulado |
| Pausa extra 429 | +3000ms adicional cuando se detecta rate limit |
| Maximo | 5000ms entre facturas |
| Progreso | Contador en tiempo real: factura X de Y |
Configuracion
| Parametro | Default | Descripcion |
maxRetries | 3 | Numero maximo de reintentos por peticion |
baseDelay | 1000ms | Delay base para calculo de backoff |
timeout | 15000ms | Timeout de peticiones HTTP individuales |
pausaDinamica | 1000ms + errors*500ms | Pausa adaptativa entre facturas |
// Personalizar reintentos para casos especificos
await this.ejecutarConRetry(requestFn, 5, 2000); // 5 reintentos, 2s base
Diagnostico
Los logs muestran mensajes claros del estado del rate limiting:
// Reintento con backoff
Reintentando en 2000ms (intento 2/4)...
Peticion exitosa despues de 1 reintentos
// Rate limit detectado
Rate limiting detectado (429) - Intento 2/4
Pausa adicional de 3s debido a rate limiting
// Pausa entre facturas
Pausa de 1500ms antes de la siguiente factura...
Mejores practicas
| Practica | Detalle |
| Lotes pequenos | Sincronizar en lotes durante horas pico |
| Monitorear logs | Identificar patrones de rate limiting recurrentes |
| Probar antes | Ejecutar test antes de sincronizaciones masivas |
| Horarios | Preferir horarios de baja carga (temprano en la manana) |
Limite de QuickBooks: 500 llamadas por minuto. Las sincronizaciones grandes (100+ facturas) pueden acercarse al limite — el backoff exponencial maneja esto automaticamente.