Resiliência e a alta disponibilidade em microsserviçosResiliency and high availability in microservices

Lidar com falhas inesperadas é um dos problemas mais difíceis de resolver, especialmente em um sistema distribuído.Dealing with unexpected failures is one of the hardest problems to solve, especially in a distributed system. Grande parte do código que os desenvolvedores gravam envolve tratamento de exceções, e também é nisso que a maior parte do tempo é gasta no teste.Much of the code that developers write involves handling exceptions, and this is also where the most time is spent in testing. O problema envolve mais do que escrever código para lidar com falhas.The problem is more involved than writing code to handle failures. O que acontece quando o computador em que o microsserviço está em execução falha?What happens when the machine where the microservice is running fails? Não só é necessário detectar a falha desse microsserviço (um problema de disco rígido em si), como você também precisa de algo para reiniciar seu microsserviço.Not only do you need to detect this microservice failure (a hard problem on its own), but you also need something to restart your microservice.

Um microsserviço precisa ser resiliente a falhas e conseguir reiniciar geralmente em outro computador para disponibilidade.A microservice needs to be resilient to failures and to be able to restart often on another machine for availability. Essa resiliência também se resume ao estado que foi salvo em nome de microsserviço, do qual os microsserviço podem recuperar esse estado, e a se o microsserviço pode reiniciar com êxito.This resiliency also comes down to the state that was saved on behalf of the microservice, where the microservice can recover this state from, and whether the microservice can restart successfully. Em outras palavras, deve haver resiliência na capacidade de computação (o processo pode reiniciar a qualquer momento), bem como resiliência no estado ou nos dados (sem perda de dados e os dados permanecem consistentes).In other words, there needs to be resiliency in the compute capability (the process can restart at any time) as well as resilience in the state or data (no data loss, and the data remains consistent).

Os problemas de resiliência são abordados durante outros cenários, como quando ocorrem falhas durante uma atualização de aplicativo.The problems of resiliency are compounded during other scenarios, such as when failures occur during an application upgrade. O microsserviço, trabalhando com o sistema de implantação, precisa determinar se pode continuar a avançar para a versão mais recente ou, em vez disso, reverter para uma versão anterior para manter um estado consistente.The microservice, working with the deployment system, needs to determine whether it can continue to move forward to the newer version or instead roll back to a previous version to maintain a consistent state. Questões como se computadores suficientes estão disponíveis para continuar avançando e como recuperar versões anteriores do microsserviço precisam ser consideradas.Questions such as whether enough machines are available to keep moving forward and how to recover previous versions of the microservice need to be considered. Isso requer que o microsserviço emita informações de integridade para que o aplicativo geral e o orquestrador possam tomar essas decisões.This requires the microservice to emit health information so that the overall application and orchestrator can make these decisions.

Além disso, a resiliência está relacionada a como sistemas baseados em nuvem devem se comportar.In addition, resiliency is related to how cloud-based systems must behave. Conforme mencionado, um sistema baseado em nuvem deve compreender falhas e tentar se recuperar automaticamente delas.As mentioned, a cloud-based system must embrace failures and must try to automatically recover from them. Por exemplo, no caso de falhas de rede ou um contêiner, aplicativos cliente ou serviços cliente devem ter uma estratégia de repetição de envio de mensagens ou novas tentativas de solicitações, já que, em muitos casos, as falhas na nuvem são parciais.For instance, in case of network or container failures, client apps or client services must have a strategy to retry sending messages or to retry requests, since in many cases failures in the cloud are partial. A seção Implementando aplicativos resilientes neste guia aborda como lidar com falhas parciais.The Implementing Resilient Applications section in this guide addresses how to handle partial failure. Descreve técnicas como novas tentativas com retirada exponencial ou o padrão de Disjuntor no .NET Core usando bibliotecas como Polly, que oferece uma grande variedade de políticas para lidar com esse assunto.It describes techniques like retries with exponential backoff or the Circuit Breaker pattern in .NET Core by using libraries like Polly, which offers a large variety of policies to handle this subject.

Gerenciamento de integridade e diagnóstico em microsserviçosHealth management and diagnostics in microservices

