Devre Kesici düzeni

Azure

Uzak hizmete veya kaynağa bağlanırken, düzeltmek için gereken sürenin değişiklik gösterebileceği hataları işleyin. Bu sayede uygulamanın kararlılığını ve dayanıklılığını artırabilirsiniz.

Bağlam ve sorun

Dağıtılmış bir ortamda uzak kaynak ve hizmetlere yapılan çağrılar yavaş ağ bağlantıları, zaman aşımları ve kaynakların aşırı yüklenmesi veya geçici olarak devre dışı bırakılması gibi geçici hatalardan dolayı başarısız olabilir. Bu hatalar normalde kısa sürede kendilerini düzeltirler ve sağlam bir bulut uygulaması, Yeniden Deneme düzeni gibi bir strateji kullanarak hataları işlemeye hazırlıklı olmalıdır.

Ancak bazı durumlarda hatalar beklenmedik olaylardan kaynaklanır ve bu hataları düzeltmek çok daha fazla zaman alabilir. Bu hataların önem derecesi kısmi bağlantı kaybıyla bir hizmetin tamamen çökmesi arasında değişebilir. Böyle durumlarda uygulamanın, başarılı olma ihtimali düşük bir işlemi sürekli yeniden denemesi anlamsız olabilir; bunun yerine uygulama işlemin başarısız olduğunu çabuk kabul etmeli ve bu hatayı gerektiği gibi işlemelidir.

Buna ek olarak, hizmet çok meşgulse sistemin bir bölümündeki hata zincirleme hatalara neden olabilir. Örneğin, hizmet çağrısı yapan bir işlem zaman aşımı uygulayacak şekilde yapılandırılmış olabilir ve hizmetin bu süre içinde yanıt verememesi durumunda bir hata iletisiyle yanıtlayabilir. Öte yandan, bu strateji aynı işleme yönelik birçok eş zamanlı isteğin zaman aşımı süresi dolana kadar engellenmesine neden olabilir. Bu engellenen isteklerde bellek, iş parçacıkları, veritabanı bağlantıları ve benzeri önemli sistem kaynakları bulunabilir. Sonuç olarak bu kaynaklar tükenebilir ve sistemin aynı kaynakları kullanması gereken, bununla ilişkisiz diğer bölümlerinde hataya neden olabilir. Böyle durumlarda, işlemin hemen başarısız olması ve hizmeti ancak başarılı olma olasılığı olduğunda çağırma girişiminde bulunması tercih edilebilir. Daha kısa bir zaman aşımı süresi ayarlamanın bu sorunu çözmeye yardımcı olabileceğini unutmayın; ama zaman aşımı, hizmete yönelik istek sonunda başarılı olabilecek olsa bile işlemin çoğunlukla başarısız olması sonucunu doğuracak kadar da kısa olmamalıdır.

Çözüm

Michael Nygard tarafından Release It! kitabında tanıtılan Devre Kesici düzeni, uygulamanın başarısız olma olasılığı yüksek bir işlemi tekrar tekrar yürütmeye çalışmasını önleyebilir. Hatanın düzeltilmesi beklenmeden devam etmesine izin verilir veya hatanın uzun süreceği saptanırken CPU döngüleri harcanır. Devre Kesici düzeni uygulamanın hatanın düzeltilip düzeltilmediğini saptamasını da sağlar. Sorun düzeltilmiş gibi görünüyorsa, uygulama işlemi çağırmayı deneyebilir.

Devre Kesici düzeninin amacı Yeniden Deneme düzeninden farklıdır. Yeniden Deneme düzeni uygulamanın başarılı olacağı beklentisiyle işlemi yeniden denemesini sağlar. Devre Kesici düzeni, uygulamanın büyük olasılıkla başarısız olacak olan bir işlemi gerçekleştirmesini engeller. Uygulama bu iki düzeni birleştirip bir devre kesici üzerinden işlemi çağırmak için Yeniden Deneme düzenini kullanabilir. Öte yandan, yeniden deneme mantığının devre kesici tarafından döndürülen özel durumlara duyarlı olması ve devre kesici hatanın geçici olmadığını gösteriyorsa yeniden denemeyi bırakması gerekir.

