Aracılığıyla paylaş


Reliable Services yaşam döngüsüne genel bakış

Azure Service Fabric Reliable Services'ın yaşam döngülerini düşünürken, yaşam döngüsünün temelleri en önemlileridir. Genel olarak, yaşam döngüsü aşağıdakileri içerir:

  • Başlatma sırasında:
    • Hizmetler oluşturulur.
    • Hizmetlerin sıfır veya daha fazla dinleyici oluşturma ve döndürme fırsatı vardır.
    • Döndürülen dinleyiciler açılır ve hizmetle iletişime olanak sağlar.
    • Hizmetin RunAsync yöntemi çağrılır ve hizmetin uzun süre çalışan görevleri veya arka plan çalışmalarını gerçekleştirmesini sağlar.
  • Kapatma sırasında:
    • RunAsync'e geçirilen iptal belirteci iptal edilir ve dinleyiciler kapatılır.
    • Dinleyiciler kapatıldıktan sonra hizmet nesnesinin kendisi yok edilir.

Bu olayların tam sırasına ilişkin ayrıntılar vardır. Olayların sırası, Reliable Service'in durum bilgisi olmayan mı yoksa durum bilgisi olan mı olduğuna bağlı olarak biraz değişebilir. Ayrıca durum bilgisi olan hizmetler için Birincil değiştirme senaryosuyla ilgilenmemiz gerekir. Bu sıra sırasında Birincil rolü, hizmet kapatılmadan başka bir çoğaltmaya aktarılır (veya geri gelir). Son olarak, hata veya hata koşullarını düşünmemiz gerekir.

Durum bilgisi olmayan hizmet başlatma

Durum bilgisi olmayan bir hizmetin yaşam döngüsü basittir. Olay sırası şu şekildedir:

  1. Hizmet oluşturulur.
  2. StatelessService.CreateServiceInstanceListeners() çağrılır ve döndürülen dinleyiciler açılır. ICommunicationListener.OpenAsync() her dinleyicide çağrılır.
  3. Sonra, paralel olarak iki şey olur -
    • Hizmetin StatelessService.RunAsync() yöntemi çağrılır.
    • Varsa, hizmetin StatelessService.OnOpenAsync() yöntemi çağrılır. Bu çağrı yaygın olmayan bir geçersiz kılmadır, ancak kullanılabilir. Genişletilmiş hizmet başlatma görevleri şu anda başlatılabilir.

Durum bilgisi olmayan hizmet kapatma

Durum bilgisi olmayan bir hizmeti kapatmak için, aynı desen tam tersten izlenir:

  1. Açık dinleyiciler kapalıdır. ICommunicationListener.CloseAsync() her dinleyicide çağrılır.
  2. geçirilen RunAsync() iptal belirteci iptal edilir. İptal belirtecinin IsCancellationRequested özelliğinin denetimi true değerini döndürür ve çağrılırsa belirtecin ThrowIfCancellationRequested yöntemi bir OperationCanceledExceptionoluşturur. Service Fabric tamamlanmasını bekler RunAsync() .
  3. Tamamlandıktan sonra RunAsync() , varsa hizmetin StatelessService.OnCloseAsync() yöntemi çağrılır. Durum bilgisi olmayan hizmet örneği düzgün bir şekilde kapatılacağında OnCloseAsync çağrılır. Hizmetin kodu yükseltilirken, hizmet örneği yük dengeleme nedeniyle taşındığında veya geçici bir hata algılandığında bu durum oluşabilir. geçersiz kılmak StatelessService.OnCloseAsync()yaygın değildir, ancak kaynakları güvenli bir şekilde kapatmak, arka plan işlemeyi durdurmak, dış durumu kaydetmeyi bitirmek veya mevcut bağlantıları kapatmak için kullanılabilir.
  4. Tamamlandıktan sonra StatelessService.OnCloseAsync() hizmet nesnesi yok edilir.

Durum bilgisi olan hizmet başlatma

