Telafi İşlemi düzeniCompensating Transaction pattern

Hep birlikte sonunda tutarlı bir işlemi tanımlayan bir dizi adımda gerçekleştirilen bir çalışmayı, adımlardan biri veya daha fazlası başarısız olduysa geri alın.Undo the work performed by a series of steps, which together define an eventually consistent operation, if one or more of the steps fail. Karmaşık iş süreçleri ve iş akışları uygulayan, bulutta barındırılan uygulamalarda son tutarlılık modelini izleyen işlemler yaygın olarak kullanılır.Operations that follow the eventual consistency model are commonly found in cloud-hosted applications that implement complex business processes and workflows.

Bağlam ve sorunContext and problem

Bulutta çalışan uygulamalar verileri sık sık değiştirir.Applications running in the cloud frequently modify data. Bu veriler, farklı coğrafi konumlarda tutulan çeşitli veri kaynaklarına yayılmış olabilir.This data might be spread across various data sources held in different geographic locations. Çekişmenin önlenmesi ve dağıtılmış bir ortamda performansın artması için bir uygulamanın güçlü işlemsel tutarlılık sağlamaya çalışmaması gerekir.To avoid contention and improve performance in a distributed environment, an application shouldn't try to provide strong transactional consistency. Bunun yerine, uygulama nihai tutarlılık uygulamalıdır.Rather, the application should implement eventual consistency. Bu modelde, tipik bir iş işlemi bir dizi ayrı adımdan oluşur.In this model, a typical business operation consists of a series of separate steps. Bu adımlar gerçekleştirildiği sırada sistem durumunun genel görünümü tutarsız olabilir, ancak işlem tamamlanıp tüm adımlar yürütüldükten sonra sistem yeniden tutarlı duruma gelmelidir.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.

Veri Tutarlılığı Temel Bilgileri sayfasında dağıtılmış işlemlerin niye düzgün ölçeklendirilemediği ve son tutarlılık modelinin ilkeleri hakkında bilgi sağlanır.The Data Consistency Primer provides information about why distributed transactions don't scale well, and the principles of the eventual consistency model.

Son tutarlılık modelinde karşılaşılan bir zorluk, başarısız olan bir adımın nasıl işleneceği ile ilgilidir.A challenge in the eventual consistency model is how to handle a step that has failed. Bu durumda, işlemin önceki adımları tarafından tamamlanan tüm işlerin geri alınması gerekebilir.In this case it might be necessary to undo all of the work completed by the previous steps in the operation. Ancak, veriler uygulamanın diğer eş zamanlı örnekleri tarafından değiştirilmiş olabileceğinden basitçe geri alınamayabilir.However, the data can't simply be rolled back because other concurrent instances of the application might have changed it. Verilerin eş zamanlı bir örnek tarafından değiştirilmediği durumlarda bile bir adımın geri alınması doğrudan özgün durumun geri yüklenmesi anlamına gelmeyebilir.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. İşe özgü çeşitli kuralların uygulanması gerekli olabilir (Örnek bölümünde açıklanan yolculuk web sitesine bakın).It might be necessary to apply various business-specific rules (see the travel website described in the Example section).

Son tutarlılık uygulayan bir işlem birden fazla heterojen veri deposuna yayılmış durumdaysa, işlemdeki adımların geri alınabilmesi için her veri deposunun sırayla ziyaret edilmesi gerekir.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. Sistemin tutarsız kalmasının önlenmesi için her veri deposunda gerçekleştirilen çalışmaların güvenilir bir şekilde geri alınması gerekir.The work performed in every data store must be undone reliably to prevent the system from remaining inconsistent.

Son tutarlılık uygulayan bir işlemden etkilenen tüm veriler bir veritabanında tutulmuyor olabilir.Not all data affected by an operation that implements eventual consistency might be held in a database. Bir hizmet odaklı mimari (SOA) ortamında, işlemler tarafından bir hizmetteki bir eylem çağrılarak bu hizmetin durumunda bir değişikliğe neden olunabilir.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. İşlemin geri alınması için bu durum değişikliği de geri alınmalıdır.To undo the operation, this state change must also be undone. Bu, hizmetin yeniden çağrılmasını ve ilk eylemin etkilerini tersine çeviren başka bir eylemin gerçekleştirilmesini gerektirebilir.This can involve invoking the service again and performing another action that reverses the effects of the first.

ÇözümSolution