Devre kesici, başarısız olabilecek işlemler için ara sunucu gibi çalışır. Ara sunucu son zamanlarda oluşmuş olan başarısızlıkların sayısını izlemeli ve bu bilgileri kullanarak işlemin devam etmesine izin mi vereceğine yoksa hemen bir özel durum mu döndüreceğine karar vermelidir.

Ara sunucu, elektrik devre kesicisinin işlevlerini taklit eden aşağıdaki durum değerleriyle bir durum makinesi olarak çalıştırılabilir:

  • Kapalı: Uygulamadan gelen istek işleme yönlendirilir. Ara sunucu son başarısızlıkların sayısını tutar ve işleme yönelik çağrı başarısız olursa ara sunucuda bu sayı bir artırılır. Son başarısızlıkların sayısı belirli bir süre içinde belirtilen eşiği aşarsa, ara sunucu Açık duruma getirilir. Bu noktada ara sunucu zaman aşımı zamanlayıcısını başlatır ve bu süre dolduğunda ara sunucu Yarı Açık duruma getirilir.

    Zaman aşımı zamanlayıcısının amacı, uygulamanın işlemi yeniden denemesine izin vermeden önce sisteme başarısızlığa neden olan sorunu düzeltmesi için zaman tanımaktır.

  • Açık: Uygulamadan gelen istek hemen başarısız olur ve uygulamaya bir özel durum döndürülür.

  • Yarı Açık: Uygulamadan gelen sınırlı sayıda isteğin geçmesine ve işlemi çağırmasına izin verilir. Bu istekler başarılı olursa, daha önce başarısızlığa neden olan hatanın düzeltildiği varsayılır ve devre kesici Kapalı duruma geçer (başarısızlık sayacı sıfırlanır). Herhangi bir istek başarısız olursa, devre kesici hatanın hala mevcut olduğunu varsayar, bu nedenle Aç durumuna geri döner ve sisteme hatadan kurtarması için daha fazla süre tanımak için zaman aşımı zamanlayıcısını yeniden başlatır.

    Yarı Açık durum, kurtarılmakta olan bir hizmete aniden yoğun bir istek akışı olmasını önlemeye yarar. Hizmet kurtarılırken, kurtarma işlemi tamamlanana kadar sınırlı miktarda isteği destekleyebilir, ama kurtarma işlemi devam ederken yoğun bir iş akışı hizmetin zaman aşımına uğramasına veya yeniden başarısız olmasına neden olabilir.

Devre Kesici durumları

Şekilde, Kapalı durumu tarafından kullanılan başarısızlık sayacı zamana dayalıdır. Düzenli aralıklarla otomatik olarak sıfırlanır. Bu, arada sırada başarısızlıklarla karşılaştığında devre kesicinin Açık duruma geçmesini önlemeye yardımcı olur. Devre kesiciyi Açık duruma geçiren başarısızlık eşiğine ulaşılması için, belirtilen süre içinde belirtilen sayıda başarısızlık olması gerekir. Yarı Açık durumu tarafından kullanılan sayaç, işlemi çağırmaya yönelik başarılı girişimlerin sayısını kaydeder. Arka arkaya belirtilen sayıda işlem çağrısı başarılı olduktan sonra devre kesici Kapalı duruma geri döner. Çağrılardan herhangi biri başarısız olursa, devre kesici hemen Açık duruma geçer ve bir sonraki Yarı Açık duruma geçişinde başarı sayacı sıfırlanır.

Sistemin kurtarılması harici olarak işlenir; büyük olasılıkla başarısız bileşen geri yüklenir veya yeniden başlatılır ya da ağ bağlantısı onarılır.