Durum bilgisi olan hizmetler, durum bilgisi olmayan hizmetlere benzer bir desene sahiptir ve birkaç değişiklik vardır. Durum bilgisi olan bir hizmeti başlatmak için olayların sırası aşağıdaki gibidir:

  1. Hizmet oluşturulur.

  2. StatefulServiceBase.OnOpenAsync() çağrıldığında. Bu çağrı hizmette yaygın olarak geçersiz kılınmıyor.

  3. StatefulServiceBase.CreateServiceReplicaListeners() çağrılır.

    • Hizmet bir Birincil hizmetse, döndürülen tüm dinleyiciler açılır. ICommunicationListener.OpenAsync() her dinleyicide çağrılır.
    • Hizmet bir İkincil hizmetse, yalnızca olarak ListenOnSecondary = true işaretlenen dinleyiciler açılır. İkincillerde açık dinleyicilere sahip olmak daha az yaygındır.
  4. Ardından paralel olarak:

    • Hizmet şu anda Birincil ise, hizmetin StatefulServiceBase.RunAsync() yöntemi çağrılır.
    • StatefulServiceBase.OnChangeRoleAsync() çağrıldığında. Bu çağrı hizmette yaygın olarak geçersiz kılınmıyor.

    Not

    Yeni bir ikincil çoğaltma için StatefulServiceBase.OnChangeRoleAsync() iki kez çağrılır. 2. adımdan sonra, Boşta İkincil olduğunda ve 4. adım sırasında tekrar Etkin İkincil olduğunda. Çoğaltma ve örnek yaşam döngüsü hakkında daha fazla bilgi için Çoğaltma ve Örnek Yaşam Döngüsü bölümünü okuyun.

Durum bilgisi olan hizmet kapatma

Durum bilgisi olmayan hizmetler gibi kapatma sırasındaki yaşam döngüsü olayları da başlatma sırasındakiyle aynıdır, ancak tersine çevrilir. Durum bilgisi olan bir hizmet kapatılırken aşağıdaki olaylar gerçekleşir:

  1. Açık dinleyiciler kapalıdır. ICommunicationListener.CloseAsync() her dinleyicide çağrılır.

  2. StatefulServiceBase.OnCloseAsync() yöntemi çağrılır. Bu çağrı yaygın olmayan bir geçersiz kılmadır, ancak kullanılabilir.

  3. geçirilen RunAsync() iptal belirteci iptal edilir. İptal belirtecinin IsCancellationRequested özelliğinin denetimi true değerini döndürür ve çağrılırsa belirtecin ThrowIfCancellationRequested yöntemi bir OperationCanceledExceptionoluşturur. Service Fabric tamamlanmasını bekler RunAsync() .

    Not

    RunAsync'in bitmesini bekleme gereksinimi yalnızca bu çoğaltma birincil çoğaltmaysa gereklidir.

  4. Tamamlandıktan sonra StatefulServiceBase.RunAsync() hizmet nesnesi yok edilir.

Durum bilgisi olan hizmet Birincil değiştirmeler

Durum bilgisi olan bir hizmet çalışırken, yalnızca bu durum bilgisi olan hizmetlerin Birincil çoğaltmalarında iletişim dinleyicileri açılır ve RunAsync yöntemi çağrılır. İkincil çoğaltmalar oluşturulur, ancak başka çağrı yok. Durum bilgisi olan bir hizmet çalışırken, şu anda Birincil olan çoğaltma, hata veya küme dengeleme iyileştirmesi sonucunda değişebilir. Bu, bir çoğaltmanın görebileceği yaşam döngüsü olayları açısından ne anlama gelir? Durum bilgisi olan çoğaltmanın gördüğü davranış, değiştirme sırasında indirgenen veya yükseltilen çoğaltma olmasına bağlıdır.

İndirgeyen Birincil için

