Aula 14 - Filas, Eventos e Jobs ⚡
🎯 Objetivo da Aula
Aprender a tornar sua aplicação muito mais rápida movendo tarefas pesadas para o "background". Vamos explorar Jobs, Queues (filas) e o sistema de Eventos/Listeners para criar uma arquitetura desacoplada.
🕰️ O Problema das Tarefas Lentas
Imagine que o usuário se cadastra e você precisa enviar um e-mail de boas-vindas. Se o servidor de e-mail demorar 5 segundos, o usuário ficará esperando com a tela travada. Solução: Colocar o envio de e-mail em uma fila e responder ao usuário imediatamente.
📊 Processamento Assíncrono com Filas
sequenceDiagram
participant U as Usuário
participant C as Controller
participant Q as Fila (Redis/Banco)
participant W as Worker (Background)
U->>C: Clica em "Comprar"
C->>Q: Adiciona Job "Gerar PDF"
C-->>U: "Sua compra está sendo processada!"
Note over Q,W: O Worker pega o job da fila
W->>W: Gera o PDF pesado
W->>U: Envia e-mail com o PDF
⚒️ Criando um Job
Como despachar o job:
ProcessarRelatorio::dispatch($dados);
🔔 Eventos e Listeners
Eventos permitem que partes diferentes do sistema "ouçam" quando algo importante acontece.
- Evento: PedidoRealizado.
- Listeners: EnviarEmailCliente, BaixarEstoque, NotificarLogistica.
Desacoplamento
O Controller de Pedidos não precisa saber como o estoque é baixado. Ele apenas dispara o evento.
🧠 Blocos de Destaque
Cache com Redis
Para aplicações de alta performance, use o Redis como driver de fila e cache. Ele é extremamente rápido porque armazena os dados na memória RAM.
🛠️ Exercícios Progressivos
- Básico: Configure o driver de fila para
databaseno seu.enve rode a migrationqueue:batches-table. - Intermediário: Crie um Job que apenas escreva uma mensagem no log (
Log::info) e despache-o através de uma rota. - Desafio: Implemente um Evento que seja disparado sempre que um produto for criado, enviando um e-mail fictício para o administrador.
🚀 Mini-Projeto da Aula
Relatório por E-mail: Crie um botão "Gerar Relatório de Vendas". Ao clicar, o sistema deve despachar um Job que simule um processamento pesado (sleep de 10 segundos) e, ao terminar, registre no log que o relatório está pronto. O usuário deve receber uma mensagem instantânea dizendo: "Seu relatório está sendo gerado e será enviado em breve".