Pode parecer óbvio, e isso muitas vezes é negligenciado, mas um microsserviço deve informar sua integridade e seu diagnóstico.It may seem obvious, and it's often overlooked, but a microservice must report its health and diagnostics. Caso contrário, há pouca percepção de uma perspectiva de operações.Otherwise, there's little insight from an operations perspective. Correlacionar eventos de diagnóstico em um conjunto de serviços independentes e lidar com desvios de relógio do computador para compreender a ordem de eventos é um desafio.Correlating diagnostic events across a set of independent services and dealing with machine clock skews to make sense of the event order is challenging. Da mesma maneira que você interage com um microsserviço sobre protocolos e formatos de dados estabelecidos, existe a necessidade de padronização de como registrar em log a integridade e eventos de diagnóstico que, por fim, terminam em um repositório de eventos para consulta e exibição.In the same way that you interact with a microservice over agreed-upon protocols and data formats, there's a need for standardization in how to log health and diagnostic events that ultimately end up in an event store for querying and viewing. Em uma abordagem de microsserviços, é essencial que diferentes equipes concordem com um formato de log único.In a microservices approach, it's key that different teams agree on a single logging format. Deve haver uma abordagem consistente para exibir eventos de diagnóstico no aplicativo.There needs to be a consistent approach to viewing diagnostic events in the application.

Verificações de integridadeHealth checks

Integridade é diferente de diagnóstico.Health is different from diagnostics. Integridade é sobre o microsserviço relatar seu estado atual para executar as ações apropriadas.Health is about the microservice reporting its current state to take appropriate actions. Um bom exemplo é trabalhar com mecanismos de atualização e implantação para manter a disponibilidade.A good example is working with upgrade and deployment mechanisms to maintain availability. Embora um serviço possa não estar íntegro no momento devido a uma falha de processo ou reinicialização do computador, o serviço ainda pode estar operacional.Although a service might currently be unhealthy due to a process crash or machine reboot, the service might still be operational. A última coisa de que você precisa é tornar isso pior executando uma atualização.The last thing you need is to make this worse by performing an upgrade. A melhor abordagem é fazer uma investigação primeiro ou aguardar até o microsserviço se recuperar.The best approach is to do an investigation first or allow time for the microservice to recover. Eventos de integridade de um microsserviço ajudam-nos a tomar decisões informadas e, na verdade, ajudam a criar serviços com autorrecuperação.Health events from a microservice help us make informed decisions and, in effect, help create self-healing services.

Na seção Implementação de verificações de integridade nos serviços ASP.NET Core deste guia, explicamos como usar uma nova biblioteca ASP.NET HealthChecks em seus microsserviços para que eles possam relatar o próprio estado a um serviço de monitoramento para executar as ações apropriadas.In the Implementing health checks in ASP.NET Core services section of this guide, we explain how to use a new ASP.NET HealthChecks library in your microservices so they can report their state to a monitoring service to take appropriate actions.

Você também tem a opção de usar uma excelente biblioteca de código-fonte aberto chamada Pulse vencer, disponível no GitHub e como um pacote do NuGet.You also have the option of using an excellent open-source library called Beat Pulse, available on GitHub and as a NuGet package. Essa biblioteca também faz verificações de integridade, mas com uma diferença, pois ela lida com dois tipos de verificação:This library also does health checks, with a twist, it handles two types of checks:

  • Vivacidade: verifica se o microsserviço está ativo, ou seja, se ele é capaz de aceitar solicitações e responder.Liveness: Checks if the microservice is alive, that is, if it’s able to accept requests and respond.
  • Preparação: verifica se as dependências do microsserviço (banco de dados, serviços de fila, etc.) estão prontas, de modo que o microsserviço pode fazer o que se espera.Readiness: Checks if the microservice's dependencies (Database, queue services, etc.) are themselves ready, so the microservice can do what it’s supposed to do.

Usando fluxos de eventos de logs e diagnósticoUsing diagnostics and logs event streams

Logs fornecem informações sobre como um aplicativo ou serviço está sendo executado, incluindo exceções, avisos e mensagens informativas simples.Logs provide information about how an application or service is running, including exceptions, warnings, and simple informational messages. Normalmente, cada log está em um formato de texto com uma linha por evento, embora exceções também muitas vezes mostrem o rastreamento de pilha em várias linhas.Usually, each log is in a text format with one line per event, although exceptions also often show the stack trace across multiple lines.

Em aplicativos baseados em servidor monolíticos, você pode simplesmente gravar logs de um arquivo no disco (um arquivo de log) e então analisá-lo com qualquer ferramenta.In monolithic server-based applications, you can simply write logs to a file on disk (a logfile) and then analyze it with any tool. Uma vez que a execução do aplicativo está limitada a um servidor ou VM fixo, geralmente não é complexo demais analisar o fluxo de eventos.Since application execution is limited to a fixed server or VM, it generally isn't too complex to analyze the flow of events. No entanto, em um aplicativo distribuído em que vários serviços são executados em vários nós em um cluster do orquestrador, poder correlacionar eventos distribuídos é um desafio.However, in a distributed application where multiple services are executed across many nodes in an orchestrator cluster, being able to correlate distributed events is a challenge.

