Resiliência precisa estar presente em tudo que for construído no software. A premissa é que erros podem ocorrer e a aplicação precisa tomar decisões deliberadas de como lidar com as eventuais falhas. Considere este raciocínio para chamadas locais, passagens de parâmetros, serviços gerenciados, chamadas para sistemas, etc.
Pontos importantes sobre resiliência:
- Inspiração nas ideias de Design By Contract.
Toda função, método, endpoint ou listener deve favorecer a checagem de pré-condições de execução, pós-condições e, se possível, invariantes. - Chamadas locais podem falhar e o código tem que estar preparado para isso.
Handlers globais, contextuais ou tratamentos locais. A ideia é que tudo seja feito de maneira deliberada. - Chamadas remotas estão suscetíveis a falhas e inconvenientes.
Cada chamada remota tem múltiplos pontos de erro: a conexão pode falhar, o tempo de resposta pode ser elevado, o retorno pode ser inesperado. O sistema precisa estar preparado para lidar com isso. - Defina soluções bem desenhadas para lidar com imprevistos nas chamadas remotas.
É necessário ter clareza sobre como lidar com as falhas: defina timeouts, políticas de retry, circuit breaker, etc.