Padrão Transação de CompensaçãoCompensating Transaction pattern

Anule o trabalho realizado por uma série de passos, que em conjunto definem uma operação eventualmente consistente, em caso de falha de um ou mais passos.Undo the work performed by a series of steps, which together define an eventually consistent operation, if one or more of the steps fail. As operações que seguem o modelo de consistência eventual estão normalmente presentes em aplicações alojadas na cloud responsáveis pela implementação de fluxos de trabalho e processos de negócio complexos.Operations that follow the eventual consistency model are commonly found in cloud-hosted applications that implement complex business processes and workflows.

Contexto e problemaContext and problem

As aplicações em execução na cloud modificam dados com frequência.Applications running in the cloud frequently modify data. Estes dados podem estar distribuídos por várias origens de dados mantidas em localizações geográficas diferentes.This data might be spread across various data sources held in different geographic locations. Para evitar a contenção e melhorar o desempenho num ambiente distribuído, uma aplicação não deve tentar fornecer uma consistência transacional forte.To avoid contention and improve performance in a distributed environment, an application shouldn't try to provide strong transactional consistency. Em vez disso, a aplicação deve implementar a consistência eventual.Rather, the application should implement eventual consistency. Neste modelo, uma operação de negócio normal é composta por uma série de passos separados.In this model, a typical business operation consists of a series of separate steps. Enquanto estes passos estão a ser realizados, a vista global do estado do sistema poderá estar inconsistente, mas quando a operação estiver concluída e todos os passos tiverem sido executados o sistema deverá ficar consistente novamente.While these steps are being performed, the overall view of the system state might be inconsistent, but when the operation has completed and all of the steps have been executed the system should become consistent again.

O Manual Básico de Consistência de Dados fornece informações relativamente à razão pela qual as transações distribuídas não permitem um dimensionamento eficiente, bem como os princípios do modelo de consistência eventual.The Data Consistency Primer provides information about why distributed transactions don't scale well, and the principles of the eventual consistency model.

Um desafio inerente ao modelo de consistência eventual é como lidar com um passo que falhou.A challenge in the eventual consistency model is how to handle a step that has failed. Neste caso, poderá ser necessário anular todo o trabalho concluído pelos passos anteriores da operação.In this case it might be necessary to undo all of the work completed by the previous steps in the operation. No entanto, os dados não podem ser simplesmente revertidos uma vez que podem ter sido alterados por outras instâncias simultâneas da aplicação.However, the data can't simply be rolled back because other concurrent instances of the application might have changed it. Mesmo nos casos em que os dados não foram alterados por uma instância simultânea, a anulação de um passo pode não ser uma simples questão de restaurar o estado original.Even in cases where the data hasn't been changed by a concurrent instance, undoing a step might not simply be a matter of restoring the original state. Poderá ser necessário aplicar várias regras específicas do negócio (veja o site de viagens descrito na secção Exemplo).It might be necessary to apply various business-specific rules (see the travel website described in the Example section).

Se uma operação que implementa a consistência eventual abranger vários arquivos de dados heterogéneos, anular os passos da operação implicará o acesso individual a cada um dos arquivos de dados.If an operation that implements eventual consistency spans several heterogeneous data stores, undoing the steps in the operation will require visiting each data store in turn. O trabalho realizado em cada arquivo de dados tem de ser anulado de forma fiável para impedir que o sistema fique inconsistente.The work performed in every data store must be undone reliably to prevent the system from remaining inconsistent.

Nem todos os dados afetados por uma operação que implementa a consistência eventual poderão ser mantidos numa base de dados.Not all data affected by an operation that implements eventual consistency might be held in a database. Num ambiente de arquitetura orientado para serviços (SOA), uma operação pode invocar uma ação num serviço e causar uma alteração no estado mantido por esse serviço.In a service oriented architecture (SOA) environment an operation could invoke an action in a service, and cause a change in the state held by that service. Para anular a operação, esta alteração de estado também tem de ser anulada.To undo the operation, this state change must also be undone. Isto pode envolver uma nova invocação do serviço e a realização de outra ação que inverta os efeitos da primeira.This can involve invoking the service again and performing another action that reverses the effects of the first.

SoluçãoSolution