İndirgeyen Birincil çoğaltma için Service Fabric'in iletileri işlemeyi durdurması ve yaptığı arka plan çalışmalarına son vermek için bu çoğaltmaya ihtiyacı vardır. Sonuç olarak, bu adım hizmet kapatıldığında olduğu gibi görünür. Bir fark, hizmetin İkincil olarak kaldığı için yok edilmiş veya kapatılmış olmasıdır. Aşağıdaki API'ler çağrılır:

  1. Açık dinleyiciler kapalıdır. ICommunicationListener.CloseAsync() her dinleyicide çağrılır.
  2. geçirilen RunAsync() iptal belirteci iptal edilir. İptal belirtecinin IsCancellationRequested özelliğinin denetimi true değerini döndürür ve çağrılırsa belirtecin ThrowIfCancellationRequested yöntemi bir OperationCanceledExceptionoluşturur. Service Fabric tamamlanmasını bekler RunAsync() .
  3. ListenOnSecondary = true olarak işaretlenmiş dinleyiciler açılır.
  4. Hizmetin StatefulServiceBase.OnChangeRoleAsync() adı. Bu çağrı hizmette yaygın olarak geçersiz kılınmıyor.

Yükseltilen İkincil için

Benzer şekilde, Service Fabric'in ileti dinlemeye başlamak ve tamamlanması gereken arka plan görevlerini başlatmak için yükseltilen İkincil çoğaltmaya ihtiyacı vardır. Sonuç olarak, bu işlem hizmet oluşturulduğunda olduğu gibi görünür, ancak çoğaltmanın kendisi zaten var olur. Aşağıdaki API'ler çağrılır:

  1. ICommunicationListener.CloseAsync() tüm açık dinleyiciler için çağrılır (ListenOnSecondary = true ile işaretlenmiştir).
  2. Tüm iletişim dinleyicileri açılır. ICommunicationListener.OpenAsync() her dinleyicide çağrılır.
  3. Ardından paralel olarak:
    • Hizmetin StatefulServiceBase.RunAsync() yöntemi çağrılır.
    • StatefulServiceBase.OnChangeRoleAsync() çağrıldığında. Bu çağrı hizmette yaygın olarak geçersiz kılınmıyor.

Not

CreateServiceReplicaListeners yalnızca bir kez çağrılır ve çoğaltma yükseltme veya indirgeme işlemi sırasında yeniden çağrılmaz; aynı ServiceReplicaListener örnekler kullanılır, ancak önceki örnekler kapatıldıktan sonra yeni ICommunicationListener örnekler oluşturulur (yöntemi çağrılarak ServiceReplicaListener.CreateCommunicationListener ).

Durum bilgisi olan hizmet kapatma ve Birincil indirgeme sırasında sık karşılaşılan sorunlar

Service Fabric durum bilgisi olan bir hizmetin Birincil değerini çeşitli nedenlerle değiştirir. En yaygın olanı küme yeniden dengeleme ve uygulama yükseltmedir. Bu işlemler sırasında (hizmetin silinip silinmediğini göreceğiniz gibi normal hizmet kapatma sırasında da), hizmetin 'e saygı duyması CancellationTokenönemlidir.

İptali temiz bir şekilde işlemeyen hizmetler çeşitli sorunlarla karşılaşabilir. Service Fabric hizmetlerin düzgün bir şekilde durmasını beklediğinden bu işlemler yavaştır. Bu sonuç olarak zaman aşımına ve geri almada başarısız yükseltmelere yol açabilir. İptal belirtecinin yerine getirilmesinin başarısız olması da dengesiz kümelere neden olabilir. Düğümler sıklaştıklarından kümeler dengesiz hale gelir, ancak hizmetlerin başka bir yere taşınması çok uzun sürdüğünden hizmetler yeniden dengelenemez.

Hizmetler durum bilgisi olduğundan, Güvenilir Koleksiyonlar'ı da kullanmaları olasıdır. Service Fabric'te Birincil indirgendiğinde, ilk olarak temel alınan duruma yazma erişiminin iptal olması gerçekleşir. Bu, hizmet yaşam döngüsünü etkileyebilecek ikinci bir sorun kümesine yol açar. Koleksiyonlar, zamanlamaya ve çoğaltmanın taşınıp taşınmadığına veya kapatıldığına bağlı olarak özel durumlar döndürür. Bu özel durumlar doğru şekilde işlenmelidir. Service Fabric tarafından oluşan özel durumlar kalıcı (FabricException) ve geçici (FabricTransientException) kategorilere ayrılır. Geçici özel durumlar bazı yeniden deneme mantığına göre yeniden denenebilirken kalıcı özel durumlar günlüğe kaydedilip oluşturulmalıdır.