Um aplicativo baseado em microsserviço não deve tentar armazenar o fluxo de saída de eventos nem arquivos de log por si só, nem tentar gerenciar o roteamento de eventos para um local central.A microservice-based application should not try to store the output stream of events or logfiles by itself, and not even try to manage the routing of the events to a central place. Ele deve ser transparente, o que significa que cada processo deve gravar apenas seu fluxo de eventos em uma saída padrão que, por baixo, será coletado pela infraestrutura do ambiente de execução em que está sendo executado.It should be transparent, meaning that each process should just write its event stream to a standard output that underneath will be collected by the execution environment infrastructure where it's running. Um exemplo desses roteadores do fluxo de evento é Microsoft.Diagnostic.EventFlow, que coleta os fluxos de eventos de várias fontes e publica-os em sistemas de saída.An example of these event stream routers is Microsoft.Diagnostic.EventFlow, which collects event streams from multiple sources and publishes it to output systems. Eles podem incluir uma saída simples padrão para um ambiente de desenvolvimento ou sistemas de nuvem como o Azure Monitor e o Diagnóstico do Azure.These can include simple standard output for a development environment or cloud systems like Azure Monitor and Azure Diagnostics. Também há boas plataformas e ferramentas de análise de log de terceiros que podem pesquisar, alertar, relatar e monitorar logs, inclusive em tempo real, como Splunk.There are also good third-party log analysis platforms and tools that can search, alert, report, and monitor logs, even in real time, like Splunk.

Orquestradores gerenciando informações de integridade e diagnósticoOrchestrators managing health and diagnostics information

Quando você cria um aplicativo baseado em microsserviço, precisa lidar com a complexidade.When you create a microservice-based application, you need to deal with complexity. Logicamente, é simples lidar com um único microsserviço, mas dezenas ou centenas de tipos e milhares de instâncias de microsserviços são um problema complexo.Of course, a single microservice is simple to deal with, but dozens or hundreds of types and thousands of instances of microservices is a complex problem. Não envolve apenas criar sua arquitetura de microsserviço: você também precisará de alta disponibilidade, capacidade de endereçamento, resiliência, integridade e diagnóstico se você quiser ter um sistema estável e coeso.It isn't just about building your microservice architecture—you also need high availability, addressability, resiliency, health, and diagnostics if you intend to have a stable and cohesive system.

Diagrama de clusters que fornecem uma plataforma de suporte para microservices.

Figura 4-22.Figure 4-22. Uma Plataforma de Microsserviço é fundamental para o gerenciamento de integridade do aplicativoA Microservice Platform is fundamental for an application's health management

É muito difícil você mesmo resolver os problemas complexos mostrados na Figura 4-22.The complex problems shown in Figure 4-22 are very hard to solve by yourself. As equipes de desenvolvimento devem se concentrar na solução de problemas de negócios e na criação de aplicativos personalizados com abordagens baseadas em microsserviço.Development teams should focus on solving business problems and building custom applications with microservice-based approaches. Elas não devem se concentrar na solução de problemas de infraestrutura complexa; se fizessem isso, o custo de qualquer aplicativo baseado em microsserviço seria enorme.They should not focus on solving complex infrastructure problems; if they did, the cost of any microservice-based application would be huge. Portanto, há plataformas orientadas a microsserviços, conhecidas como orquestradores ou clusters de microsserviço, que tentam resolver os problemas de disco rígidos de criar e executar um serviço e usar os recursos de infraestrutura com eficiência.Therefore, there are microservice-oriented platforms, referred to as orchestrators or microservice clusters, that try to solve the hard problems of building and running a service and using infrastructure resources efficiently. Isso reduz as complexidades da criação de aplicativos que usam uma abordagem de microsserviços.This reduces the complexities of building applications that use a microservices approach.

Orquestradores diferentes podem parecer semelhantes, mas o diagnóstico e as verificações de integridade oferecidos por eles diferem em termos de recursos e estado de maturidade, às vezes dependendo da plataforma de sistema operacional, conforme explicado na próxima seção.Different orchestrators might sound similar, but the diagnostics and health checks offered by each of them differ in features and state of maturity, sometimes depending on the OS platform, as explained in the next section.

Recursos adicionaisAdditional resources