Processamento de falhas transitóriasTransient fault handling

Todas as aplicações que comunicam com serviços e recursos remotos devem ser sensíveis a falhas transitórias.All applications that communicate with remote services and resources must be sensitive to transient faults. Tal é especialmente relevante para aplicações que são executadas na cloud, onde a natureza do ambiente e a conectividade na Internet significam que estes tipos de falhas podem ser encontrados mais vezes.This is especially the case for applications that run in the cloud, where the nature of the environment and connectivity over the Internet means these types of faults are likely to be encountered more often. As falhas transitórias incluem a perda momentânea de conectividade de rede para componentes e serviços, a indisponibilidade temporária de um serviço ou os tempos limite que ocorrem quando um serviço está ocupado.Transient faults include the momentary loss of network connectivity to components and services, the temporary unavailability of a service, or timeouts that arise when a service is busy. Estas falhas costumam corrigir-se automaticamente e, se a ação se repetir após um atraso adequado, é provável ter sido bem-sucedida.These faults are often self-correcting, and if the action is repeated after a suitable delay it is likely succeed.

Este documento abrange orientações gerais para o processamento de falhas transitórias.This document covers general guidance for transient fault handling. Para obter informações sobre como processar falhas transitórias ao utilizar os serviços do Microsoft Azure, consulte Orientações de repetição específicas de serviços do Azure.For information about handling transient faults when using Microsoft Azure services, see Azure service-specific retry guidelines.

Por que é que as falhas transitórias ocorrem na cloud?Why do transient faults occur in the cloud?

As falhas transitórias podem ocorrer em qualquer ambiente, em qualquer plataforma ou sistema operativo e em qualquer tipo de aplicação.Transient faults can occur in any environment, on any platform or operating system, and in any kind of application. Em soluções que são executadas numa infraestrutura no local, o desempenho e a disponibilidade da aplicação e respetivos componentes mantêm-se geralmente através de redundância de hardware dispendiosa e, muitas vezes, pouco utilizada, e os componentes e recursos ficam próximos uns dos outros.In solutions that run on local, on-premises infrastructure, performance and availability of the application and its components is typically maintained through expensive and often under-used hardware redundancy, and components and resources are located close to each another. Apesar de isto diminuir as probabilidades de falha, pode ainda originar falhas transitórias, e até uma falha através de eventos imprevistos, como problemas de rede ou alimentação elétrica externa (ou mesmo cenários de desastre).While this makes a failure less likely, it can still result in transient faults - and even an outage through unforeseen events such as external power supply or network issues, or other disaster scenarios.

O alojamento na cloud, incluindo sistemas de cloud privada, podem proporcionar maior disponibilidade geral ao utilizar recursos partilhados, redundância, ativação pós-falha automática e alocação de recursos dinâmica num grande número de nós de computação base.Cloud hosting, including private cloud systems, can offer a higher overall availability by using shared resources, redundancy, automatic failover, and dynamic resource allocation across a huge number of commodity compute nodes. No entanto, a natureza destes ambientes pode significar uma maior probabilidade de falhas transitórias.However, the nature of these environments can mean that transient faults are more likely to occur. Existem diversos motivos para tal:There are several reasons for this:

  • Muitos recursos num ambiente na cloud são partilhados e o acesso a esses recursos está sujeito a limitação para proteger o recurso.Many resources in a cloud environment are shared, and access to these resources is subject to throttling in order to protect the resource. Alguns serviços recusam ligações quando a carga sobe a um nível específico ou quando é atingida uma taxa de débito máxima, de forma a permitir o processamento de pedidos existentes e manter o desempenho do serviço para todos os utilizadores.Some services will refuse connections when the load rises to a specific level, or a maximum throughput rate is reached, in order to allow processing of existing requests and to maintain performance of the service for all users. A limitação ajuda a manter a qualidade do serviço para vizinhos e outros inquilinos que utilizem o recurso partilhado.Throttling helps to maintain the quality of service for neighbors and other tenants using the shared resource.

  • Os ambientes na cloud são criados através de números vastos de unidades de hardware base.Cloud environments are built using vast numbers of commodity hardware units. Proporcionam desempenho ao distribuir de forma dinâmica a carga por várias unidades de computação e componentes de infraestrutura, proporcionando fiabilidade ao reciclar ou substituir unidades falhadas automaticamente.They deliver performance by dynamically distributing the load across multiple computing units and infrastructure components, and deliver reliability by automatically recycling or replacing failed units. Este caráter dinâmico significa que as falhas transitórias e falhas de ligação temporárias podem ocorrer ocasionalmente.This dynamic nature means that transient faults and temporary connection failures may occasionally occur.

  • Normalmente, existem mais componentes de hardware, incluindo infraestrutura de rede, como routers e balanceadores de carga, entre a aplicação e os recursos e serviços que esta utiliza.There are often more hardware components, including network infrastructure such as routers and load balancers, between the application and the resources and services it uses. Esta infraestrutura adicional pode por vezes introduzir mais latência de ligação e falhas de ligação transitória.This additional infrastructure can occasionally introduce additional connection latency and transient connection faults.

  • As ligações de rede entre o cliente e o servidor podem estar disponíveis, especialmente quando a comunicação cruza a Internet.Network conditions between the client and the server may be variable, especially when communication crosses the Internet. Mesmo em localizações no local, cargas de tráfego muito pesadas podem abrandar a comunicação e gerar falhas de ligação intermitentes.Even in on-premises locations, very heavy traffic loads may slow communication and cause intermittent connection failures.

