Arquitetura Backend
Assíncrono e workers
Producer no use case, fila AMQP e consumers na infra
Operações pesadas ou demoradas não bloqueiam a requisição HTTP. O padrão é producer → fila AMQP → consumer.
Producer (use case)
// ListAttendanceUseCase — trecho simplificado
if (sendEmail) {
await this.broker.publish(EnvConfig.BROKER_REPORTS_QUEUE, {
companyId,
filters: { ...filters, orderBy: resolveAttendanceReportOrderBy(filters) },
userEmail,
});
return { success: true, data: { reportQueued: true, /* ... */ } };
}O use case depende de BrokerGateway, não de RabbitMQBroker.
Consumer (infra)
Arquivo de referência: src/infra/reports/attendance-report.consumer.ts
@Injectable()comOnModuleInit.- Chama
broker.subscribe()na fila de relatórios. - Injeta múltiplos repository gateways para buscar e enriquecer dados.
- Reutiliza helpers compartilhados (
attendance-report-export.helpers.ts). - Gera CSV, faz upload via
AWSS3Service, envia e-mail viaEmailGateway.
Este é o padrão “fat worker”: o consumer em infra orquestra lógica que espelha o use case, mas roda fora do ciclo HTTP.
Outros consumers
src/infra/email/application-email.consumer.ts— e-mails de aplicação enfileirados
Filas configuradas
Nomes de filas vêm de EnvConfig em src/infra/configuration.ts:
BROKER_NOTIFICATION_QUEUEBROKER_EMAIL_QUEUE/ fila de aplicaçãoBROKER_REPORTS_QUEUE(com sufixo por ambiente)
Diagrama assíncrono
Próximos tópicos
- Padrão Use Case
- Nova feature — walkthrough B (export por e-mail)
- Exceções pragmáticas — S3 sem gateway