Devre Kesici düzeni sistem bir hatadan kurtarılırken tutarlılık sağlar ve performans üzerindeki etkiyi en aza indirir. Başarısız olma olasılığı yüksek bir işleme yönelik isteği, işlemin zaman aşımına uğramasını veya asla geri dönmemesini beklemek yerine hızla reddederek sistemin yanıt süresini korumaya yardımcı olabilir. Devre kesici durumu her değiştiğinde bir olay oluşturuyorsa, bu bilgiler sistemin devre kesici tarafından korunan parçasının durumunu izlemek veya devre kesici Açık duruma geçtiğinde yöneticiyi uyarmak için kullanılabilir.

Düzen özelleştirilebilir ve olası başarısızlık türüne uyarlanabilir. Örneğin, devre kesiciye daha yüksek bir zaman aşımı zamanlayıcısı uygulayabilirsiniz. Devre kesiciyi başlangıçta birkaç saniye Açık duruma getirebilir ve ardından hata düzeltilmediyse zaman aşımını birkaç dakika artırabilirsiniz ve bu şekilde devam edebilirsiniz. Bazı durumlarda, Açık durumun hata döndürmesi veya özel durum oluşturması yerine, uygulama için anlamlı bir varsayılan değer döndürmek daha yaralı olabilir.

Sorunlar ve dikkat edilmesi gerekenler

Bu düzeni nasıl uygulayacağınıza karar verirken aşağıdaki noktaları dikkate almalısınız:

Özel Durum İşleme. Devre kesici aracılığıyla bir işlem çağıran uygulama, işlemin kullanılamaz olması durumunda oluşturulan özel durumları işlemeye hazır olmalıdır. Özel durumların işlenme şekli uygulamaya özgü olacaktır. Örneğin, uygulama geçici olarak işlevselliğini düşürebilir, aynı görevi yerine getirmeyi veya aynı verileri almayı denemek üzere alternatif bir işlem çağırabilir ya da özel durumu kullanıcıya bildirir ve daha sonra yeniden denemesini ister.

Özel Durum Türleri. İstek birçok nedenle başarısız olabilir ve bu nedenlerden bazıları diğerlerinden daha ciddi bir hata türüne işaret edebilir. Örneğin, uzak hizmet kilitlendiği ve kurtarılmasının birkaç dakika süreceği için veya hizmetin geçici olarak aşırı yüklenmesinden dolayı zaman aşımı oluştuğu için istek başarısız olabilir. Devre kesici oluşan özel durumların türlerini inceleyebilir ve bu özel durumların doğasına bağlı olarak stratejisini ayarlayabilir. Örneğin, devre kesiciyi Açık duruma geçirmek için gereken zaman aşımı özel durumlarının sayısı, hizmetin tamamen kullanılamaz olmasından kaynaklanan başarısızlıkların sayısından fazla olabilir.

Günlüğe kaydetme. Yöneticinin işlemin durumunu izleyebilmesi için devre kesici tüm başarısız istekleri (ve bir olasılıkla başarılı istekleri) günlüğe kaydetmelidir.

Kurtarılabilirlik. Devre kesiciyi, koruduğu işlemin olası kurtarma düzeniyle eşleşecek şekilde yapılandırmalısınız. Örneğin, devre kesici uzun süre Açık durumda kalırsa, başarısızlığa neden olan hata düzeltilmiş olsa bile özel durumlar oluşturabilir. Benzer biçimde, devre kesici Açık durumdan Yarı Açık duruma çok hızlı geçirilirse, dalgalanmalar ortaya çıkabilir ve uygulamaların yanıt sürelerini kısaltabilir.

Başarısız İşlemleri Test Etme. Devre kesici Açık durumdayken Yarı Açık duruma ne zaman geçileceğini saptamak için bir zamanlayıcı kullanmak yerine, uzak hizmete veya kaynağa düzenli aralıklarla ping yaparak yeniden kullanılabilir duruma gelip gelmediğini saptayabilir. Bu ping daha önce başarısız olan bir işlemi çağırma girişimi biçiminde olabilir veya Sistem Durumu Uç Nokta İzleme düzeni tarafından açıklandığı gibi uzak hizmet tarafından özel olarak hizmetin durumunu test etmek için sağlanmış özel bir işlem de kullanabilir.

