Estratégias para tratar falhas parciaisStrategies to handle partial failure

As estratégias para lidar com falhas parciais incluem o seguinte.Strategies for dealing with partial failures include the following.

Usar a comunicação assíncrona (por exemplo, comunicação baseada em mensagens) entre microsserviços internos.Use asynchronous communication (for example, message-based communication) across internal microservices. É altamente recomendado não criar cadeias longas de chamadas HTTP síncronas entre os microsserviços internos, porque esse design incorreto poderá se tornar a principal causa de interrupções incorretas.It's highly advisable not to create long chains of synchronous HTTP calls across the internal microservices because that incorrect design will eventually become the main cause of bad outages. Pelo contrário, exceto pelas comunicações de front-end entre os aplicativos cliente e o primeiro nível de microsserviços ou Gateways de API refinados, é recomendado usar apenas a comunicação assíncrona (com base em mensagem) uma vez após o ciclo inicial de resposta/solicitação, entre os microsserviços internos.On the contrary, except for the front-end communications between the client applications and the first level of microservices or fine-grained API Gateways, it's recommended to use only asynchronous (message-based) communication once past the initial request/response cycle, across the internal microservices. Consistência eventual e arquiteturas orientadas a eventos ajudarão a minimizar os efeitos de ondulação.Eventual consistency and event-driven architectures will help to minimize ripple effects. Essas abordagens impõem um nível mais alto de autonomia do microsserviço e, portanto, previnem contra o problema observado aqui.These approaches enforce a higher level of microservice autonomy and therefore prevent against the problem noted here.

Usar novas tentativas com retirada exponencial.Use retries with exponential backoff. Essa técnica ajuda a evitar falhas curtas e intermitentes executando novas tentativas de chamada um determinado número de vezes, caso o serviço não tivesse estado disponível apenas por um curto período de tempo.This technique helps to avoid short and intermittent failures by performing call retries a certain number of times, in case the service was not available only for a short time. Isso pode ocorrer devido a problemas de rede intermitentes ou quando um microsserviço/contêiner é movido para um nó diferente em um cluster.This might occur due to intermittent network issues or when a microservice/container is moved to a different node in a cluster. No entanto, se essas novas tentativas não foram criadas corretamente com disjuntores, os efeitos de ondulação poderão ser agravados e, em último caso, poderá até haver uma DoS (Negação de Serviço).However, if these retries are not designed properly with circuit breakers, it can aggravate the ripple effects, ultimately even causing a Denial of Service (DoS).

Solução alternativa para tempos limite de rede.Work around network timeouts. Em geral, os clientes devem ser criados para não serem bloqueados indefinidamente e para sempre usar tempos limite ao aguardar uma resposta.In general, clients should be designed not to block indefinitely and to always use timeouts when waiting for a response. Usar tempos limite garante que os recursos nunca fiquem bloqueados indefinidamente.Using timeouts ensures that resources are never tied up indefinitely.

Usar o padrão de disjuntor.Use the Circuit Breaker pattern. Nessa abordagem, o processo do cliente rastreia o número de solicitações com falha.In this approach, the client process tracks the number of failed requests. Se a taxa de erro exceder um limite configurado, um "disjuntor" viajará para que outras tentativas falhem imediatamente.If the error rate exceeds a configured limit, a “circuit breaker” trips so that further attempts fail immediately. (Se um alto número de solicitações estão apresentando falha, isso sugere que o serviço não está disponível e que enviar solicitações é inútil.) Após um período de tempo limite, o cliente deverá tentar novamente e, se as novas solicitações forem bem-sucedidas, feche o disjuntor.(If a large number of requests are failing, that suggests the service is unavailable and that sending requests is pointless.) After a timeout period, the client should try again and, if the new requests are successful, close the circuit breaker.

Fornecer fallbacks.Provide fallbacks. Nessa abordagem, o processo de cliente executa a lógica de fallback quando uma solicitação falha, como retornar dados armazenados em cache ou um valor padrão.In this approach, the client process performs fallback logic when a request fails, such as returning cached data or a default value. Essa é uma abordagem adequada para consultas e é mais complexa para atualizações ou comandos.This is an approach suitable for queries, and is more complex for updates or commands.

Limitar o número de solicitações na fila.Limit the number of queued requests. Os clientes também devem impor um limite superior no número de solicitações pendentes que um microsserviço cliente pode enviar para um serviço específico.Clients should also impose an upper bound on the number of outstanding requests that a client microservice can send to a particular service. Se o limite for atingido, provavelmente será ineficaz fazer mais solicitações. As tentativas falharão imediatamente.If the limit has been reached, it's probably pointless to make additional requests, and those attempts should fail immediately. Em termos de implementação, a política Isolamento do bulkhead da Polly pode ser usada para atender a esse requisito.In terms of implementation, the Polly Bulkhead Isolation policy can be used to fulfill this requirement. Essa abordagem é essencialmente uma restrição de paralelização com SemaphoreSlim como a implementação.This approach is essentially a parallelization throttle with SemaphoreSlim as the implementation. Ela também permite uma "fila" fora do bulkhead.It also permits a "queue" outside the bulkhead. É possível lançar proativamente uma carga excessiva mesmo antes da execução (por exemplo, devido à capacidade ser considerada cheia).You can proactively shed excess load even before execution (for example, because capacity is deemed full). Isso torna sua resposta a determinados cenários de falha mais rápida do que um disjuntor seria, uma vez que o disjuntor aguarda as falhas.This makes its response to certain failure scenarios faster than a circuit breaker would be, since the circuit breaker waits for the failures. O objeto BulkheadPolicy na Polly expõe se o bulkhead e a fila estão cheios e oferece eventos em estouro, portanto, ele também pode ser usado para permitir a escala horizontal automatizada.The BulkheadPolicy object in Polly exposes how full the bulkhead and queue are, and offers events on overflow so can also be used to drive automated horizontal scaling.

Recursos adicionaisAdditional resources