You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- Add OpenTelemetry + Zipkin to Observability stack section
- Add Resilience4j and ShedLock to new Resilience stack section
- Mark OpenTelemetry and Rate limiting as completed in Next Steps
- Update RefreshTokenCleanupJob section mentioning ShedLock lock
distribution
- Add Spring Events and Resilience4j to Architectural Decisions section
**Benefício:** Código relacionado fica junto; cada pacote é praticamente auto-contido.
420
425
426
+
### ✔ Spring Events para desacoplamento de domínios
427
+
**Por quê:** Preparação para separação futura em microservices sem introduzir Kafka prematuramente.
428
+
429
+
**Benefício:** Domínios se comunicam via eventos internos (`ApplicationEventPublisher`) em vez de injeção direta de repositórios entre pacotes. Troca futura por Kafka/RabbitMQ requer mudança mínima.
430
+
431
+
### ✔ Resilience4j em integrações externas
432
+
**Por quê:** Proteger o monolito contra falhas de serviços externos (S3) e preparar os pontos de integração para extração futura.
433
+
434
+
**Benefício:** Circuit Breaker evita cascata de falhas; Retry com backoff trata falhas transitórias. Padrão já estabelecido para quando LoanService precisar chamar BookService via HTTP.
435
+
421
436
---
422
437
423
438
## 📊 Observabilidade
@@ -587,6 +602,7 @@ Limpa automaticamente refresh tokens expirados do banco de dados.
587
602
588
603
-**Frequência:** Todo dia às 02:00 AM (`cron = "0 0 2 * * *"`)
589
604
-**O que faz:**`DELETE FROM tb_refresh_tokens WHERE expiry_date < NOW()`
605
+
-**Lock distribuído:** ShedLock garante execução em apenas uma instância (`lockAtLeastFor = "30m"`, `lockAtMostFor = "1h"`)
590
606
-**Por quê:** Tokens expirados são deletados ao serem usados (via `validate()`), mas tokens nunca reutilizados acumulam no banco.
591
607
592
608
### LoanService.markOverdue()
@@ -611,8 +627,8 @@ Marca como `OVERDUE` empréstimos com `status = WAITING_RETURN` e `dueDate < hoj
611
627
612
628
## 🔮 Próximos Passos
613
629
614
-
-[]**Rate limiting** — Bucket4j ou Resilience4j
615
-
-[]**OpenTelemetry** — Tracing distribuído
630
+
-[x]**Rate limiting** — Bucket4j ou Resilience4j
631
+
-[x]**OpenTelemetry** — Tracing distribuído
616
632
-[ ]**Deploy em cloud** — AWS ECS ou Render
617
633
-[ ]**HATEOAS** — Hypermedia links
618
634
-[ ]**WebSockets** — Notificações real-time de devolução
**Benefício:** Código relacionado fica junto; cada pacote é praticamente auto-contido.
412
417
418
+
### ✔ Spring Events para desacoplamento de domínios
419
+
**Por quê:** Preparação para separação futura em microservices sem introduzir Kafka prematuramente.
420
+
421
+
**Benefício:** Domínios se comunicam via eventos internos (`ApplicationEventPublisher`) em vez de injeção direta de repositórios entre pacotes. Troca futura por Kafka/RabbitMQ requer mudança mínima.
422
+
423
+
### ✔ Resilience4j em integrações externas
424
+
**Por quê:** Proteger o monolito contra falhas de serviços externos (S3) e preparar os pontos de integração para extração futura.
425
+
426
+
**Benefício:** Circuit Breaker evita cascata de falhas; Retry com backoff trata falhas transitórias. Padrão já estabelecido para quando LoanService precisar chamar BookService via HTTP.
0 commit comments