El İle Geçersiz Kılma. Başarısız bir işlemi kurtarma süresinin aşırı değişken olduğu bir sistemde, yöneticiye devre kesiciyi kapatma (ve başarısızlık sayacını sıfırlama) olanağı tanıyan bir el ile sıfırlama seçeneği sağlanması yararlı olacaktır. Benzer biçimde, devre kesici tarafından korunan işlem geçici olarak kullanılamıyorsa, yönetici devre kesiciyi Açık duruma (ve zaman aşımı zamanlayıcısını yeniden başlatmaya) zorlayabilir.

Eşzamanlılık. Aynı devre kesiciye uygulamanın çok fazla sayıda eş zamanlı örneği erişebilir. Uygulama sırasında eş zamanlı istekler engellenmemeli veya bir işleme yapılan çağrıya aşırı ek yük getirilmemelidir.

Kaynak Ayrımı. Temelde birden çok bağımsız sağlayıcı olma olasılığı varsa, bir kaynak türü için tek devre kesici kullanırken dikkatli olun. Örneğin, birden çok parça içeren bir veri deposunda, bir parça tümüyle erişilebilir durumdayken diğeri geçici bir sorunla karşılaşmış olabilir. Bu senaryolardaki hata yanıtları birleştirilirse, uygulama başarısız olma olasılığı yüksek bile olsa bazı parçalara erişmeyi deneyebilir ve bu arada başarılı olma olasılığı yüksek bile olsa diğer parçalara erişim engellenebilir.

Hızlandırılmış Devre Kesme. Bazen bir başarısızlık yanıtı devre kesicinin hemen durum geçişi yapmasına kısa bir süre böyle kalmasına yetecek kadar bilgi içeriyor olabilir. Örneğin, paylaşılan aşırı yüklenmiş bir kaynaktan gelen hata yanıtı hemen yeniden denemenin önerilmediğini ve uygulamanın yeniden denemeden önce birkaç dakika beklemesi gerektiğini gösteriyor olabilir.

Not

Hizmet istemcinin bant genişliğini azaltıyorsa HTTP 429 (Çok Fazla İstek Var) veya hizmet şu anda kullanılamıyorsa HTTP 503 (Hizmet Kullanılamıyor) döndürebilir. Yanıt, gecikmenin beklenen süresi gibi ek bilgiler içerebilir.

Başarısız İstekleri Yeniden Yürütme. Açık durumdayken, devre kesici hızla hataya geçmek yerine her isteğin ayrıntılarını bir günlüğe kaydedebilir ve uzak kaynak veya hizmet kullanılabilir duruma geldiğinde bu isteklerin yeniden yürütülmesi için düzenleme yapabilir.

Dış Hizmetlerde Uygun Olmayan Zaman Aşımları. Devre kesici, uygulamaları daha uzun bir zaman aşımı süresiyle yapılandırılmış dış hizmetlerde başarısız olan işlemlerden tümüyle koruyamayabilir. Zaman aşımı süresi fazla uzunsa, devre kesici işlemin başarısız olduğunu göstermeden önce devre kesiciyi çalıştıran iş parçacığı uzun bir süre engellenebilir. Bu süre içinde, birçok başka uygulama örneği de devre kesici aracılığıyla hizmeti çağırmayı deneyebilir ve tümü başarısız olana kadar çok sayıda iş parçacığını hareketsiz bırakabilir.

Bu düzenin kullanılacağı durumlar

Bu düzeni kullanarak:

  • Uygulamanın bir uzak hizmeti çağırmaya veya paylaşılan bir kaynağa erişmeye çalışmasını, bu işlemin başarısız olma olasılığı yüksekse engelleyebilirsiniz.

Bu düzenin şunlar için kullanılması önerilmez:

  • Uygulamanın bellek içi veri yapısı gibi yerel özel kaynaklarına erişimi işlemek için. Bu ortamda, devre kesici kullanmak sisteminize ek yük getirebilir.
  • Uygulamalarınızın iş mantığında özel durumları işlemeye bir alternatif olarak.

