Muitas aplicações morrem (panic) porque um serviço de telemetria ou um broker de mensagens ficou offline por apenas 5 segundos.
Por que é que a minha API de vendas caiu se o problema foi no servidor de logs, de cache ou de tracing?
O sistema em produção deve resistir em caso de falha de infraestrutura. Para isso, basta definirmos prioridades e criticidade de acordo com o contexto da aplicação.
Conceitos-Chave
- Fail Fast: Para a Database. Se não há dados, não há negócio. Trava o processo cedo.
- Fail-Safe / Graceful Degradation: Para Observabilidade e serviços auxiliares. Se o Tracing caiu, a vida continua.
- Null Object Pattern (No-Op): A técnica de implementar interfaces com métodos vazios (ou neutros) para evitar verificações de
if resource != nilconstantes no código de negócio.
Anatomia da Blindagem
A nossa estrutura de InfrapResources deve ser inteligente ao inicializar os contratos:
- Hard Dependencies: Aquelas que definem o estado (ex: Postgres para transações, Redis para Auth).
- Soft Dependencies: Aquelas que auxiliam o sistema (ex: RabbitMQ para eventos assíncronos, Prometheus, OpenTelemetry).
Base para a Implementação
A base da nossa resiliência reside na Programação por Contratos. Ao definirmos interfaces claras em ports, permitimos que a aplicação decida, em tempo de boot, qual "peça" encaixar:
- A peça Real: Conecta ao serviço e executa operações reais.
- A peça No-Op: Silencia falhas e mantém o sistema estável (executa uma operação "vazia").
Ambas respeitam rigorosamente os contratos de infraestrutura: Database, Cache, MessageBroker, entre outros.
Benefícios Reais
- Developer Experience (DX): O programador não precisa de espalhar
if r.Resource != nilem todo o lado. O contrato está lá e é seguro chamá-lo. - Resiliência: A app sobrevive em ambientes instáveis (como instâncias gratuitas ou clouds com flutuações de rede).
- Testabilidade: No-Ops são, na prática, Mocks prontos para testes de integração e desenvolvimento local rápido.
Conclusão
Muita gente confunde resiliência com 'nunca falhar'. Na verdade, resiliência é saber o que fazer quando a falha acontece.
Implementar No-Ops em Go é uma das formas mais elegantes de garantir que o teu sistema não entra em pânico por causa de uma dependência não-crítica
Código Fonte:









Top comments (0)