Conceção para recuperação automáticaDesign for self healing

Criar a sua aplicação de forma a recuperar-se automaticamente quando ocorrem falhasDesign your application to be self healing when failures occur

Num sistema distribuído, as falhas ocorrem.In a distributed system, failures happen. O hardware pode falhar.Hardware can fail. A rede pode sofrer falhas transitórias.The network can have transient failures. Raramente, poderão ocorrer interrupções em todo um serviço ou região, mas até estas têm de ser previstas.Rarely, an entire service or region may experience a disruption, but even those must be planned for.

Por conseguinte, crie a sua aplicação de forma a recuperar-se automaticamente quando ocorrem falhas.Therefore, design an application to be self healing when failures occur. Isto requer uma abordagem tripla:This requires a three-pronged approach:

  • Detetar falhas.Detect failures.
  • Responder a falhas corretamente.Respond to failures gracefully.
  • Registar e monitorizar falhas para fornecer informações operacionais.Log and monitor failures, to give operational insight.

A forma como responde a um tipo específico de falha pode depender dos requisitos de disponibilidade da sua aplicação.How you respond to a particular type of failure may depend on your application's availability requirements. Por exemplo, se necessitar de disponibilidade muito elevada, poderá efetuar automaticamente a ativação pós-falha para uma região secundária durante uma falha regional.For example, if you require very high availability, you might automatically fail over to a secondary region during a regional outage. No entanto, será cobrado um custo mais elevado do que por uma implementação numa única região.However, that will incur a higher cost than a single-region deployment.

Além disso, não considere apenas grandes eventos como falhas regionais, que são geralmente raras.Also, don't just consider big events like regional outages, which are generally rare. Deve focar-se tanto, se não mais, no processamento de falhas locais de curta duração, como falhas de conectividade de rede ou ligações falhadas de base de dados.You should focus as much, if not more, on handling local, short-lived failures, such as network connectivity failures or failed database connections.

RecomendaçõesRecommendations

Repita as operações com falhas.Retry failed operations. As falhas transitórias podem ocorrer devido a uma perda momentânea de conectividade de rede, uma ligação de base de dados pendente ou um tempo limite quando um serviço está ocupado.Transient failures may occur due to momentary loss of network connectivity, a dropped database connection, or a timeout when a service is busy. Incorpore uma lógica de repetição na aplicação para processar falhas transitórias.Build retry logic into your application to handle transient failures. Para vários serviços do Azure, o SDK de cliente implementa tentativas automáticas.For many Azure services, the client SDK implements automatic retries. Para obter mais informações, consulte [processamento de falhas transitórias] transient-fault-handling e o padrão repetição.For more information, see Transient fault handling and the Retry pattern.

Proteja os serviços remotos com falhas (Disjuntor Automático).Protect failing remote services (Circuit Breaker). É boa prática repetir após uma falha transitória, mas se a falha persistir, pode acabar por ficar com demasiados autores de chamadas a insistir num serviço com falhas.It's good to retry after a transient failure, but if the failure persists, you can end up with too many callers hammering a failing service. Isto pode levar a falhas em cascata, à medida que os pedidos recuam.This can lead to cascading failures, as requests back up. Utilize o [padrão de disjuntor automático] circuit-breaker falhe depressa (sem efetuar a chamada remota) quando uma operação é provável que falhe.Use the Circuit Breaker pattern to fail fast (without making the remote call) when an operation is likely to fail.

Isole os recursos críticos (Bulkhead).Isolate critical resources (Bulkhead). Por vezes, as falhas num subsistema podem propagar-se.Failures in one subsystem can sometimes cascade. Isto pode acontecer se uma falha fizer com que alguns recursos, tais como threads ou sockets, não sejam libertados atempadamente, levando ao esgotamento dos recursos.This can happen if a failure causes some resources, such as threads or sockets, not to get freed in a timely manner, leading to resource exhaustion. Para evitar isto, particione um sistema em grupos isolados, para que uma falha de uma partição não prejudique todo o sistema.To avoid this, partition a system into isolated groups, so that a failure in one partition does not bring down the entire system.

Efetue o nivelamento de carga.Perform load leveling. As aplicações podem ter picos repentino de tráfego, que podem sobrecarregar os serviços de back-end.Applications may experience sudden spikes in traffic that can overwhelm services on the backend. Para evitar isto, utilize o [padrão de nivelamento de carga baseada na fila] load-level para a fila de itens de trabalho para executar de maneira assíncrona.To avoid this, use the Queue-Based Load Leveling pattern to queue work items to run asynchronously. A fila funciona como uma memória intermédia que suaviza os picos da carga.The queue acts as a buffer that smooths out peaks in the load.

