Resiliência nativa de nuvem
Dica
Esse conteúdo é um trecho do livro eletrônico, para Projetar os Aplicativos .NET nativos de nuvem para o Azure, disponível no .NET Docs ou como um PDF para download gratuito que pode ser lido offline.
A resiliência é a capacidade do sistema de reagir à falha e ainda permanecer funcional. Não se trata de evitar falhas, mas de aceitar falhas e construir serviços nativos de nuvem para responder a ela. Você deseja retornar a um estado totalmente funcional o mais rápido possível.
Ao contrário dos aplicativos monolíticos tradicionais, em que tudo é executado em um único processo, os sistemas nativos de nuvem adotam uma arquitetura distribuída, conforme mostrado na Figura 6-1:
Figura 6-1. Ambiente nativo de nuvem distribuído
Na figura anterior, cada serviço de backup baseado em nuvem e microsserviço é executado em um processo separado, em toda infraestrutura do servidor, comunicando-se por meio de chamadas baseadas em rede.
Operar nesse ambiente, um serviço deve ser sensível a muitos desafios diferentes:
Latência de rede inesperada – o tempo para uma solicitação de serviço viajar para o receptor e voltar.
Falhas transitórias – erros de conectividade de rede de curta duração.
Bloqueio por uma operação síncrona de execução longa.
Um processo de host que falhou e está sendo reiniciado ou movido.
Um microsserviço sobrecarregado que não pode responder por um curto período de tempo.
Uma operação de orquestrador em disponibilizada versão piloto, como uma atualização sem contínua ou mover de um serviço de um nó para outro.
Falhas de hardware.
As plataformas de nuvem podem detectar e atenuar muitos desses problemas de infraestrutura. Ele pode reiniciar, escalar horizontalmente e até redistribuir seu serviço para um nó diferente. No entanto, para aproveitar ao máximo essa proteção interna, você deve projetar seus serviços para reagir a ela e prosperar nesse ambiente dinâmico.
Nas seções a seguir, exploraremos técnicas defensivas que o serviço e os recursos de nuvem gerenciados podem aproveitar para minimizar o tempo de inatividade e a interrupção.