A solução é implementar uma transação de compensação.The solution is to implement a compensating transaction. Os passos de uma transação de compensação têm de anular os efeitos dos passos da operação original.The steps in a compensating transaction must undo the effects of the steps in the original operation. Uma transação de compensação poderá não conseguir substituir simplesmente o estado atual pelo estado em que o sistema se encontrava no início da operação, já que esta abordagem poderia substituir alterações efetuadas por outras instâncias simultâneas de uma aplicação.A compensating transaction might not be able to simply replace the current state with the state the system was in at the start of the operation because this approach could overwrite changes made by other concurrent instances of an application. Em vez disso, tem de ser um processo inteligente que leve em linha de conta todo o trabalho efetuado por instâncias simultâneas.Instead, it must be an intelligent process that takes into account any work done by concurrent instances. Normalmente, este processo será específico em termos de aplicação, condicionado pelo tipo de trabalho realizado pela operação original.This process will usually be application specific, driven by the nature of the work performed by the original operation.

Uma abordagem comum consiste em utilizar um fluxo de trabalho para implementar uma operação eventualmente consistente que necessite de compensação.A common approach is to use a workflow to implement an eventually consistent operation that requires compensation. À medida que a operação original vai avançando, o sistema regista informações sobre cada passo e a forma como o trabalho realizado por esse passo pode ser anulado.As the original operation proceeds, the system records information about each step and how the work performed by that step can be undone. Se a operação falhar em qualquer momento, o fluxo de trabalho reconstitui os passos concluídos e realiza o trabalho que reverte cada passo.If the operation fails at any point, the workflow rewinds back through the steps it's completed and performs the work that reverses each step. Tenha em atenção que uma transação de compensação pode não ter de anular o trabalho pela ordem exatamente inversa da operação original, sendo a execução em paralelo de alguns dos passos de anulação uma possibilidade.Note that a compensating transaction might not have to undo the work in the exact reverse order of the original operation, and it might be possible to perform some of the undo steps in parallel.

Esta abordagem é semelhante à estratégia Sagas abordada no blogue de Clemens Vasters.This approach is similar to the Sagas strategy discussed in Clemens Vasters’ blog.

Uma transação de compensação é também uma operação eventualmente consistente, podendo também falhar.A compensating transaction is also an eventually consistent operation and it could also fail. O sistema deve ser capaz de retomar a transação de compensação no ponto em que a falha ocorreu e prosseguir.The system should be able to resume the compensating transaction at the point of failure and continue. Poderá ser necessário repetir um passo que falhou, pelo que os passos de uma transação de compensação devem ser definidos como comandos idempotentes.It might be necessary to repeat a step that's failed, so the steps in a compensating transaction should be defined as idempotent commands. Para obter mais informações, veja Padrões de Idempotência no blogue de Jonathan Oliver.For more information, see Idempotency Patterns on Jonathan Oliver’s blog.

Em alguns casos, poderá não ser possível recuperar a partir de um passo que falhou, exceto através de intervenção manual.In some cases it might not be possible to recover from a step that has failed except through manual intervention. Nestas situações, o sistema deverá emitir um alerta e fornecer o maior número de informações possível sobre o motivo da falha.In these situations the system should raise an alert and provide as much information as possible about the reason for the failure.

Problemas e consideraçõesIssues and considerations

Na altura de decidir como implementar este padrão, considere os seguintes pontos:Consider the following points when deciding how to implement this pattern:

Por vezes, não é fácil determinar quando um passo de uma operação que implementa a consistência eventual falhou.It might not be easy to determine when a step in an operation that implements eventual consistency has failed. Um passo pode não falhar de imediato, em vez disso pode bloquear.A step might not fail immediately, but instead could block. Poderá ser necessário implementar algum tipo de mecanismo de tempo limite.It might be necessary to implement some form of time-out mechanism.

A lógica de compensação não é fácil de generalizar.-Compensation logic isn't easily generalized. Uma transação de compensação é específica em termos de aplicação.A compensating transaction is application specific. Conta com o facto de a aplicação ter informações suficientes para conseguir anular os efeitos de cada passo numa operação falhada.It relies on the application having sufficient information to be able to undo the effects of each step in a failed operation.

Deve definir os passos de uma transação de compensação como comandos idempotentes.You should define the steps in a compensating transaction as idempotent commands. Isto permite que os passos sejam repetidos se a transação de compensação em si falhar.This enables the steps to be repeated if the compensating transaction itself fails.