hizmetinin kullanımından ReliableCollections kaynaklanan özel durumları hizmet yaşam döngüsü olaylarıyla birlikte işlemek, Güvenilir Hizmeti test etme ve doğrulamanın önemli bir parçasıdır. Üretime dağıtmadan önce yükseltmeleri ve kaos testlerini gerçekleştirirken hizmetinizi her zaman yük altında çalıştırmanızı öneririz. Bu temel adımlar, hizmetinizin doğru şekilde uygulandığını ve yaşam döngüsü olaylarını doğru işlediğini sağlamaya yardımcı olur.

Hizmet yaşam döngüsüyle ilgili notlar

  • RunAsync() Hem yöntemi hem CreateServiceReplicaListeners/CreateServiceInstanceListeners de çağrıları isteğe bağlıdır. Bir hizmette bunlardan biri olabilir( her ikisi de veya hiçbiri). Örneğin, hizmet tüm çalışmalarını kullanıcı çağrılarına yanıt olarak yaparsa uygulamasına RunAsync()gerek yoktur. Yalnızca iletişim dinleyicileri ve ilişkili kodları gereklidir. Benzer şekilde, iletişim dinleyicilerinin oluşturulması ve döndürülmesi isteğe bağlıdır; hizmetin yalnızca arka plan çalışması olabilir ve bu nedenle yalnızca uygulamasını RunAsync()gerektirir.
  • Bir hizmetin başarıyla tamamlanması RunAsync() ve hizmetten geri dönmesi geçerlidir. Tamamlama bir hata koşulu değildir. Tamamlanma RunAsync() , hizmetin arka plan çalışmasının tamamlandığını gösterir. Durum bilgisi olan güvenilir hizmetler için, RunAsync() çoğaltma Birincil'den İkincil'e indirgenirse ve sonra yeniden Birincil'e yükseltilirse yeniden çağrılır.
  • Beklenmeyen bir özel durum oluşturarak bir hizmetten RunAsync() çıkarsa, bu bir hata oluşturur. Hizmet nesnesi kapatılır ve bir sistem durumu hatası bildirilir.
  • Bu yöntemlerden geri dönmenin zaman sınırı olmasa da, Reliable Collections'a yazma becerisini hemen kaybedersiniz ve bu nedenle gerçek bir çalışmayı tamamlayamazsınız. İptal isteğini aldıktan sonra mümkün olan en kısa sürede dönmenizi öneririz. Hizmetiniz bu API çağrılarına makul bir süre içinde yanıt vermezse Service Fabric hizmetinizi zorla sonlandırabilir. Bu genellikle yalnızca uygulama yükseltmeleri sırasında veya bir hizmet silinirken gerçekleşir. Bu zaman aşımı varsayılan olarak 15 dakikadır.
  • Yoldaki OnCloseAsync() OnAbort() hatalar çağrılır ve bu, hizmetin talep ettiği kaynakları temizlemesi ve serbest bırakması için son şans olan en iyi çaba fırsatıdır. Bu genellikle düğümde kalıcı bir hata algılandığında veya iç hatalar nedeniyle Service Fabric hizmet örneğinin yaşam döngüsünü güvenilir bir şekilde yönetemediğinde çağrılır.
  • OnChangeRoleAsync() durum bilgisi olan hizmet çoğaltması rolü değiştirdiğinde (örneğin birincil veya ikincil olarak) çağrılır. Birincil çoğaltmalara yazma durumu verilir (Güvenilir Koleksiyonlar oluşturmasına ve yazmasına izin verilir). İkincil çoğaltmalara okuma durumu verilir (yalnızca mevcut Güvenilir Koleksiyonlardan okunabilir). Durum bilgisi olan bir hizmetteki işlerin çoğu birincil çoğaltmada gerçekleştirilir. İkincil çoğaltmalar salt okunur doğrulama, rapor oluşturma, veri madenciliği veya diğer salt okunur işleri gerçekleştirebilir.

Sonraki adımlar