Tratar falhas parciaisHandle partial failure

Em sistemas distribuídos como aplicativos baseados em microsserviços, há um risco de falha parcial sempre presente.In distributed systems like microservices-based applications, there's an ever-present risk of partial failure. Por exemplo, um único microsserviço/contêiner pode falhar ou pode não estar disponível para responder por um curto período, ou um único servidor ou VM pode falhar.For instance, a single microservice/container can fail or might not be available to respond for a short time, or a single VM or server can crash. Como clientes e serviços são processos separados, um serviço pode não ser capaz de responder de forma oportuna a uma solicitação do cliente.Since clients and services are separate processes, a service might not be able to respond in a timely way to a client’s request. O serviço pode estar sobrecarregado e respondendo a solicitações de maneira muito lenta ou pode simplesmente não estar acessível durante um curto período devido a problemas de rede.The service might be overloaded and responding very slowly to requests or might simply not be accessible for a short time because of network issues.

Por exemplo, considere a página de detalhes Ordem do aplicativo de exemplo eShopOnContainers.For example, consider the Order details page from the eShopOnContainers sample application. Se o microsserviço de ordenação não estiver respondendo quando o usuário tentar enviar uma ordem, uma implementação incorreta do processo do cliente (o aplicativo Web MVC) – por exemplo, se o código do cliente usasse RPCs síncronos sem tempo limite – bloqueará threads indefinidamente que estão aguardando uma resposta.If the ordering microservice is unresponsive when the user tries to submit an order, a bad implementation of the client process (the MVC web application)—for example, if the client code were to use synchronous RPCs with no timeout—would block threads indefinitely waiting for a response. Além de criar uma experiência de usuário ruim, toda espera sem resposta consome ou bloqueia um thread, e os threads são extremamente valiosos em aplicativos altamente escalonáveis.Besides creating a bad user experience, every unresponsive wait consumes or blocks a thread, and threads are extremely valuable in highly scalable applications. Se houver muitos threads bloqueados, o tempo de execução do aplicativo poderá eventualmente ficar sem threads.If there are many blocked threads, eventually the application’s runtime can run out of threads. Nesse caso, o aplicativo poderá ficar globalmente sem resposta, em vez de apenas parcialmente sem resposta, como mostra a Figura 8-1.In that case, the application can become globally unresponsive instead of just partially unresponsive, as shown in Figure 8-1.

Diagrama ilustrando o parágrafo anterior

Figura 8-1.Figure 8-1. Falhas parciais devido a dependências que afetam a disponibilidade do thread de serviçoPartial failures because of dependencies that impact service thread availability

Em um aplicativo grande baseado em microsserviços, falhas parciais poderão ser amplificadas, principalmente se a maioria da interação interna dos microsserviços for baseada em chamadas HTTP síncronas (o que é considerado um antipadrão).In a large microservices-based application, any partial failure can be amplified, especially if most of the internal microservices interaction is based on synchronous HTTP calls (which is considered an anti-pattern). Pense em um sistema que recebe milhões de chamadas de entrada por dia.Think about a system that receives millions of incoming calls per day. Se o sistema tiver um design ruim baseado em longas cadeias de chamadas HTTP síncronas, essas chamadas de entrada poderão resultar em muito mais milhões de chamadas de saída (vamos supor uma razão de 1:4) a dezenas de microsserviços internos como dependências síncronas.If your system has a bad design that's based on long chains of synchronous HTTP calls, these incoming calls might result in many more millions of outgoing calls (let’s suppose a ratio of 1:4) to dozens of internal microservices as synchronous dependencies. Essa situação é mostrada na Figura 8-2, principalmente a dependência #3.This situation is shown in Figure 8-2, especially dependency #3.

Um design incorreto de microsserviço de aplicativo Web que depende de uma cadeia de dependências em outros microsserviços

Figura 8-2.Figure 8-2. O impacto de ter um design incorreto com longas cadeias de solicitações HTTPThe impact of having an incorrect design featuring long chains of HTTP requests

A falha intermitente é garantida em um sistema distribuído e baseado em nuvem, mesmo quando cada dependência têm uma disponibilidade excelente.Intermittent failure is guaranteed in a distributed and cloud-based system, even if every dependency itself has excellent availability. Esse um fato que você precisa considerar.It's a fact you need to consider.

Se você não criar nem implementar técnicas para garantir a tolerância a falhas, até mesmo pequenos tempos de inatividade poderão ser amplificados.If you do not design and implement techniques to ensure fault tolerance, even small downtimes can be amplified. Por exemplo, 50 dependências, cada uma com 99,99% de disponibilidade, poderia resultar em várias horas de tempo de inatividade por mês devido a esse efeito de ondulação.As an example, 50 dependencies each with 99.99% of availability would result in several hours of downtime each month because of this ripple effect. Quando uma dependência de microsserviço falhar ao manipular um alto volume de solicitações, essa falha poderá saturar rapidamente todos os threads de solicitação disponíveis em cada serviço e causar uma pane em todo o aplicativo.When a microservice dependency fails while handling a high volume of requests, that failure can quickly saturate all available request threads in each service and crash the whole application.

As falhas parciais podem ser gravemente amplificadas pelas dependências encadeadas

Figura 8-3.Figure 8-3. Falha parcial amplificada por microsserviços com longas cadeias de chamadas HTTP síncronasPartial failure amplified by microservices with long chains of synchronous HTTP calls

Para minimizar esse problema, na seção A integração assíncrona do microsserviço impõe a autonomia do microsserviço, esse guia indica o uso da comunicação assíncrona entre os microsserviços internos.To minimize this problem, in the section Asynchronous microservice integration enforce microservice’s autonomy, this guide encourages you to use asynchronous communication across the internal microservices.

Além disso, é essencial que você crie seus aplicativos cliente e microsserviços para lidar com falhas parciais, ou seja, crie microsserviços e aplicativos cliente resilientes.In addition, it's essential that you design your microservices and client applications to handle partial failures—that is, to build resilient microservices and client applications.