İş yükü tasarımı

Bir mimar, Azure İyi Tasarlanmış Çerçeve yapılarında ele alınan hedefleri ve ilkeleri ele almak için devre kesici deseninin iş yükünün tasarımında nasıl kullanılabileceğini değerlendirmelidir. Örneğin:

Yapı Taşı Bu desen sütun hedeflerini nasıl destekler?
Güvenilirlik tasarımı kararları, iş yükünüzün arızaya karşı dayanıklı olmasına ve bir hata oluştuktan sonra tamamen çalışır duruma gelmesini sağlamaya yardımcı olur. Bu düzen, hatalı bir bağımlılığın aşırı yüklenmesini önler. Bu deseni, iş yükünde düzgün bir düşüş tetiklemesi için de kullanabilirsiniz. Devre kesiciler genellikle hem kendini koruma hem de kendi kendini iyileştirme sağlamak için otomatik kurtarma ile bir araya getirilir.

- RE:03 Hata modu analizi
- RE:07 Geçici hatalar
- RE:07 Kendini koruma
Performans Verimliliği , ölçeklendirme, veri ve kod iyileştirmeleri aracılığıyla iş yükünüzün talepleri verimli bir şekilde karşılamasını sağlar. Bu düzen, bağımlılık kurtarma sırasında aşırı kaynak kullanımına neden olabilecek ve kurtarma girişiminde bulunan bir bağımlılıkta performansı aşırı yükleyebilecek yeniden deneme hata yaklaşımını önler.

- PE:07 Kod ve altyapı
- PE:11 Canlı sorunlar yanıtları

Herhangi bir tasarım kararında olduğu gibi, bu desenle ortaya konulabilecek diğer sütunların hedeflerine karşı herhangi bir dengeyi göz önünde bulundurun.

Örnek

Bir web uygulamasında, birkaç sayfa bir dış hizmetten alınan verilerle doldurulur. Sistem çok küçük bir arabellek uyguluyorsa, bu sayfalara yönelik isabetlerin çoğu hizmete gidiş dönüş hareketine neden olacaktır. Web uygulamasından hizmete bağlantılar bir zaman aşımı süresiyle (normalde 60 saniye) yapılandırılabilir ve hizmet bu süre içinde yanıt vermezse web sayfalarının mantığı hizmetin kullanılamaz olduğunu varsayar ve özel durum oluşturur.

Ancak hizmet başarısız olursa ve sistem çok meşgulse, kullanıcılar özel durum oluşmadan önce 60 saniye kadar beklemek zorunda kalabilir. Sonunda bellek, bağlantı ve iş parçacığı gibi kaynaklar tükenebilir ve hizmetten veri alan sayfalara erişmiyor olsalar bile diğer kullanıcıların sisteme bağlanması engellenir.

Başka web sunucuları ekleyerek ve yük dengeleme gerçekleştirerek sistemin ölçeklendirilmesi kaynakların tükenmesini geciktirebilir ama sorunu çözmez, çünkü kullanıcı istekleri yine yanıt alamayacaktır ve tüm web sunucularının kaynakları sonunda yine tükenebilir.

Hizmete bağlanan ve verileri alan mantığı bir devre kesici içinde sarmalamak bu sorunu çözmeye ve sistem hatasını daha zarif bir şekilde işlemeye yardımcı olabilir. Kullanıcı istekleri yine başarısız olur ama bunlar daha hızlı başarısız olacak ve kaynaklar engellenmeyecektir.

CircuitBreaker sınıfı devre kesici hakkındaki durum bilgilerini, aşağıdaki kodda gösterilen ICircuitBreakerStateStore arabirimini gerçekleştiren bir nesnede tutar.

interface ICircuitBreakerStateStore
{
  CircuitBreakerStateEnum State { get; }

  Exception LastException { get; }

  DateTime LastStateChangedDateUtc { get; }

  void Trip(Exception ex);

  void Reset();

  void HalfOpen();