DesafiosChallenges

As falhas transitórias podem ter um grande impacto na perceção de disponibilidade de uma aplicação, mesmo que tenha sido amplamente testada em todas as circunstâncias previstas.Transient faults can have a huge impact on the perceived availability of an application, even if it has been thoroughly tested under all foreseeable circumstances. Para garantir que as aplicações alojadas na cloud funcionam de forma fiável, estas têm de conseguir responder aos seguintes desafios:To ensure that cloud-hosted applications operate reliably, they must be able to respond to the following challenges:

  • A aplicação tem de conseguir detetar falhas quando estas ocorrem e determinar se as falhas podem ser transitórias, mais duradouras ou se são falhas terminais.The application must be able to detect faults when they occur, and determine if these faults are likely to be transient, more long-lasting, or are terminal failures. É provável que recursos diferentes devolvam respostas diferentes quando uma falha ocorre, e estas respostas também podem variar consoante o contexto da operação; por exemplo, a resposta a um erro ao ler a partir de armazenamento pode ser diferente da resposta a um erro de escrita em armazenamento.Different resources are likely to return different responses when a fault occurs, and these responses may also vary depending on the context of the operation; for example, the response for an error when reading from storage may be different from response for an error when writing to storage. Muitos recursos e serviços têm contratos de falhas transitórias documentados.Many resources and services have well-documented transient failure contracts. No entanto, se essa informação não estiver disponível, poderá ser difícil saber a natureza da falha e se esta tem probabilidades de ser transitória.However, where such information is not available, it may be difficult to discover the nature of the fault and whether it is likely to be transient.

  • A aplicação deve conseguir repetir a operação se determinar que a falha tem probabilidades de ser transitória e controlar o número de vezes que a operação foi repetida.The application must be able to retry the operation if it determines that the fault is likely to be transient and keep track of the number of times the operation was retried.

  • A aplicação tem de conseguir utilizar uma estratégia adequada para as repetições.The application must use an appropriate strategy for the retries. A estratégia especifica o número de vezes que deve repetir, o atraso entre cada tentativa e as ações a efetuar após uma tentativa falhada.This strategy specifies the number of times it should retry, the delay between each attempt, and the actions to take after a failed attempt. O número apropriado de tentativas e o atraso entre cada uma costumam ser difíceis de determinar e variam com base no tipo de recurso, bem como as atuais condições de funcionamento do recurso e da aplicação propriamente dita.The appropriate number of attempts and the delay between each one are often difficult to determine, and vary based on the type of resource as well as the current operating conditions of the resource and the application itself.

Orientações geraisGeneral guidelines

