Jobs e Cache · infrastructure/jobs
Adapter pronto para produçãoBullMQ,
tipado e catalogado.
O trabalho real de um SaaS acontece fora do caminho da request. A UseDeploy entrega um setup de BullMQ com um catálogo de filas como única fonte de verdade, payloads de job tipados e as peculiaridades da conexão ioredis que derrubam setups feitos na mão já resolvidas.
Um catálogo, payloads tipados
As filas são declaradas uma única vez em QUEUE_NAMES, então o bootstrap do worker e o mount do Bull Board iteram uma única fonte de verdade. Cada fila tem uma interface de payload tipada, então uma key com nome errado aparece em tempo de compilação em vez de em runtime dentro do worker.
1 export const QUEUE_NAMES = {
2 emails: 'emails',
3 webhooksOutgoing: 'webhooks-outgoing',
4 billingWebhooksRetry: 'billing-webhooks-retry',
5 accountDeletions: 'account-deletions',
6 dataExports: 'data-exports',
7 usagePeriodRollover: 'usage-period-rollover',
8 } as const;
O que vem pronto
Conexão centralizada
createJobsConnection resolve JOBS_REDIS_URL e depois REDIS_URL e aplica maxRetriesPerRequest: null — o setting que o BullMQ exige para que comandos bloqueantes nunca deem timeout no meio de um poll.
Dados de job tipados
EmailJobData, DataExportJobData e companhia são compartilhados entre produtores e consumidores, então drift de payload é um erro de tipo.
Bull Board
Um dashboard montado deixa você inspecionar, reprocessar e drenar filas em dev e em ops.
Guard de URL vazia
O resolver de URL faz trim antes de checar, então um placeholder solto JOBS_REDIS_URL= cai de volta para REDIS_URL em vez de deixar o worker em loop de crash.
Referência de configuração
Variáveis de ambiente
REDIS_URLobrigatóriarequired for the jobs subsystem
JOBS_REDIS_URLopcionaldedicated jobs Redis; falls back to REDIS_URL
Onde ele vive
apps/server/src/infrastructure/jobs/queues.tsapps/server/src/infrastructure/jobs/redis-connection.tsapps/server/src/infrastructure/jobs/bull-board.ts
Tire o trabalho lento do caminho da request.
Comece com um catálogo de filas tipado, workers apoiados no Redis e um dashboard já conectado.