A infraestrutura que processa os passos da operação original e a transação de compensação tem de ser flexível.The infrastructure that handles the steps in the original operation, and the compensating transaction, must be resilient. Não pode perder as informações necessárias para compensar um passo com falhas e deve ser capaz de monitorizar o progresso da lógica de compensação de forma fiável.It must not lose the information required to compensate for a failing step, and it must be able to reliably monitor the progress of the compensation logic.

Uma transação de compensação não repõe necessariamente o estado em que os dados do sistema se encontravam no início da operação original.A compensating transaction doesn't necessarily return the data in the system to the state it was in at the start of the original operation. Em vez disso, contrabalança o trabalho realizado pelos passos concluídos com êxito antes de a operação ter falhado.Instead, it compensates for the work performed by the steps that completed successfully before the operation failed.

A ordem dos passos da transação de compensação não tem de ser necessariamente de ser o exato oposto dos passos da operação original.The order of the steps in the compensating transaction doesn't necessarily have to be the exact opposite of the steps in the original operation. Por exemplo, um arquivo de dados pode ser mais suscetível a inconsistências do que outro, pelo que os passos da transação de compensação que anulam as alterações efetuadas a esse arquivo devem ocorrer primeiro.For example, one data store might be more sensitive to inconsistencies than another, and so the steps in the compensating transaction that undo the changes to this store should occur first.

A colocação de um bloqueio de curto prazo baseado num tempo limite em cada recurso necessário à conclusão de uma operação e obtenção destes recursos com antecedência podem ajudar a aumentar a probabilidade de a atividade em geral ser bem-sucedida.Placing a short-term timeout-based lock on each resource that's required to complete an operation, and obtaining these resources in advance, can help increase the likelihood that the overall activity will succeed. O trabalho deve ser realizado apenas depois de todos os recursos terem sido obtidos.The work should be performed only after all the resources have been acquired. Todas as ações têm de estar finalizadas antes de os bloqueios expirarem.All actions must be finalized before the locks expire.

Considere utilizar a lógica de repetição que é comparativamente mais tolerante para minimizar as falhas que acionam uma transação de compensação.Consider using retry logic that is more forgiving than usual to minimize failures that trigger a compensating transaction. Caso um passo de uma operação que implementa a consistência eventual falhe, experimente processar a falha como uma exceção transitória e repita o passo.If a step in an operation that implements eventual consistency fails, try handling the failure as a transient exception and repeat the step. Pare a operação e inicie uma transação de compensação apenas se um passo falhar repetidamente ou de forma irrevogável.Only stop the operation and initiate a compensating transaction if a step fails repeatedly or irrecoverably.

Muitos dos desafios inerentes à implementação de uma transação de compensação são idênticos aos da implementação da consistência eventual.Many of the challenges of implementing a compensating transaction are the same as those with implementing eventual consistency. Veja a secção Considerações sobre a Implementação da Consistência Eventual no Manual Básico de Consistência de Dados para obter mais informações.See the section Considerations for Implementing Eventual Consistency in the Data Consistency Primer for more information.

Quando utilizar este padrãoWhen to use this pattern

Utilize este padrão apenas para operações que têm de ser anuladas em caso de falha.Use this pattern only for operations that must be undone if they fail. Se possível, desenvolva as soluções de modo a evitar a complexidade de recorrerem a transações de compensação.If possible, design solutions to avoid the complexity of requiring compensating transactions.

ExemploExample

Um site de viagens permite a reserva de itinerários por parte dos clientes.A travel website lets customers book itineraries. Um único itinerário pode ser composto por vários voos e hotéis.A single itinerary might comprise a series of flights and hotels. Um cliente que pretende viajar de Seattle para Londres e, em seguida, para Paris poderia executar os seguintes passos ao criar um itinerário:A customer traveling from Seattle to London and then on to Paris could perform the following steps when creating an itinerary:

  1. Reservar um lugar no voo F1 de Seattle para Londres.Book a seat on flight F1 from Seattle to London.
  2. Reservar um lugar no voo F2 de Londres para Paris.Book a seat on flight F2 from London to Paris.
  3. Reservar um lugar no voo F3 de Paris para Seattle.Book a seat on flight F3 from Paris to Seattle.
  4. Reservar um quarto no hotel H1 em Londres.Reserve a room at hotel H1 in London.
  5. Reservar um quarto no hotel H2 em Paris.Reserve a room at hotel H2 in Paris.

