Este projeto existe para comparar dois modelos arquiteturais distintos usando o mesmo domínio:
- Versão 1: Orientada a fila (task-based)
- Versão 2: Orientada a stream (event-based)
O objetivo NÃO é trocar tecnologia. O objetivo é entender como o modelo mental muda.
Sistema simplificado de processamento de pedidos.
Um pedido passa por 3 etapas:
- Pagamento
- Atualização de estoque
- Notificação ao usuário
order-pipeline/
queue-version/
stream-version/
shared/
shared/: tipos, contratos JSON e utilitários
- Mensagem = tarefa a ser executada
- Um consumidor processa cada mensagem
- Foco: execução confiável
Responsável por:
- Criar pedidos
- Enviar tarefa para fila
Responsável por:
- Consumir mensagens da fila
- Executar TODAS as etapas do pedido
ordersorders-dlq(dead letter)
- order-service cria pedido
{
"orderId": "123",
"userId": "abc",
"items": [{ "productId": "p1", "qty": 2 }]
}- Envia mensagem para fila
orders
Mensagem:
{
"type": "process-order",
"payload": { ...order }
}-
order-worker consome a mensagem
-
Executa sequencialmente:
- processPayment(order)
- updateInventory(order)
- sendNotification(order)
-
Se tudo OK → ACK
-
Se falhar:
- retry
- ou DLQ
| Componente | Responsabilidade |
|---|---|
| order-service | Produzir tarefa |
| order-worker | Executar tudo |
| fila | Buffer + entrega |
- Forte acoplamento de fluxo
- Um ponto central de execução
- Sem histórico após consumo
- Mensagem = evento (fato ocorrido)
- Múltiplos consumidores independentes
- Foco: propagação de estado
- Cria pedido
- Publica evento
Todos independentes.
order-createdpayment-processedinventory-updated
order-service publica:
{
"event": "order-created",
"orderId": "123",
"userId": "abc",
"items": [...]
}payment-service:
- Consome:
order-created - Executa pagamento
- Publica:
{
"event": "payment-processed",
"orderId": "123",
"status": "success"
}inventory-service:
- Consome:
payment-processed - Atualiza estoque
- Publica:
{
"event": "inventory-updated",
"orderId": "123"
}notification-service:
- Consome:
inventory-updated - Envia notificação
| Serviço | Consome | Publica |
|---|---|---|
| order-service | - | order-created |
| payment-service | order-created | payment-processed |
| inventory-service | payment-processed | inventory-updated |
| notification-service | inventory-updated | - |
- Sem orquestrador central
- Alto desacoplamento
- Histórico persistente
- Reprocessamento possível
"Faça isso"
"Isso aconteceu"
Todos os consumidores devem suportar mensagens duplicadas.
Simular:
- queda de serviço
- retry
- duplicação
Cada etapa deve logar:
[service] received event
[service] processing
[service] done
- Apenas um worker executa o fluxo
- Mensagem desaparece após consumo
- Múltiplos serviços reagem ao mesmo evento
- Eventos permanecem disponíveis
Você deve conseguir responder sem hesitação:
- Quem produz cada mensagem?
- Quem consome?
- A mensagem representa ação ou fato?
- É possível reprocessar?
Se qualquer resposta não estiver clara, a arquitetura está incorreta.
Se a versão stream parecer apenas uma fila distribuída, o modelo foi implementado errado.
O objetivo é internalizar:
- Fila = execução
- Stream = histórico + reação