DEV Community

Cover image for Como implementar No-Ops para Blindar Microsserviços em Go

Como implementar No-Ops para Blindar Microsserviços em Go

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 != nil constantes 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:

  1. A peça Real: Conecta ao serviço e executa operações reais.
  2. 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 != nil em 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)