Este projeto é um sistema esqueleto para processamento de pedidos de tickets para shows, desenvolvido como treino para um teste na Shopee. O sistema foi projetado de forma que permita a substituição de componentes in-memory por soluções mais robustas como RabbitMQ e MySQL no futuro.
Em plataformas de venda de ingressos, múltiplos usuários podem tentar comprar o mesmo ticket simultaneamente. Isso pode causar:
Race conditions e overselling se não houver controle.
Sobrecarga do sistema com processamento síncrono de muitas requisições.
Lentidão ou travamento durante picos de acesso.
Por isso, é comum enfileirar pedidos a partir de um endpoint e processá-los de forma assíncrona, garantindo consistência e melhor experiência do usuário.
Este sistema implementa um padrão de processamento assíncrono utilizando filas de mensageria para:
- Desacoplamento: Separar o recebimento da requisição do processamento do ticket
- Escalabilidade: Permitir processamento paralelo e distribuído
- Confiabilidade: Garantir que nenhum pedido seja perdido
- Performance: Resposta rápida ao usuário enquanto processa em background
- User: Representa um usuário do sistema
- Show: Representa um evento/show disponível
- Ticket: Representa um pedido de ticket
- Interface TicketPublisher: Define o contrato para publicação de mensagens
- TicketPublisherMemory: Implementação in-memory usando Go channels
- TicketPublisherRabbitMQ: Implementação futura para RabbitMQ
- UserRepository: Interface para operações com usuários
- ShowRepository: Interface para operações com shows
- Implementações in-memory com possibilidade de migração para MySQL
- Health Handler: Endpoint para verificação de saúde da aplicação
- Ticket Handler: Endpoint para criação de pedidos de ticket
-
Recebimento do Pedido:
POST /tickets { "show_id": "123", "user_id": "456" } -
Validação Inicial:
- Verificar se o usuário existe
- Verificar se o show existe
-
Publicação na Fila:
- Criar objeto Ticket
- Enviar para fila de processamento assíncrono
-
Processamento Assíncrono:
- Consumer processa ticket da fila
-
Resposta ao Cliente:
- Retorno imediato com status "processing"
- Notificação posterior sobre resultado
- Migração para RabbitMQ
- Implementação de banco de dados MySQL/PostgreSQL
- Sistema de cache com Redis
- Sistema de reserva temporária
- Notificações em tempo real (WebSockets)
- Gestão de filas por prioridade
- Logging estruturado
- Métricas com Prometheus
- Tracing distribuído
- Health checks avançados
- Autenticação JWT
- Rate limiting
- HTTPS obrigatório
- Configuração de CORS
# Compilar a aplicação
make build
# Executar em modo production
make prod
# Ou executar diretamente em modo desenvolvimento
make run# Health check
curl http://localhost:3001/health
# Criar pedido de ticket
curl -X POST http://localhost:3001/tickets \
-H "Content-Type: application/json" \
-d '{
"show_id": "230920",
"user_id": 1
}'