As seguintes orientações irão ajudá-lo a conceber um mecanismo de transição adequado para as suas aplicações:The following guidelines will help you to design a suitable transient fault handing mechanism for your applications:

  • Determinar se existe um mecanismo de repetição incorporado:Determine if there is a built-in retry mechanism:

    • Muitos serviços fornecem um SDK ou biblioteca de cliente que contém um mecanismo de processamento de falhas transitórias.Many services provide an SDK or client library that contains a transient fault handling mechanism. Normalmente, a política de repetição que este utiliza está adaptada à natureza e aos requisitos do serviço de destino.The retry policy it uses is typically tailored to the nature and requirements of the target service. Em alternativa, as interfaces REST para serviços podem devolver informações úteis para determinar se uma repetição é apropriada e quanto tempo esperar antes da próxima tentativa de repetição.Alternatively, REST interfaces for services may return information that is useful in determining whether a retry is appropriate, and how long to wait before the next retry attempt.

    • Utilize o mecanismo de repetição incorporado, se estiver disponível, a menos que tenha requisitos específicos e claros que signifiquem que é mais adequado ter um comportamento de repetição diferente.Use the built-in retry mechanism where one is available unless you have specific and well-understood requirements that mean a different retry behavior is more appropriate.

  • Determine se a operação é adequada para repetição:Determine if the operation is suitable for retrying:

    • Apenas deve tentar operações de repetição nos casos em que as falhas são transitórias (o que é normalmente indicado pela natureza do erro) e se existe alguma probabilidade de a operação ser bem-sucedida quando a tentar novamente.You should only retry operations where the faults are transient (typically indicated by the nature of the error), and if there is at least some likelihood that the operation will succeed when reattempted. Não vale a pena tentar novamente operações que indiquem uma operação inválida, como uma atualização de base de dados a um item que não existe, ou pedidos a um serviço ou recurso que sofreu um erro fatalThere is no point in reattempting operations that indicate an invalid operation such as a database update to an item that does not exist, or requests to a service or resource that has suffered a fatal error

    • Em geral, deve tentar repetições apenas nos casos em que é possível determinar o impacto completo e em que as condições estão claras e podem ser validadas.In general, you should implement retries only where the full impact of this can be determined, and the conditions are well understood and can be validated. Se não for o caso, deixe que o código de chamada implemente as repetições.If not, leave it to the calling code to implement retries. Lembre-se de que os erros devolvidos de recursos e serviços não controlados por si podem evoluir ao longo do tempo, e poderá ter de rever a sua lógica de deteção de falhas transitórias.Remember that the errors returned from resources and services outside your control may evolve over time, and you may need to revisit your transient fault detection logic.

    • Quando criar serviços ou componentes, considere implementar códigos de erro e mensagens que ajudem os clientes a determinar se devem repetir operações falhadas.When you create services or components, consider implementing error codes and messages that will help clients determine whether they should retry failed operations. Especificamente, indique se o cliente deve repetir a operação (por exemplo, devolvendo um valor isTransient) e sugira um atraso adequado antes da próxima tentativa de repetição.In particular, indicate if the client should retry the operation (perhaps by returning an isTransient value) and suggest a suitable delay before the next retry attempt. Se criar um serviço Web, considere devolver erros personalizados definidos nos seus contratos de serviço.If you build a web service, consider returning custom errors defined within your service contracts. Apesar de os clientes genéricos não os poderem ler, serão úteis ao criar clientes personalizados.Even though generic clients may not be able to read these, they will be useful when building custom clients.

  • Determine uma contagem de repetições e intervalo adequados:Determine an appropriate retry count and interval:

    • É fundamental otimizar a contagem de repetições e intervalo em função do tipo de caso de utilização.It is vital to optimize the retry count and the interval to the type of use case. Se não repetir um número suficiente de vezes, a aplicação não poderá concluir a operação e é provável que exista uma falha.If you do not retry a sufficient number of times, the application will be unable to complete the operation and is likely to experience a failure. Se repetir demasiadas vezes, ou com intervalos demasiado curtos entre repetições, a aplicação poderá suspender recursos como threads, ligações e memória durante muito tempo, o que terá um impacto negativo no estado da aplicação.If you retry too many times, or with too short an interval between tries, the application can potentially hold resources such as threads, connections, and memory for long periods, which will adversely affect the health of the application.

    • Os valores adequados para o intervalo de tempo e o número de tentativas de repetição dependem do tipo de operação que está a tentar.The appropriate values for the time interval and the number of retry attempts depend on the type of operation being attempted. Por exemplo, se a operação fizer parte de uma interação com o utilizador, o intervalo deverá ser curto e deverão ser tentadas poucas repetições para evitar fazer com que os utilizadores tenham de aguardar por uma resposta (o que mantém ligações abertas e poderá reduzir a disponibilidade para outros utilizadores).For example, if the operation is part of a user interaction, the interval should be short and only a few retries attempted to avoid making users wait for a response (which holds open connections and can reduce availability for other users). Se a operação fizer parte de um fluxo de trabalho crítico ou ativo há muito tempo, no qual é dispendioso ou moroso cancelar e reiniciar o processo, é adequado esperar mais tempo entre tentativas e repetir mais vezes.If the operation is part of a long running or critical workflow, where cancelling and restarting the process is expensive or time-consuming, it is appropriate to wait longer between attempts and retry more times.

    • Determinar os intervalos adequados entre novas tentativas é a parte mais complexa de criar uma estratégia bem-sucedida.Determining the appropriate intervals between retries is the most difficult part of designing a successful strategy. As estratégias normais utilizam os seguintes tipos de intervalo de repetições:Typical strategies use the following types of retry interval:

      • Término exponencial.Exponential back-off. A aplicação aguarda pouco tempo antes da primeira repetição e, em seguida, aumenta exponencialmente os tempos entre cada repetição posterior.The application waits a short time before the first retry, and then exponentially increasing times between each subsequent retry. Por exemplo, poderá repetir a operação após 3 segundos, 12 segundo, 30 segundos e assim por diante.For example, it may retry the operation after 3 seconds, 12 seconds, 30 seconds, and so on.

      • Intervalos incrementais.Incremental intervals. A aplicação aguarda pouco tempo antes da primeira repetição e, em seguida, aumenta incrementalmente os tempos entre cada repetição posterior.The application waits a short time before the first retry, and then incrementally increasing times between each subsequent retry. Por exemplo, poderá repetir a operação após 3 segundos, 7 segundos, 13 segundos, e assim por diante.For example, it may retry the operation after 3 seconds, 7 seconds, 13 seconds, and so on.

      • Intervalos regulares.Regular intervals. A aplicação aguarda o mesmo tempo entre cada tentativa.The application waits for the same period of time between each attempt. Por exemplo pode repetir a operação a cada 3 segundos.For example, it may retry the operation every 3 seconds.

      • Repetição imediata.Immediate retry. Por vezes, as falhas transitórias são extremamente curtas, possivelmente causadas por eventos como uma colisão de pacotes de rede ou um pico num componente de hardware.Sometimes a transient fault is extremely short, perhaps caused by an event such as a network packet collision or a spike in a hardware component. Neste caso, repetir a operação imediatamente é adequado, porque poderá ser bem-sucedida se a falha tiver sido eliminada no tempo que a aplicação demora a preparar-se e enviar o próximo pedido.In this case, retrying the operation immediately is appropriate because it may succeed if the fault has cleared in the time it takes the application to assemble and send the next request. No entanto, nunca deve haver mais do que uma tentativa imediata de repetição, e deve adotar estratégias alternativas, como ações de contingência ou término exponencial, se a tentativa de repetição imediata falhar.However, there should never be more than one immediate retry attempt, and you should switch to alternative strategies, such as such as exponential back-off or fallback actions, if the immediate retry fails.

      • Aleatoriedade.Randomization. Todas as anteriores estratégias de repetição podem incluir aleatoriedade, de forma a impedir múltiplas instâncias do cliente de enviar tentativas de repetição posteriores ao mesmo tempo.Any of the retry strategies listed above may include a randomization to prevent multiple instances of the client sending subsequent retry attempts at the same time. Por exemplo, uma instância pode repetir a operação após 3 segundos, 11 segundos, 28 segundos e assim por diante, ao passo que outra instância pode repetir a operação após 4 segundos, 12 segundos, 26 segundos e assim por diante.For example, one instance may retry the operation after 3 seconds, 11 seconds, 28 seconds, and so on while another instance may retry the operation after 4 seconds, 12 seconds, 26 seconds, and so on. A aleatoriedade é uma técnica útil que pode ser combinada com outras estratégias.Randomization is a useful technique that may be combined with other strategies.

    • Como orientação geral, utilize uma estratégia de término exponencial para operações em segundo plano, bem como estratégias de repetições imediatas ou a intervalos regulares para operações interativas.As a general guideline, use an exponential back-off strategy for background operations, and immediate or regular interval retry strategies for interactive operations. Em ambos os casos, deve escolher o atraso e a contagem de repetições de forma a que a latência máxima de todas as tentativas de repetição estejam dentro do requisito necessário de latência ponto a ponto.In both cases, you should choose the delay and the retry count so that the maximum latency for all retry attempts is within the required end-to-end latency requirement.

    • Tenha em conta a combinação de todos os fatores que contribuem para o tempo limite total máximo de uma operação repetida.Take into account the combination of all the factors that contribute to the overall maximum timeout for a retried operation. Estes fatores incluem o tempo necessário para uma ligação falhada produzir uma resposta (normalmente definido por um valor de tempo limite no cliente) bem como o atraso entre tentativas de repetição e o número máximo de novas tentativas.These factors include the time taken for a failed connection to produce a response (typically set by a timeout value in the client) as well as the delay between retry attempts and the maximum number of retries. O total destas tentativas pode originar tempos de funcionamento total bastante grandes, especialmente ao utilizar uma estratégia de atraso exponencial, na qual o intervalo entre repetições aumenta rapidamente após cada falha.The total of all these times can result in very large overall operation times, especially when using an exponential delay strategy where the interval between retries grows rapidly after each failure. Se um processo tem de cumprir um contrato de nível de serviço específico (SLA), o tempo de funcionamento total, incluindo todos os tempos limite e atrasos, tem de ser dentro dessa definido no SLA.If a process must meet a specific service level agreement (SLA), the overall operation time, including all timeouts and delays, must be within that defined in the SLA.

    • Estratégias de repetição demasiado agressivas, com intervalos muito curtos ou demasiadas tentativas, podem ter um efeito adverso no serviço ou recurso de destino.Over-aggressive retry strategies, which have too short intervals or too many retries, can have an adverse effect on the target resource or service. Isto pode impedir o recurso ou serviço de recuperar do seu estado de sobrecarga, e continuará a bloquear ou recusar pedidos.This may prevent the resource or service from recovering from its overloaded state, and it will continue to block or refuse requests. Isto origina um ciclo vicioso em que são enviados cada vez mais pedidos para o recurso ou serviço. Como consequência, as capacidades de recuperação ficam ainda mais reduzidas.This results in a vicious circle where more and more requests are sent to the resource or service, and consequently its ability to recover is further reduced.

    • Tenha em conta o tempo limite das operações ao selecionar os intervalos de repetições para evitar iniciar uma tentativa posterior imediatamente (por exemplo, se o período de tempo limite for semelhante ao intervalo de repetições).Take into account the timeout of the operations when choosing the retry intervals to avoid launching a subsequent attempt immediately (for example, if the timeout period is similar to the retry interval). Considere também se precisa de manter o período total possível (tempo limite mais os intervalos de repetições) abaixo de um tempo total específico.Also consider if you need to keep the total possible period (the timeout plus the retry intervals) to below a specific total time. As operações com tempos limite anormalmente curtos ou longos podem influenciar o tempo de espera e quantas vezes se repete a operação.Operations that have unusually short or very long timeouts may influence how long to wait, and how often to retry the operation.

    • Utilize o tipo de exceção, e dados contidos na mesma, ou os códigos de erros e mensagens devolvidas pelo serviço, para otimizar o intervalo e o número de repetições.Use the type of the exception and any data it contains, or the error codes and messages returned from the service, to optimize the interval and the number of retries. Por exemplo, algumas exceções ou códigos de erro (como o código HTTP 503, Serviço Indisponível, com um cabeçalho Retry-After na resposta) podem indicar quanto tempo o erro pode durar, ou que o serviço falhou e não irá responder a tentativas posteriores.For example, some exceptions or error codes (such as the HTTP code 503 Service Unavailable with a Retry-After header in the response) may indicate how long the error might last, or that the service has failed and will not respond to any subsequent attempt.

  • Evitar antipadrões:Avoid anti-patterns:

    • Na grande maioria dos casos, deve evitar implementações que incluam camadas duplicadas do código de repetição.In the vast majority of cases, you should avoid implementations that include duplicated layers of retry code. Evite designs que incluam mecanismos de repetição em cascata ou que implementem repetições em todas as fases de uma operação que envolva uma hierarquia de pedidos, a menos que tenha requisitos específicos que o exijam.Avoid designs that include cascading retry mechanisms, or that implement retry at every stage of an operation that involves a hierarchy of requests, unless you have specific requirements that demand this. Nestas circunstâncias excecionais, utilize políticas que impeçam números excessivos em termos de repetições e períodos de atraso, e certifique-se de que compreende as consequências.In these exceptional circumstances, use policies that prevent excessive numbers of retries and delay periods, and make sure you understand the consequences. Por exemplo, se um componente fizer um pedido a outro, que depois acede ao serviço de destino, e implementar a repetição com uma contagem de três em ambas as chamadas, haverá nove tentativas de repetição totais no serviço.For example, if one component makes a request to another, which then accesses the target service, and you implement retry with a count of three on both calls there will be nine retry attempts in total against the service. Muitos serviços e recursos implementam um mecanismo de repetição incorporado, e deve investigar como pode desativar ou modificar esta situação se pretender implementar repetições num nível superior.Many services and resources implement a built-in retry mechanism and you should investigate how you can disable or modify this if you need to implement retries at a higher level.

    • Nunca implemente um mecanismo de repetição permanente.Never implement an endless retry mechanism. Se o fizer, é provável que tal impeça o recurso ou serviço de recuperar de situações de sobrecarga e cause a continuação de limitação e ligações recusadas durante mais tempo.This is likely to prevent the resource or service recovering from overload situations, and cause throttling and refused connections to continue for a longer period. Utilize um número finito de repetições ou implemente um padrão como Disjuntor Automático de forma a permitir que o serviço recupere.Use a finite number or retries, or implement a pattern such as Circuit Breaker to allow the service to recover.

    • Nunca efetue uma repetição imediata mais do que uma vez.Never perform an immediate retry more than once.

    • Evite utilizar um intervalo regular de repetições, especialmente quando tiver um grande número de tentativas de repetição ao aceder a serviços e recursos no Azure.Avoid using a regular retry interval, especially when you have a large number of retry attempts, when accessing services and resources in Azure. A abordagem ideal a este cenário é uma estratégia de término exponencial com capacidade de disjuntor automático.The optimum approach is this scenario is an exponential back-off strategy with a circuit-breaking capability.

    • Impeça múltiplas instâncias do mesmo cliente ou múltiplas instâncias de clientes diferentes de enviar repetições ao mesmo tempo.Prevent multiple instances of the same client, or multiple instances of different clients, from sending retries at the same times. Se for provável que tal ocorra, introduza aleatoriedade nos intervalos de repetição.If this is likely to occur, introduce randomization into the retry intervals.

  • Testar a sua estratégia e implementação de repetições:Test your retry strategy and implementation:

    • Certifique-se de que testa totalmente a sua estratégia de repetições sob um conjunto de circunstâncias tão abrangente quanto possível, especialmente quando a aplicação e os recursos ou serviços de destino que esta utilizem estiverem sujeitos a uma carga extrema.Ensure you fully test your retry strategy implementation under as wide a set of circumstances as possible, especially when both the application and the target resources or services it uses are under extreme load. Para verificar o comportamento durante os testes, pode:To check behavior during testing, you can:

      • Injetar falhas transitórias e não transitórias no serviço.Inject transient and non-transient faults into the service. Por exemplo, envie pedidos inválidos ou adicione código que detete os pedidos de teste e responda com diferentes tipos de erros.For example, send invalid requests or add code that detects test requests and responds with different types of errors. Para obter um exemplo de utilização da TestApi, consulte teste de Injeção de falhas com a TestApi e introdução à TestApi – parte 5: Managed APIs de Injeção de falhas de código.For an example using TestApi, see Fault Injection Testing with TestApi and Introduction to TestApi – Part 5: Managed Code Fault Injection APIs.

      • Crie um modelo do recurso ou serviço que devolva uma série de erros que o serviço real poderá devolver.Create a mock of the resource or service that returns a range of errors that the real service may return. Garanta que abrange todos os tipos de erros que a sua estratégia de repetição foi concebida para detetar.Ensure you cover all the types of error that your retry strategy is designed to detect.

      • Force os erros transitórios ao desativar ou sobrecarregar temporariamente o serviço, se for um serviço personalizado que criou ou implementou (naturalmente, não deve tentar sobrecarregar recursos partilhados ou serviços partilhados no Azure).Force transient errors to occur by temporarily disabling or overloading the service if it is a custom service that you created and deployed (you should not, of course, attempt to overload any shared resources or shared services within Azure).

      • No caso de APIs baseadas em HTTP, considere utilizar a biblioteca do FiddlerCore nos seus testes automatizados para mudar o resultado dos pedidos HTTP, seja ao adicionar mais tempos de ida e volta ou ao alterar a resposta (como o código de estado HTTP, cabeçalhos, corpo ou outros fatores).For HTTP-based APIs, consider using the FiddlerCore library in your automated tests to change the outcome of HTTP requests, either by adding extra roundtrip times or by changing the response (such as the HTTP status code, headers, body, or other factors). Isto permite o teste determinista de um subconjunto de condições de falha, sejam falhas transitórias ou de outros tipos.This enables deterministic testing of a subset of the failure conditions, whether transient faults or other types of failure. Para mais informações, consulte FiddlerCore.For more information, see FiddlerCore. Para obter exemplos de como utilizar a biblioteca, especialmente a classe HttpMangler, examine o código-fonte para o SDK de Armazenamento do Microsoft Azure.For examples of how to use the library, particularly the HttpMangler class, examine the source code for the Azure Storage SDK.

      • Efetue testes simultâneos e de fator de carga elevada para garantir que o mecanismo de repetição e a estratégia funciona corretamente nestas condições e que não tem um efeito negativo no funcionamento do cliente nem causa contaminação cruzada entre pedidos.Perform high load factor and concurrent tests to ensure that the retry mechanism and strategy works correctly under these conditions, and does not have an adverse effect on the operation of the client or cause cross-contamination between requests.

  • Gerir configurações de políticas de repetição:Manage retry policy configurations:

    • Uma política de repetição é uma combinação de todos os elementos da sua estratégia de repetição.A retry policy is a combination of all of the elements of your retry strategy. Esta define o mecanismo de deteção que determina se uma falha é suscetível de ser transitória, o tipo de intervalo a utilizar (regular, término exponencial e aleatoriedade), os valores reais de intervalo e o número de vezes a repetir.It defines the detection mechanism that determines whether a fault is likely to be transient, the type of interval to use (such as regular, exponential back-off, and randomization), the actual interval value(s), and the number of times to retry.

    • As repetições têm de ser implementadas em muitos locais, até na aplicação mais simples, e em todas as camadas de aplicações mais complexas.Retries must be implemented in many places within even the simplest application, and in every layer of more complex applications. Em vez de fazer um hard-coding dos elementos de cada política em múltiplos locais, considere utilizar um ponto central para armazenar todas as políticas.Rather than hard-coding the elements of each policy at multiple locations, consider using a central point for storing all the policies. Por exemplo, armazene os valores como a contagem e intervalo de repetições em ficheiros de configuração da aplicação, leia-os durante o runtime e crie programaticamente as políticas de repetição.For example, store the values such as the interval and retry count in application configuration files, read them at runtime, and programmatically build the retry policies. Desta forma, será mais fácil gerir as definições, modificar e ajustar os valores para responder a requisitos e cenários em mudança.This makes it easier to manage the settings, and to modify and fine tune the values in order to respond to changing requirements and scenarios. No entanto, programe o sistema para armazenar os valores em vez de reler um ficheiro de configuração de cada vez e garanta que são utilizadas predefinições adequadas se não for possível obter os valores da configuração.However, design the system to store the values rather than rereading a configuration file every time, and ensure suitable defaults are used if the values cannot be obtained from configuration.

    • Numa aplicação de Serviços Cloud do Azure, considere armazenar os valores que são utilizados para criar as políticas de repetição no runtime no ficheiro de configuração do serviço, para que possam ser alterados sem que seja necessário reiniciar a aplicação.In an Azure Cloud Services application, consider storing the values that are used to build the retry policies at runtime in the service configuration file so that they can be changed without needing to restart the application.

    • Tire partido das estratégias de repetição incorporadas ou predefinidas nas APIs de cliente que utilize, mas apenas quando tal for adequado para o seu cenário.Take advantage of built-in or default retry strategies available in the client APIs you use, but only where they are appropriate for your scenario. Normalmente, estas estratégias são gerais.These strategies are typically general-purpose. Em alguns casos, pode não ser necessário mais nada, mas noutros cenários, podem não dar a gama completa de opções adequadas aos seus requisitos específicos.In some scenarios they may be all that is required, but in other scenarios they may not offer the full range of options to suit your specific requirements. Tem de compreender como as definições afetam a sua aplicação através de testes para determinar os valores mais adequados.You must understand how the settings will affect your application through testing to determine the most appropriate values.

  • Registar e controlar falhas transitórias e não transitórias:Log and track transient and non-transient faults:

    • Como parte da sua estratégia de repetição, inclua processamento de exceções e outra instrumentação que registe os momentos em que as tentativas de repetição são efetuadas.As part of your retry strategy, include exception handling and other instrumentation that logs when retry attempts are made. Apesar de serem expectáveis falhas transitórias e repetições ocasionais, as quais não indicam problemas, quantidades regulares e cada vez maiores de repetições costumam indicar problemas suscetíveis de causar uma falha ou que afetam atualmente o desempenho e a disponibilidade da aplicação.While an occasional transient failure and retry are to be expected, and do not indicate a problem, regular and increasing numbers of retries are often an indicator of an issue that may cause a failure, or is currently impacting application performance and availability.

    • Registe falhas transitórias como entradas de Aviso em vez de entradas de Erro, para que os sistemas de monitorização não os detetem como erros de aplicação que possam acionar alertas falsos.Log transient faults as Warning entries rather than Error entries so that monitoring systems do not detect them as application errors that may trigger false alerts.

    • Considere armazenar um valor nas suas entradas de registo que indique se as repetições foram causadas por uma limitação no serviço ou por outros tipos de falhas, como falhas de ligação, para que possa distingui-las durante a análise de dados.Consider storing a value in your log entries that indicates if the retries were caused by throttling in the service, or by other types of faults such as connection failures, so that you can differentiate them during analysis of the data. Um aumento no número de erros de limitação costuma ser um indicador de um problema de design na aplicação ou da necessidade de mudar para um serviço premium que ofereça hardware dedicado.An increase in the number of throttling errors is often an indicator of a design flaw in the application or the need to switch to a premium service that offers dedicated hardware.

    • Considere medir e registar o tempo total necessário para as operações que incluam um mecanismo de repetição.Consider measuring and logging the overall time taken for operations that include a retry mechanism. Este é um bom indicador do efeito total das falhas transitórias em termos de tempos de resposta ao utilizador, latência de processos e a eficácia de casos de utilização da aplicação.This is a good indicator of the overall effect of transient faults on user response times, process latency, and the efficiency of the application use cases. Registe também o número de repetições ocorridas para entender os fatores que contribuíram para o tempo de resposta.Also log the number of retries occurred in order to understand the factors that contributed to the response time.

    • Considere implementar um sistema de telemetria e monitorização que possa emitir alertas quando o número e taxa de falhas, o número médio de repetições ou os tempos gerais necessários para as operações serem efetuadas aumente.Consider implementing a telemetry and monitoring system that can raise alerts when the number and rate of failures, the average number of retries, or the overall times taken for operations to succeed, is increasing.

  • Gerir operações que falham continuamente:Manage operations that continually fail:

    • Haverá circunstâncias nas quais a operação continua a falhar em todas as tentativas, e é fundamental considerar como irá gerir esta situação:There will be circumstances where the operation continues to fail at every attempt, and it is vital to consider how you will handle this situation:

      • Apesar de uma estratégia de repetição definir o número máximo de vezes que uma operação deve ser repetida, não impede a aplicação de voltar a efetuar a operação com o mesmo número de repetições.Although a retry strategy will define the maximum number of times that an operation should be retried, it does not prevent the application repeating the operation again, with the same number of retries. Por exemplo, se um serviço de processamento de encomendas falhar com um erro fatal que o coloque permanentemente inativo, a estratégia de repetição poderá detetar um tempo limite de ligação e considerá-lo uma falha transitória.For example, if an order processing service fails with a fatal error that puts it out of action permanently, the retry strategy may detect a connection timeout and consider it to be a transient fault. O código irá repetir a operação um número especificado de vezes e, depois, desistir.The code will retry the operation a specified number of times and then give up. No entanto, quando outro cliente efetuar uma encomenda, a operação será novamente tentada, mesmo que seja certo que irá falhar sempre.However, when another customer places an order, the operation will be attempted again - even though it is sure to fail every time.

      • Para impedir repetições contínuas de operações que falham continuamente, considere implementar o padrão Disjuntor Automático.To prevent continual retries for operations that continually fail, consider implementing the Circuit Breaker pattern. Neste padrão, se o número de falhas num período de tempo especificado exceder o limiar, os pedidos são imediatamente devolvidos ao autor da chamada como erros, sem tentar aceder ao dispositivo ou recurso falhado.In this pattern, if the number of failures within a specified time window exceeds the threshold, requests are returned to the caller immediately as errors, without attempting to access the failed resource or service.

      • Periodicamente, a aplicação pode testar o serviço de forma intermitente e com intervalos muito longos entre pedidos, de forma a detetar quando se irá tornar indisponível.The application can periodically test the service, on an intermittent basis and with very long intervals between requests, to detect when it becomes available. Um intervalo apropriado depende do cenário, tal como a importância da operação e a natureza do serviço, e pode ser qualquer tempo entre poucos minutos e várias horas.An appropriate interval will depend on the scenario, such as the criticality of the operation and the nature of the service, and might be anything between a few minutes and several hours. Quando o teste for bem-sucedido, a aplicação poderá retomar o funcionamento normal e passar pedidos para o serviço acabado de recuperar.At the point where the test succeeds, the application can resume normal operations and pass requests to the newly recovered service.

      • Entretanto, pode ser possível utilizar outra instância do serviço como contingência (possivelmente num centro de dados ou aplicação diferente), utilizar um serviço semelhante que ofereça um funcionamento compatível (talvez mais simples) ou efetue operações alternativas com esperança de que o serviço seja disponibilizado em breve.In the meantime, it may be possible to fall back to another instance of the service (perhaps in a different datacenter or application), use a similar service that offers compatible (perhaps simpler) functionality, or perform some alternative operations in the hope that the service will become available soon. Por exemplo, pode ser adequado armazenar pedidos para o serviço numa fila ou num arquivo de dados e repeti-los posteriormente.For example, it may be appropriate to store requests for the service in a queue or data store and replay them later. Caso contrário, poderá conseguir redirecionar um utilizador para uma instância alternativa da aplicação, degradar o desempenho da aplicação, mas continuar a oferecer um funcionamento aceitável, ou simplesmente devolver uma mensagem ao utilizador a indicar que a aplicação não está atualmente disponível.Otherwise you might be able to redirect the user to an alternative instance of the application, degrade the performance of the application but still offer acceptable functionality, or just return a message to the user indicating that the application is not available at present.

  • Outras consideraçõesOther considerations

    • Ao decidir os valores para o número de repetições e intervalos de repetição numa política, considere se a operação no serviço ou recurso faz parte de uma operação longa ou em múltiplos passos.When deciding on the values for the number of retries and the retry intervals for a policy, consider if the operation on the service or resource is part of a long-running or multi-step operation. Pode ser difícil ou dispendioso compensar todos os outros passos operacionais que já foram bem-sucedidos quando um falha.It may be difficult or expensive to compensate all the other operational steps that have already succeeded when one fails. Neste caso, um intervalo muito longo e um grande número de repetições pode ser aceitável, desde que não bloqueie outras operações ao suspender ou bloquear recursos escassos.In this case, a very long interval and a large number of retries may be acceptable as long as it does not block other operations by holding or locking scarce resources.

    • Considere se repetir a mesma operação poderá causar inconsistências de dados.Consider if retrying the same operation may cause inconsistencies in data. Se algumas partes de um processo em múltiplos passos forem repetidas e se as operações não forem idempotentes, poderá ser originada uma inconsistência.If some parts of a multi-step process are repeated, and the operations are not idempotent, it may result in an inconsistency. Por exemplo, uma operação que incremente um valor, se repetida, irá produzir um resultado inválido.For example, an operation that increments a value, if repeated, will produce an invalid result. Repetir uma operação que envie uma mensagem para uma fila poderá causar uma inconsistência no consumidor da mensagem se não conseguir detetar mensagens duplicadas.Repeating an operation that sends a message to a queue may cause an inconsistency in the message consumer if it cannot detect duplicate messages. Para impedir esta situação, certifique-se de que concebe cada passo como uma operação idempotente.To prevent this, ensure that you design each step as an idempotent operation. Para obter mais informações sobre idempotência, consulte padrões de Idempotência.For more information about idempotency, see Idempotency patterns.

    • Considere o âmbito das operações que serão repetidas.Consider the scope of the operations that will be retried. Por exemplo, pode ser mais fácil implementar o código de repetição num nível que abranja diversas operações e repeti-las se todas falharem.For example, it may be easier to implement retry code at a level that encompasses several operations, and retry them all if one fails. No entanto, fazê-lo poderá resultar em problemas de idempotência ou operações de reversão desnecessárias.However, doing this may result in idempotency issues or unnecessary rollback operations.

    • Se optar por um âmbito de repetição que inclua várias operações, tenha em conta a latência total de todas ao determinar os intervalos de repetição, ao monitorizar o tempo demorado e antes de criar alertas para falhas.If you choose a retry scope that encompasses several operations, take into account the total latency of all of them when determining the retry intervals, when monitoring the time taken, and before raising alerts for failures.

    • Considere como a sua estratégia de repetição poderá afetar os inquilinos vizinhos e outros numa aplicação partilhada ou ao utilizar recursos e serviços partilhados.Consider how your retry strategy may affect neighbors and other tenants in a shared application, or when using shared resources and services. As tentativas de repetição agressivas podem gerar um número maior de falhas transitórias para estes outros utilizadores e para aplicações que partilhem os recursos e serviços.Aggressive retry policies can cause an increasing number of transient faults to occur for these other users and for applications that share the resources and services. De igual modo, a sua aplicação poderá ser afetada pelas políticas de repetição implementadas pelos outros utilizadores dos recursos e serviços.Likewise, your application may be affected by the retry policies implemented by other users of the resources and services. Para aplicações fundamentais, poderá decidir utilizar os serviços premium que não são partilhados.For mission-critical applications, you may decide to use premium services that are not shared. Isto dá-lhe muito mais controlo sobre a carga e consequente limitação destes recursos e serviços, que podem ajudar a justificar o custo adicional.This provides you with much more control over the load and consequent throttling of these resources and services, which can help to justify the additional cost.

Mais informaçõesMore information