  bool IsClosed { get; }
}

State özelliği devre kesicinin geçerli durumunu gösterir ve durum değeri CircuitBreakerStateEnum sabit listesinde tanımlandığı gibi Open, HalfOpen veya Closed olur. IsClosed özelliğinin değeri, devre kesici kapalıysa True, açıksa veya yarı açıksa False olmalıdır. Trip yöntemi devre kesiciyi açık duruma geçirir ve durum değişikliğine neden olan özel durumu, bu özel durumun oluştuğu tarih ve saatle birlikte kaydeder. LastException ve LastStateChangedDateUtc özellikleri bu bilgileri döndürür. Reset yöntemi devre kesiciyi kapatır ve HalfOpen yöntemi de devre kesiciyi yarı açık olarak ayarlar.

Örnekteki InMemoryCircuitBreakerStateStore sınıfı ICircuitBreakerStateStore arabiriminin uygulamasını içerir. CircuitBreaker sınıfı, devre kesicinin durumunu tutmak için bu sınıfın bir örneğini oluşturur.

CircuitBreaker sınıfındaki ExecuteAction yöntemi, bir Action temsilcisi olarak belirtilen işlemi sarmalar. Devre kesici kapalıysa, ExecuteActionAction temsilcisini çağırır. İşlem başarısız olursa, özel durum işleyicisi TrackException çağrısı yapar ve bu da devre kesicinin durumunu açık olarak ayarlar. Aşağıdaki kod örneği bu akışı vurgulamaktadır.

public class CircuitBreaker
{
  private readonly ICircuitBreakerStateStore stateStore =
    CircuitBreakerStateStoreFactory.GetCircuitBreakerStateStore();

  private readonly object halfOpenSyncObject = new object ();
  ...
  public bool IsClosed { get { return stateStore.IsClosed; } }

  public bool IsOpen { get { return !IsClosed; } }

  public void ExecuteAction(Action action)
  {
    ...
    if (IsOpen)
    {
      // The circuit breaker is Open.
      ... (see code sample below for details)
    }

    // The circuit breaker is Closed, execute the action.
    try
    {
      action();
    }
    catch (Exception ex)
    {
      // If an exception still occurs here, simply
      // retrip the breaker immediately.
      this.TrackException(ex);

      // Throw the exception so that the caller can tell
      // the type of exception that was thrown.
      throw;
    }
  }

  private void TrackException(Exception ex)
  {
    // For simplicity in this example, open the circuit breaker on the first exception.
    // In reality this would be more complex. A certain type of exception, such as one
    // that indicates a service is offline, might trip the circuit breaker immediately.
    // Alternatively it might count exceptions locally or across multiple instances and
    // use this value over time, or the exception/success ratio based on the exception
    // types, to open the circuit breaker.
    this.stateStore.Trip(ex);
  }
}

Aşağıdaki örnekte, devre kesici kapalı olmadığında yürütülen kod gösterilir (önceki örnekte atlanmıştır). Önce devre kesicinin CircuitBreaker sınıfındaki yerel OpenToHalfOpenWaitTime alanında belirtilen süreden daha uzun süre açık kalıp kalmadığını denetler. Böyle bir durum söz konusuysa, ExecuteAction yöntemi devre kesiciyi yarı açık olarak ayarlar ve ardından Action temsilcisi tarafından belirtilen işlemi gerçekleştirmeyi dener.

İşlem başarılı olursa, devre kesici kapalı duruma sıfırlanır. İşlem başarısız olursa, yeniden açık duruma döner ve özel durumun oluştuğu saat güncelleştirilerek devre kesicinin işlemi gerçekleştirmeyi yeniden denemeden önce bir süre daha beklemesi sağlanır.

Devre kesici yalnızca kısa bir süredir açıksa (OpenToHalfOpenWaitTime değerinden daha kısa), ExecuteAction yöntemi yalnızca bir CircuitBreakerOpenException özel durumu oluşturur ve devre kesicinin açık duruma geçmesine neden olan hatayı döndürür.