Çözüm, telafi edici bir işlem uygulamaktır.The solution is to implement a compensating transaction. Bir telafi işleminin adımları, özgün işlemdeki adımların etkilerini geri almalıdır.The steps in a compensating transaction must undo the effects of the steps in the original operation. Bu yaklaşımda bir uygulamanın diğer eş zamanlı örnekleri tarafından yapılan değişikliklerin üzerine yazılamadığından, bir telafi işlemi geçerli durumu basitçe sistemin işlemden önceki durumu olarak değiştiremeyebilir.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. Bunun yerine, eş zamanlı örnekler tarafından gerçekleştirilen tüm işleri hesaba katan akıllı bir işlem olmalıdır.Instead, it must be an intelligent process that takes into account any work done by concurrent instances. Genellikle uygulamaya özgü olan bu işlem, özgün işlem tarafından gerçekleştirilen işin yapısını temel alan bir işlem olacaktır.This process will usually be application specific, driven by the nature of the work performed by the original operation.

Bir iş akışı kullanarak telafi gerektiren bir son tutarlılık işlemi uygulamak yaygın olarak benimsenen bir yaklaşımdır.A common approach is to use a workflow to implement an eventually consistent operation that requires compensation. Özgün işlem devam ettiği sırada sistem, her bir adım ve bu adım tarafından gerçekleştirilen işin nasıl geri alınabileceği ile ilgili bilgileri kaydeder.As the original operation proceeds, the system records information about each step and how the work performed by that step can be undone. Herhangi bir noktada işlem başarısız olursa, iş akışı tamamladığı adımlar üzerinden geri alınır ve her bir adımı tersine çeviren işler gerçekleştirilir.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. Telafi işlemlerinin özgün işlemdeki sıralamayı tam olarak tersine çevirmek zorunda kalmayabileceğini ve bazı geri alma adımlarını paralel olarak gerçekleştirmenin mümkün olabileceğini unutmayın.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.

Bu yaklaşım, Clemens Vasters’ın blogunda bahsedilen Sagas stratejisine benzerdir.This approach is similar to the Sagas strategy discussed in Clemens Vasters’ blog.

Telafi işlemleri de birer son tutarlılık işlemidir ve bunlar da başarısız olabilir.A compensating transaction is also an eventually consistent operation and it could also fail. Sistem, telafi işlemini hata noktasından sürdürebilmeli ve işlemi devam ettirebilmelidir.The system should be able to resume the compensating transaction at the point of failure and continue. Başarısız olan bir adımın yinelenmesi gerekebileceğinden, telafi işlemlerindeki adımların bir kere etkili olacak komutlar şeklinde tanımlanması gerekir.It might be necessary to repeat a step that's failed, so the steps in a compensating transaction should be defined as idempotent commands. Daha fazla bilgi için Jonathan Oliver’ın blogunda yer alan Tek Sefer Etkili Olma Düzenleri başlıklı makaleye bakın.For more information, see Idempotency Patterns on Jonathan Oliver’s blog.

Bazı durumlarda, başarısız olan adımları el ile müdahalede bulunmaksızın kurtarmak mümkün olmayabilir.In some cases it might not be possible to recover from a step that has failed except through manual intervention. Bu durumlarda, sistem bir uyarı oluşturmalı ve başarısızlık nedeni hakkında mümkün olduğunca fazla bilgi sağlamalıdır.In these situations the system should raise an alert and provide as much information as possible about the reason for the failure.

Sorunlar ve dikkat edilmesi gerekenlerIssues and considerations

Bu düzenin nasıl uygulanacağına karar verirken aşağıdaki noktaları göz önünde bulundurun:Consider the following points when deciding how to implement this pattern:

Son tutarlılık uygulayan bir işlemdeki bir adımın başarısız olduğunu anlamak kolay olmayabilir.It might not be easy to determine when a step in an operation that implements eventual consistency has failed. Bir adım hemen başarısız olmamasına rağmen iş akışını engelleyebilir.A step might not fail immediately, but instead could block. Bir tür zaman aşımı mekanizması uygulamak gerekli olabilir.It might be necessary to implement some form of time-out mechanism.

-Telafi mantığı kolayca genelleştirilemez.-Compensation logic isn't easily generalized. Telafi işlemi uygulamaya özgüdür.A compensating transaction is application specific. Bir işlem başarısız olduğunda işlemin etkilerini geri alabilmek için uygulamanın yeterli bilgiye sahip olmasına bağımlıdır.It relies on the application having sufficient information to be able to undo the effects of each step in a failed operation.

