Pular para o conteúdo principal

Decisões Técnicas

DecisãoMotivo
Integrações via HTTPStateless, testáveis isoladamente, deploy independente
3 filas BullMQruns (baixo volume), items (alto volume), logs (async write) — escala independente
FlowProducerParent/child nativo BullMQ para rastrear fan-out
Config como jsonbCada handler tem necessidades diferentes; colunas fixas não escalam
Granularidade por handlerControle fino: schedule, execução e reprocessamento por handler
Service discovery via DBtypes.base_url — escala para N integrações sem env vars
Logs assíncronosFila logs desacopla escrita de http_logs/queue_logs do processamento
Concurrency/rate limit por handlerEvita derrubar APIs externas, controle granular
Circuit Breaker layered (2 camadas)Tenant (threshold 5) isola falhas por conta; Global (threshold 15) protege contra outage generalizado
CB transição lazy (sem setTimeout)Timer setTimeout se perde em restart do processo; checagem lazy via Redis TTL garante transição open→half-open mesmo após crash
Rate Limiter por tenantSliding window evita starvation — tenant massivo não bloqueia outros
Timeout HTTP por faseCollect 60s, Process 30s, Gateway 15s — protege contra hang indefinido de fetch sem timeout
Backpressure via queue depthCheck antes do fan-out evita crescimento descontrolado da fila de items
Job PriorityWebhooks (priority 1) passam na frente de schedules (priority 5)
Cache Redistypes.base_url em cache TTL 60s — max 1 query/min ao PostgreSQL
Batch ProcessingContrato opcional /map-batch e /push-batch para alto volume
Particionamento mensalExpurgo via DROP TABLE — instantâneo, sem VACUUM
PgBouncer + Redis SentinelConnection pooling + HA para escala horizontal