Confiabilidade
Confiabilidade é a disciplina de permanecer operacional quando as coisas ao seu redor falham — porque elas falharão. Projete para falhas parciais primeiro; os caminhos felizes se cuidam sozinhos.
Regras
- Timeouts em toda chamada de saída. Sem exceções. Um timeout ausente é um incidente de exaustão de pool de threads à espera de acontecer.
- Repetir apenas operações idempotentes. Com backoff exponencial e jitter. Repetir um POST não idempotente cria duplicatas, cobra o cartão duas vezes, envia dois e-mails.
- Chaves de idempotência em APIs públicas mutáveis. Permite que os clientes tentem novamente com segurança em falhas de rede, sem que você precise adivinhar.
- Interromper dependências externas com circuit breaker. Quando um downstream está doente, falhar rápido protege tanto você quanto ele. Repetições cegas transformam uma falha em duas.
- Compartimentar caminhos críticos. Isole pools de threads / pools de conexão por downstream para que um lento não possa afogar todo o serviço.
- Degradação graciosa é melhor que falha total. Sirva um cache desatualizado, uma resposta parcial ou um conjunto reduzido de funcionalidades em vez de um 500.
- Sem pontos únicos de falha. Multi-AZ para cada componente com estado, múltiplas réplicas para cada componente sem estado, verificações de saúde do balanceador de carga que realmente detectam problemas.
- Desligamento deve ser gracioso. Drene requisições em andamento, feche pools, descarregue buffers. SIGTERM → parar de aceitar → finalizar ou cancelar → sair.
- Torne seguro reiniciar a qualquer momento. Qualquer pod individual deve poder ser morto a qualquer momento com impacto zero visível ao usuário. Se não, esse é o bug a corrigir.
- Backups não são testados até que você os restaure. Execute um exercício real de restauração em uma agenda.
Bandeiras vermelhas
restTemplate.exchange(...)sem timeout configurado.- Um loop de repetição sem limite e sem backoff.
- "Funciona se você reimplantar." (Estado oculto na memória.)
- Implantações sem downtime que na verdade não são sem downtime porque requisições são perdidas no SIGTERM.
- Runbook de recuperação de desastres que nunca foi exercitado.