Estes passos constituem uma operação eventualmente consistente, apesar de cada passo ser uma ação separada.These steps constitute an eventually consistent operation, although each step is a separate action. Assim, além de realizar estes passos, o sistema também tem de registar as operações de contrapartida necessárias para anular cada passo caso o cliente decida cancelar o itinerário.Therefore, as well as performing these steps, the system must also record the counter operations necessary to undo each step in case the customer decides to cancel the itinerary. Posto isso, os passos necessários para realizar as operações de contrapartida podem ser executados como uma transação de compensação.The steps necessary to perform the counter operations can then run as a compensating transaction.

Tenha em atenção que os passos da transação de compensação podem não ser o exato oposto dos passos originais e que a lógica de cada passo da transação de compensação tem de ter em conta regras específicas de negócio.Notice that the steps in the compensating transaction might not be the exact opposite of the original steps, and the logic in each step in the compensating transaction must take into account any business-specific rules. Por exemplo, a anulação do lugar num voo poderá não dar direito ao reembolso completo do valor pago pelo cliente.For example, unbooking a seat on a flight might not entitle the customer to a complete refund of any money paid. A figura abaixo ilustra a geração de uma transação de compensação para anular uma transação de longa duração destinada a reservar um itinerário.The figure illustrates generating a compensating transaction to undo a long-running transaction to book a travel itinerary.

Gerar uma transação de compensação para anular uma transação de longa duração destinada a reservar um itinerário

Nota

Poderá ser possível executar os passos da transação de compensação em paralelo, dependendo do modo como desenvolveu a lógica de compensação para cada passo.It might be possible for the steps in the compensating transaction to be performed in parallel, depending on how you've designed the compensating logic for each step.

Em muitas soluções de negócio, a falha de um único passo não dita obrigatoriamente a necessidade de reverter o sistema através de uma transação de compensação.In many business solutions, failure of a single step doesn't always necessitate rolling the system back by using a compensating transaction. Por exemplo, se —depois de ter reservado os voos F1, F2 e F3 no cenário do site de viagens—, o cliente não conseguir reservar um quarto no hotel H1, é preferível oferecer ao cliente um quarto num hotel diferente na mesma cidade do que cancelar os voos.For example, if—after having booked flights F1, F2, and F3 in the travel website scenario—the customer is unable to reserve a room at hotel H1, it's preferable to offer the customer a room at a different hotel in the same city rather than canceling the flights. O cliente ainda pode optar por cancelar (em cujo caso a transação de compensação é executada e anula as reservas feitas para os voos F1, F2 e F3), mas esta decisão deve ser tomada pelo cliente e não pelo sistema.The customer can still decide to cancel (in which case the compensating transaction runs and undoes the bookings made on flights F1, F2, and F3), but this decision should be made by the customer rather than by the system.

Os padrões e orientações que se seguem também podem ser relevantes ao implementar este padrão:The following patterns and guidance might also be relevant when implementing this pattern:

  • Manual Básico de Consistência de Dados.Data Consistency Primer. O padrão Transação de Compensação é muitas vezes utilizado para anular operações que implementam o modelo de consistência eventual.The Compensating Transaction pattern is often used to undo operations that implement the eventual consistency model. Este manual básico fornece informações sobre as vantagens e as soluções de compromisso da consistência eventual.This primer provides information on the benefits and tradeoffs of eventual consistency.

  • Padrão do Supervisor do agente do Scheduler.Scheduler-Agent-Supervisor pattern. Descreve como implementar sistemas flexíveis que realizam operações de negócio que utilizam recursos e serviços distribuídos.Describes how to implement resilient systems that perform business operations that use distributed services and resources. Por vezes, poderá ser necessário anular o trabalho realizado por uma operação através de uma transação de compensação.Sometimes, it might be necessary to undo the work performed by an operation by using a compensating transaction.

  • Padrão repetição.Retry pattern. As transações de compensação podem ser dispendiosas, sendo possível minimizar a sua utilização com a implementação de uma política eficiente centrada na repetição de operações com falhas com o padrão Repetição.Compensating transactions can be expensive to perform, and it might be possible to minimize their use by implementing an effective policy of retrying failing operations by following the Retry pattern.