Bir telafi işlemindeki adımları bir kere etkili olacak komutlar olarak tanımlamanız gerekir.You should define the steps in a compensating transaction as idempotent commands. Bu, telafi işleminin kendisi başarısız olursa adımların yinelenmesine imkan sağlar.This enables the steps to be repeated if the compensating transaction itself fails.

Özgün işlemdeki adımlar ile telafi işlemini işleyen altyapının dayanıklı olması gerekir.The infrastructure that handles the steps in the original operation, and the compensating transaction, must be resilient. Başarısız olan adımın telafi edilmesi için gereken bilgileri kaybetmemesi ve telafi mantığının ilerlemesini güvenilir bir şekilde izleyebilmesi gerekir.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.

Telafi işlemi, sistemdeki verileri özgün işlemin başlangıcındaki durumuna döndürmek zorunda değildir.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. Bunun yerine, işlem başarısız olmadan önce başarıyla tamamlanan adımlar tarafından gerçekleştirilen işi telafi eder.Instead, it compensates for the work performed by the steps that completed successfully before the operation failed.

Telafi işlemindeki adımların sırası, özgün işlemdeki adımların tam tersi olmak zorunda değildir.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. Örneğin, tutarsızlıklar konusunda bir veri deposu diğerinden daha hassas olabileceğinden, telafi işleminde ilk olarak bu depoda yapılan değişiklikleri geri alan adımların gerçekleştirilmesi gerekir.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.

Bir işlemi tamamlaması gereken her kaynağa kısa vadeli, zaman aşımı temelli bir kilit eklenmesi ve bu kaynakların önceden edinilmesi, genel etkinliğin başarılı olma olasılığının artmasına yardımcı olabilir.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. İş yalnızca tüm kaynaklar edinildikten sonra gerçekleştirilmelidir.The work should be performed only after all the resources have been acquired. Tüm eylemler kilit süresi sona ermeden önce sonlandırılmalıdır.All actions must be finalized before the locks expire.

Telafi işlemi tetikleyen hataların sayısını en aza indirme konusunda normalden daha esnek olan yeniden deneme mantığını kullanmayı göz önünde bulundurun.Consider using retry logic that is more forgiving than usual to minimize failures that trigger a compensating transaction. Nihai tutarlılık uygulayan bir işlemdeki bir adım başarısız olursa, hatayı geçici bir özel durum olarak işlemeyi ve adımı yinelemeyi deneyin.If a step in an operation that implements eventual consistency fails, try handling the failure as a transient exception and repeat the step. İşlemi yalnızca art arda veya kurtarılamayacak bir biçimde başarısız olursa durdurarak bir telafi işlemi başlatın.Only stop the operation and initiate a compensating transaction if a step fails repeatedly or irrecoverably.

Telafi işlemi uygulamadaki zorlukların çoğu, son tutarlılık uygulama ile aynıdır.Many of the challenges of implementing a compensating transaction are the same as those with implementing eventual consistency. Daha fazla bilgi için Veri Tutarlılığı Temel Bilgileri sayfasının Son Tutarlılık Uygulama Konusunda Dikkat Edilecek Noktalar bölümüne bakın.See the section Considerations for Implementing Eventual Consistency in the Data Consistency Primer for more information.

Bu düzenin kullanılacağı durumlarWhen to use this pattern

Bu düzeni yalnızca başarısız olursa geri alınması gereken işlemler için kullanın.Use this pattern only for operations that must be undone if they fail. Çözümlerinizi mümkün olduğunca telafi işlemleri gerektirecek karmaşıklık düzeyinden kaçınacak şekilde tasarlayın.If possible, design solutions to avoid the complexity of requiring compensating transactions.

ÖrnekExample

Bir yolculuk web sitesi, müşterilerin yolculuk programları için rezervasyon yapmasına olanak sağlıyor.A travel website lets customers book itineraries. Tek bir yolculuk programı, bir dizi uçuş ve otelden oluşabilir.A single itinerary might comprise a series of flights and hotels. Önce Seattle’dan Londra’ya, sonra da Londra’dan Paris’e seyahat edecek bir müşteri, yolculuk programını çıkarırken boyunca aşağıdaki adımları gerçekleştirebilir:A customer traveling from Seattle to London and then on to Paris could perform the following steps when creating an itinerary:

  1. Seattle’dan Londra’ya F1 uçuşundan yer ayırtma.Book a seat on flight F1 from Seattle to London.
  2. Londra’dan Paris’e F2 uçuşundan yer ayırtma.Book a seat on flight F2 from London to Paris.
  3. Paris’ten Seattle’a F3 uçuşundan yer ayırtma.Book a seat on flight F3 from Paris to Seattle.
  4. Londra'daki H1 otelinden oda rezervasyonu yapma.Reserve a room at hotel H1 in London.
  5. Paris’teki H2 otelinden oda rezervasyonu yapma.Reserve a room at hotel H2 in Paris.