Buna ek olarak, devre kesicinin yarı açık durumdayken işleme yönelik eş zamanlı çağrılar yapmaya çalışmasını önlemek için bir kilit kullanır. Eş zamanlı işlem çağırma girişimi, devre kesici açık durumdaymış gibi işlenir ve aşağıda açıklandığı gibi bir özel durumla başarısız olur.

    ...
    if (IsOpen)
    {
      // The circuit breaker is Open. Check if the Open timeout has expired.
      // If it has, set the state to HalfOpen. Another approach might be to
      // check for the HalfOpen state that had be set by some other operation.
      if (stateStore.LastStateChangedDateUtc + OpenToHalfOpenWaitTime < DateTime.UtcNow)
      {
        // The Open timeout has expired. Allow one operation to execute. Note that, in
        // this example, the circuit breaker is set to HalfOpen after being
        // in the Open state for some period of time. An alternative would be to set
        // this using some other approach such as a timer, test method, manually, and
        // so on, and check the state here to determine how to handle execution
        // of the action.
        // Limit the number of threads to be executed when the breaker is HalfOpen.
        // An alternative would be to use a more complex approach to determine which
        // threads or how many are allowed to execute, or to execute a simple test
        // method instead.
        bool lockTaken = false;
        try
        {
          Monitor.TryEnter(halfOpenSyncObject, ref lockTaken);
          if (lockTaken)
          {
            // Set the circuit breaker state to HalfOpen.
            stateStore.HalfOpen();

            // Attempt the operation.
            action();

            // If this action succeeds, reset the state and allow other operations.
            // In reality, instead of immediately returning to the Closed state, a counter
            // here would record the number of successful operations and return the
            // circuit breaker to the Closed state only after a specified number succeed.
            this.stateStore.Reset();
            return;
          }
        }
        catch (Exception ex)
        {
          // If there's still an exception, trip the breaker again immediately.
          this.stateStore.Trip(ex);

          // Throw the exception so that the caller knows which exception occurred.
          throw;
        }
        finally
        {
          if (lockTaken)
          {
            Monitor.Exit(halfOpenSyncObject);
          }
        }
      }
      // The Open timeout hasn't yet expired. Throw a CircuitBreakerOpen exception to
      // inform the caller that the call was not actually attempted,
      // and return the most recent exception received.
      throw new CircuitBreakerOpenException(stateStore.LastException);
    }
    ...

CircuitBreaker nesnesi kullanarak işlemi korumak için, uygulama CircuitBreaker sınıfının bir örneğini oluşturur ve gerçekleştirilecek işlemi bir parametre olarak belirtip ExecuteAction yöntemini çağırır. Uygulama, devre kesici açık olduğundan işlemin başarısız olması durumunda CircuitBreakerOpenException özel durumunu yakalamaya hazır olmalıdır. Aşağıdaki kodda bir örnek gösterilir:

var breaker = new CircuitBreaker();

try
{
  breaker.ExecuteAction(() =>
  {
    // Operation protected by the circuit breaker.
    ...
  });
}
catch (CircuitBreakerOpenException ex)
{
  // Perform some different action when the breaker is open.
  // Last exception details are in the inner exception.
  ...
}
catch (Exception ex)
{
  ...
}

Bu düzeni uygularken aşağıdaki düzenler de kullanışlı olabilir:

  • Güvenilir web uygulaması deseni , bulutta yakınsanan web uygulamalarına devre kesici deseninin nasıl uygulanacağını gösterir.

  • Yeniden deneme düzeni. Hizmete veya ağa bağlanmayı denediğinde daha önce başarısız olan bir işlemi saydam bir şekilde yeniden denemesini sağlayarak, uygulamanın beklenen, geçici hataları nasıl işleyebileceğini açıklar.

  • Sistem Durumu Uç Noktası İzleme düzeni. Devre kesici, hizmet tarafından sunulan bir uç noktaya istek göndererek hizmetin durumunu test edebilir. Hizmetin durumunu gösteren bilgileri döndürmesi gerekir.