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ü şunları 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 izin verilir.
    • Hizmetin RunAsync yöntemi çağrılarak hizmetin uzun süre çalışan görevler veya arka plan çalışması yapması sağlanır.
  • Kapatma sırasında:
    • RunAsync'e geçirilen iptal belirteci iptal edilir ve dinleyiciler kapatılır.
    • Dinleyiciler kapandıktan sonra hizmet nesnesinin kendisi yok edilir.

Bu olayların tam olarak sıralanmasıyla ilgili ayrıntılar vardır. Olayların sırası, Reliable Service'in durum bilgisi veya durum bilgisi olup olmamasına bağlı olarak biraz değişebilir. Ayrıca durum bilgisi olan hizmetler için Birincil takas senaryosuyla ilgilenmemiz gerekir. Bu sıra sırasında Birincil rolü, hizmet kapatılmadan başka bir çoğaltmaya aktarılır (veya geri döner). 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. Olayların sırası şöyledir:

  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. Ardından, 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ı düzen tam tersi olarak izleniyor:

  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 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ılacaksa OnCloseAsync çağrılır. Bu durum hizmetin kodu yükseltilirken, yük dengeleme nedeniyle hizmet örneği taşındığında veya geçici bir hata algılandığında ortaya çıkabilir. 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, birkaç değişiklikle durum bilgisi olmayan hizmetlere benzer bir desene sahiptir. 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ı genellikle hizmette geçersiz kılınmaz.

  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 dinleyicilerin olması 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ı genellikle hizmette geçersiz kılınmaz.

    Not

    Yeni bir ikincil çoğaltma StatefulServiceBase.OnChangeRoleAsync() için 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 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 bir Birincil çoğaltmaysa gereklidir.

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

Durum bilgisi olan hizmet Birincil değiştirme işlemleri

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.

İndirgenen Birincil için

İndirgenen Birincil çoğaltma için Service Fabric'in iletileri işlemeyi durdurması ve yaptığı tüm arka plan çalışmalarını bırakması 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 olmaması veya kapatılmış olmaması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 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ı genellikle hizmette geçersiz kılınmaz.

Yükseltilen İkincil için

Benzer şekilde, Service Fabric'in ileti dinlemeye başlaması ve tamamlanması gereken arka plan görevlerini başlatması için yükseltilen İkincil çoğaltmaya ihtiyacı vardır. Sonuç olarak bu işlem, çoğaltmanın kendisi zaten mevcut olması dışında hizmet oluşturulduğunda olduğu gibi görünür. 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ı genellikle hizmette geçersiz kılınmaz.

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ılmıyor; 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 öğesini ç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ı göstermiş CancellationTokenolması önemlidir.

İptali düzgün işlemeyen hizmetler çeşitli sorunlarla karşılaşabilir. Service Fabric hizmetlerin düzgün durmasını beklediğinden bu işlemler yavaştır. Bu sonuç olarak zaman aşımına ve geri dönen başarısız yükseltmelere yol açabilir. İptal belirtecinin kabul edilmemesi de dengesiz kümelere neden olabilir. Düğümler etkin hale geldiği için 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'ı kullanmaları da olasıdır. Service Fabric'te Birincil düzeyi düşürüldüyse, ilk gerçekleşen şeylerden biri temel alınan duruma yazma erişiminin iptal edilmiş olmasıdır. 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ılıp kapatılmadığına bağlı olarak özel durumlar döndürür. Bu özel durumlar doğru 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 kaydedilmeli ve oluşturulmalıdır.

hizmetinin kullanımından ReliableCollections kaynaklanan özel durumların hizmet yaşam döngüsü olaylarıyla birlikte işlenmesi, 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 kullanıcı çağrılarına yanıt olarak tüm işini yaparsa uygulamasına RunAsync()gerek yoktur. Yalnızca iletişim dinleyicileri ve ilişkili kodları gereklidir. Benzer şekilde, iletişim dinleyicileri oluşturma ve döndürme isteğe bağlıdır çünkü hizmetin yalnızca arka plan işi 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. Tamamlama 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() çıkılması 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, Güvenilir Koleksiyonlar'a yazma becerisini hemen kaybedersiniz ve bu nedenle herhangi bir gerçek işi 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 da hizmetin talep ettiği kaynakları temizlemesi ve serbest bırakması için son şans olan en iyi fırsattır. Bu genellikle düğümde kalıcı bir hata algılandığında veya Service Fabric iç hatalar nedeniyle 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ştirirken (ö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