Efetue a ativação pós-falha.Fail over. Se não for possível aceder uma instância, efetue a ativação pós-falha para outra instância.If an instance can't be reached, fail over to another instance. Para recursos sem estado, como um servidor Web, coloque várias instâncias por trás de um balanceador de carga ou gestor de tráfego.For things that are stateless, like a web server, put several instances behind a load balancer or traffic manager. Para recursos que armazenam o estado, como uma base de dados, utilize réplicas e efetue a ativação pós-falha.For things that store state, like a database, use replicas and fail over. Consoante o arquivo de dados e como replica, isto pode requerer que a aplicação lide com a consistência eventual.Depending on the data store and how it replicates, this may require the application to deal with eventual consistency.

Compense transações falhadas.Compensate failed transactions. Em geral, evite transações distribuídas, pois requerem a coordenação em serviços e recursos.In general, avoid distributed transactions, as they require coordination across services and resources. Em vez disso, componha uma operação de transações individuais mais pequenas.Instead, compose an operation from smaller individual transactions. Se a operação falhar a meio, utilize Transações de Compensação para anular qualquer passo que já tiver sido concluído.If the operation fails midway through, use Compensating Transactions to undo any step that already completed.

Utilize pontos de verificação para transações de longa duração.Checkpoint long-running transactions. Os pontos de verificação podem fornecer resiliência se uma operação de longa duração falhar.Checkpoints can provide resiliency if a long-running operation fails. Quando a operação reiniciar (por exemplo, é recolhida por outra VM), pode ser retomada a partir do último ponto de verificação.When the operation restarts (for example, it is picked up by another VM), it can be resumed from the last checkpoint.

Diminua corretamente.Degrade gracefully. Por vezes, não é possível resolver um problema, mas pode fornecer funcionalidade reduzida, que é útil.Sometimes you can't work around a problem, but you can provide reduced functionality that is still useful. Considere uma aplicação que mostra um catálogo de livros.Consider an application that shows a catalog of books. Se a aplicação não conseguir obter a imagem em miniatura da capa, poderá mostrar uma imagem de marcador de posição.If the application can't retrieve the thumbnail image for the cover, it might show a placeholder image. Subsistemas completos poderão não ser críticos para a aplicação.Entire subsystems might be noncritical for the application. Por exemplo, num site de comércio eletrónico, mostrar recomendações de produto é provavelmente menos crítico do que processar encomendas.For example, in an e-commerce site, showing product recommendations is probably less critical than processing orders.

Limite os clientes.Throttle clients. Por vezes, um pequeno número de utilizadores cria uma carga excessiva, o que poderá reduzir a disponibilidade da aplicação para outros utilizadores.Sometimes a small number of users create excessive load, which can reduce your application's availability for other users. Nesta situação, limite o cliente para um determinado período de tempo.In this situation, throttle the client for a certain period of time. Consulte a padrão de limitação.See the Throttling pattern.

Bloqueie as pessoas mal-intencionadas.Block bad actors. Limitar um cliente não implica que este não aja maliciosamente.Just because you throttle a client, it doesn't mean client was acting maliciously. Só significa que o cliente excedeu a respetiva quota de serviço.It just means the client exceeded their service quota. Mas, se um cliente exceder constantemente a sua quota ou se comportar incorretamente, pode bloqueá-lo.But if a client consistently exceeds their quota or otherwise behaves badly, you might block them. Defina um processo fora de banda para que o utilizador solicite o desbloqueio.Define an out-of-band process for user to request getting unblocked.

Utilize a eleição de coordenador.Use leader election. Quando precisar de coordenar uma tarefa, utilize a Eleição de Coordenador para selecionar um coordenador.When you need to coordinate a task, use Leader Election to select a coordinator. Dessa forma, o coordenador não é um ponto único de falha.That way, the coordinator is not a single point of failure. Se o coordenador falhar, é selecionado um novo.If the coordinator fails, a new one is selected. Em vez de implementar um algoritmo de eleição de coordenador do zero, considere uma solução pronta a utilizar, como o Zookeeper.Rather than implement a leader election algorithm from scratch, consider an off-the-shelf solution such as Zookeeper.

Teste com a inserção de falhas.Test with fault injection. Com muita frequência, o caminho para o sucesso é bem testado, mas o caminho para o fracasso não o é.All too often, the success path is well tested but not the failure path. Um sistema pode ser executado em produção por um longo período de tempo antes de o caminho para o fracasso ser executado.A system could run in production for a long time before a failure path is exercised. Utilize a inserção de falhas para testar a resiliência do sistema a falhas, ao acionar falhas reais ou simulando-las.Use fault injection to test the resiliency of the system to failures, either by triggering actual failures or by simulating them.

Adote a engenharia do caos.Embrace chaos engineering. A engenharia do caos expande a noção de inserção de falhas, ao inserir aleatoriamente falhas ou condições anormais em instâncias de produção.Chaos engineering extends the notion of fault injection, by randomly injecting failures or abnormal conditions into production instances.

Para obter uma abordagem estruturada sobre como fazer com que as aplicações se recuperem automaticamente, veja Conceber aplicações resilientes para o Azure.For a structured approach to making your applications self healing, see Design resilient applications for Azure.