Ficha do projeto
03 / 03Motor explicável de recomendação de viagens
Viazio
Escolhe quando e para onde viajar cruzando feriado, clima, custo e distância, e mostra por que cada destino ficou naquela posição em vez de entregar uma nota única. Quando uma fonte externa sai do ar, o ranking continua de pé e diz o que faltou.
O Viazio compara janelas e destinos a partir de clima, custo, distância e calendário. A resposta separa nota, cobertura e confiança para continuar útil quando um provedor falha, sem fingir que dados ausentes têm a mesma qualidade dos dados observados.
- Período
- 03.2026 · 07.2026
- Minha atuação
- Arquitetura do motor de recomendação, integrações externas, persistência, API Spring Boot e frontend React.
- Tecnologia
- Java 21 · Spring Boot · React 19 · PostgreSQL · Resilience4j
- Estado
- Versão publicada
CÍRCULO
Ordenar destinos com dados incompletos
Clima, câmbio, feriados, indicadores econômicos e conteúdo editorial têm validades e falhas diferentes. Bloquear a requisição até todos responderem deixa o ranking lento; preencher a ausência com zero pune o destino por um problema do provedor.
SETOR
Como o ranking degrada
Score e cobertura separados
Quatro estratégias calculam clima, custo, distância e festividades. Quando um critério falta, os pesos disponíveis são renormalizados e a cobertura reduz a confiança final sem inventar uma nota.
Falha isolada por provedor
Retry, circuit breaker e bulkhead têm estados independentes. Uma indisponibilidade da Wikipédia remove o conteúdo editorial, mas não abre o circuito de clima, feriados ou Banco Mundial.
PostgreSQL antes da rede
Leituras usam dados persistidos com fetched_at, stale_at e expires_at. Um miss recebe no máximo dois segundos de busca síncrona; depois disso, a resposta degrada e o refresh entra na fila.
Concorrência limitada por candidato
Candidatos são avaliados em virtual threads, enquanto a fila de atualização usa prioridade e ShedLock. A falha de um candidato não interrompe a ordenação dos demais.
MARCA
Evidência executável
- 250 testes no backend e 17 testes unitários no frontend
- Cinco provedores remotos com cache, proteção e comportamento de falha documentados separadamente
- Fila de refresh persistida para dados ausentes, vencidos ou com baixa confiança
- Aplicação pública sem cadastro, com API versionada e repositório aberto
SÚMULA