Her biri ayrı birer eylem olan bu adımlar, birlikte ele alındığında son tutarlılık gerektiren bir işlem oluşturur.These steps constitute an eventually consistent operation, although each step is a separate action. Bu nedenle, sistemin bu adımları gerçekleştirmeye ek olarak müşterinin programı iptal etme ihtimaline karşı her bir adımın geri alınması için gerekli karşı işlemleri de kaydetmesi gerekir.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. Daha sonra, karşı işlemlerin gerçekleştirilmesi için gerekli adımlar bir telafi işlemi olarak çalıştırılabilir.The steps necessary to perform the counter operations can then run as a compensating transaction.

Telafi işlemindeki adımların özgün adımların tam tersi olmak zorunda olmadığına ve telafi işlemindeki her bir adımın mantığının işe özgü kuralları hesaba katması gerektiğine dikkat edin.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. Örneğin, bir uçuştaki rezervasyonun iptal edilmesi, müşteriye ödediği ücreti tam olarak iade alma hakkı vermeyebilir.For example, unbooking a seat on a flight might not entitle the customer to a complete refund of any money paid. Şekilde, bir yolculuk programı rezervasyonu için uzun süre çalışan bir işlemin geri alınmasına yönelik bir telafi işlemi oluşturma gösterilmektedir.The figure illustrates generating a compensating transaction to undo a long-running transaction to book a travel itinerary.

Bir yolculuk programı rezervasyonu için uzun süre çalışan bir işlemin geri alınmasına yönelik bir telafi işlemi oluşturma

Not

Her adım için telafi mantığını nasıl tasarladığınıza bağlı olarak, telafi işlemindeki adımların paralel biçimde gerçekleştirilmesi mümkün olmayabilir.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.

Birçok iş çözümünde tek bir adımın başarısız olması sistemin bir telafi işlemi kullanılarak geri alınmasını gerektirmez.In many business solutions, failure of a single step doesn't always necessitate rolling the system back by using a compensating transaction. Örneğin, —yolculuk web sitesi senaryosunda F1, F2 ve F3 uçuşlarından yer ayırtıldıktan sonra— müşteri H1 otelinden oda rezervasyonu yapamazsa, uçuşların iptal edilmesi yerine aynı şehirdeki başka bir otelden oda rezervasyonu teklifi sunulması daha çok tercih edilir.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. Müşteri yine de iptal etmek isteyebilir (bu durumda, telafi işlemi çalıştırılarak F1, F2 ve F3 uçuşlarından ayırtılan yerler iptal edilir), ancak bu kararı sistem değil müşteri vermelidir.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.

Bu düzen uygulanırken aşağıdaki düzenler ve yönergeler de yararlı olabilir:The following patterns and guidance might also be relevant when implementing this pattern:

  • Veri Tutarlılığı Temel Bilgileri.Data Consistency Primer. Telafi İşlemi düzeni çoğunlukla son tutarlılık modelini uygulamayan işlemlerin geri alınması için kullanılır.The Compensating Transaction pattern is often used to undo operations that implement the eventual consistency model. Bu temel bilgi kaynağı, son tutarlılığın avantajları ve kısıtlamaları hakkında bilgi sağlar.This primer provides information on the benefits and tradeoffs of eventual consistency.

  • Zamanlayıcı Aracısı Gözetmeni düzeni.Scheduler-Agent-Supervisor pattern. Dağıtılmış hizmet ve kaynaklar kullanan iş işlemleri gerçekleştiren dayanıklı sistemlerin nasıl uygulanacağını açıklar.Describes how to implement resilient systems that perform business operations that use distributed services and resources. Bazı durumlarda, bir işlem tarafından gerçekleştirilen bir işin telafi işlemi kullanılarak geri alınması gerekli olabilir.Sometimes, it might be necessary to undo the work performed by an operation by using a compensating transaction.

  • Yeniden deneme düzeni.Retry pattern. Telafi işlemlerinin gerçekleştirilmesi pahalı olabilir ve Yeniden Deneme düzenini izleyerek başarısız işlemleri yeniden denemeye yönelik etkili bir ilke uygulanarak bunların kullanımını en aza indirmek mümkün olabilir.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.