Aracılığıyla paylaş


Reliable Services yaşam döngüsü

Reliable Services, Azure Service Fabric'te kullanılabilen programlama modellerinden biridir. Reliable Services'ın yaşam döngüsü hakkında bilgi edinirken, temel yaşam döngüsü olaylarını anlamak en önemlidir. Olayların tam sırası yapılandırma ayrıntılarına bağlıdır.

Genel olarak Reliable Services yaşam döngüsü aşağıdaki olayları 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.
    • Hizmetle iletişim için döndürülen tüm dinleyiciler açılır.
    • Hizmetin runAsync yöntemi çağrılır, böylece hizmet uzun süre çalışan veya arka plan çalışması yapabilir.
  • Kapatma sırasında:
    • geçirilen runAsync iptal belirteci iptal edilir ve dinleyiciler kapatılır.
    • Hizmet nesnesinin kendisi yok edilir.

Reliable Services'daki olayların sırası, güvenilir hizmetin durum bilgisi olmayan veya durum bilgisi olan hizmetlere bağlı olarak biraz değişebilir.

Ayrıca, durum bilgisi olan hizmetler için birincil değiştirme senaryolarını ele almalısınız. 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üşünmeniz gerekir.

Durum bilgisi olmayan hizmet başlatma

Durum bilgisi olmayan bir hizmetin yaşam döngüsü oldukça 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. CommunicationListener.openAsync() her dinleyicide çağrılır.
  3. Ardından paralel olarak:
    • Hizmetin runAsync yöntemi (StatelessService.runAsync()) çağrılır.
    • Varsa, hizmetin kendi onOpenAsync yöntemi çağrılır. StatelessService.onOpenAsync() Özellikle çağrılır. Bu yaygın olmayan bir geçersiz kılmadır, ancak kullanılabilir.

Durum bilgisi olmayan hizmet kapatma

Durum bilgisi olmayan bir hizmet kapatılırken aynı desen izlenir ancak tersten yapılır:

  1. Açık dinleyiciler kapalıdır. CommunicationListener.closeAsync() her dinleyicide çağrılır.
  2. geçirilen runAsync() iptal belirteci iptal edilir. İptal belirtecinin isCancelled özelliği denetlenirse döndürür trueve çağrılırsa belirtecin throwIfCancellationRequested yöntemi bir CancellationExceptionoluşturur.
  3. Tamamlandığında runAsync() , varsa hizmetin StatelessService.onCloseAsync() yöntemi çağrılır. Yine bu yaygın bir geçersiz kılma 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 hizmetlerin durum bilgisi olmayan hizmetlere benzer bir düzeni vardır ve birkaç değişiklik vardır. Durum bilgisi olan bir hizmeti başlatmak için olayların sırası aşağıdadır:

  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 birincil hizmetse, döndürülen tüm dinleyiciler açılır. CommunicationListener.openAsync() her dinleyicide çağrılır.
    • Hizmet ikincil bir 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 bir hizmetse, 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. CommunicationListener.closeAsync() her dinleyicide çağrılır.
  2. geçirilen runAsync() iptal belirteci iptal edilir. İptal belirtecinin isCancelled() yöntemine yapılan bir çağrı döndürür trueve çağrılırsa belirtecin throwIfCancellationRequested() yöntemi bir OperationCanceledExceptionoluşturur. Service Fabric tamamlanmasını bekler runAsync() .

Not

Yalnızca bu çoğaltma birincil çoğaltmaysa bitmesi beklenebilir runAsync .

  1. Tamamlandıktan sonra runAsync() hizmetin StatefulServiceBase.onCloseAsync() yöntemi çağrılır. Bu çağrı yaygın olmayan bir geçersiz kılmadır, ancak kullanılabilir.
  2. Tamamlandıktan sonra StatefulServiceBase.onCloseAsync() hizmet nesnesi yok edilir.

Durum bilgisi olan hizmet birincil değiştirmeleri

Durum bilgisi olan bir hizmet çalışırken iletişim dinleyicileri açılır ve runAsync yöntemi yalnızca bu durum bilgisi olan hizmetlerin birincil çoğaltmaları için ç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 değişebilir. Durum bilgisi olan bir çoğaltmanın görebileceği yaşam döngüsü olayları, değiştirme sırasında çoğaltmanın indirilip indirilmediğine veya yükseltildiğine bağlıdır.

İndirgenmiş birincil için

Service Fabric'in iletileri işlemeyi durdurmak ve arka plan çalışmalarını durdurmak için indirgenmiş birincil çoğaltmaya ihtiyacı vardır. Bu adım, hizmet kapatıldığındakine benzer. Bir fark, hizmetin ikincil olarak kaldığı için yok edilmiş veya kapatılmış olmasıdır. Aşağıdaki olaylar gerçekleşir:

  1. Açık dinleyiciler kapalıdır. CommunicationListener.closeAsync() her dinleyicide çağrılır.
  2. geçirilen runAsync() iptal belirteci iptal edilir. İptal belirtecinin isCancelled() yönteminin denetimi döndürür true. Ç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 ikincil için

Benzer şekilde, Service Fabric'in ileti dinlemeye başlamak ve tamamlanması gereken arka plan görevlerini başlatmak için yükseltilen ikincil çoğaltmaya ihtiyacı vardır. Bu işlem, hizmetin ne zaman oluşturulduğuna benzer. Fark, çoğaltmanın kendisinin zaten mevcut olmasıdır. Aşağıdaki olaylar gerçekleşir:

  1. CommunicationListener.closeAsync() tüm açık dinleyiciler için çağrılır (listenOnSecondary = true ile işaretlenir)
  2. Tüm iletişim dinleyicileri açılır. CommunicationListener.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 CommunicationListener ö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 birden çok nedenle değiştirir. En yaygın nedenler küme yeniden dengeleme ve uygulama yükseltmedir. Bu işlemler sırasında hizmetin 'e saygı duyması cancellationTokenönemlidir. Bu, hizmetin silinmesi gibi normal hizmet kapatma sırasında da geçerlidir.

İ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ık erişimli olduğundan kümeler dengesiz hale gelir. Ancak, hizmetlerin başka bir yere taşınması çok uzun sürdüğünden yeniden dengelenemez.

Hizmetler durum bilgisi olduğundan, hizmetlerin Güvenilir Koleksiyonlar kullanması da olasıdır. Service Fabric'te bir 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şlemek önemlidir.

Service Fabric tarafından oluşan özel durumlar kalıcı (FabricException) veya geçicidir (FabricTransientException).. Kalıcı özel durumlar günlüğe kaydedilip oluşturulmalıdır. Geçici özel durumlar yeniden deneme mantığına göre yeniden denenebilir.

Reliable Services'ı test etme ve doğrulamanın önemli bir parçası, hizmet yaşam döngüsü olaylarıyla birlikte kullanılarak ReliableCollections gelen özel durumları işlemektir. Hizmetinizi her zaman yük altında çalıştırmanızı öneririz. Ayrıca üretime dağıtmadan önce yükseltmeler ve kaos testleri gerçekleştirmeniz gerekir. Bu temel adımlar, hizmetinizin doğru şekilde uygulanmasını ve yaşam döngüsü olaylarını doğru şekilde işlemesini sağlamaya yardımcı olur.

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

  • runAsync() Hem yöntemi hem createServiceInstanceListeners/createServiceReplicaListeners de çağrıları isteğe bağlıdır. Bir hizmette hem bir hizmet hem de ikisi de olabilir. Ö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 dinleyicileri oluşturma ve döndürme isteğe bağlıdır. Hizmetin yalnızca yapılması gereken arka plan çalışması olabilir, bu nedenle yalnızca uygulaması runAsync()gerekir.
  • Bir hizmetin başarıyla tamamlanması runAsync() ve hizmetten geri dönmesi geçerlidir. Bu bir hata koşulu olarak kabul edilmez. Hizmetin son işlemesinin arka plan çalışmasını temsil eder. Durum bilgisi olan Reliable Services için, runAsync() hizmet birincil hizmetten indirgenirse ve sonra yeniden birincile yükseltilirse yeniden çağrılabilir.
  • Beklenmeyen bir özel durum oluşturarak bir hizmetten runAsync() çıkılırsa, bu bir hatadır. Hizmet nesnesi kapatılır ve bir sistem durumu hatası bildirilir.
  • Bu yöntemlerden geri dönmenin zaman sınırı olmasa da, yazma becerinizi hemen kaybedersiniz. Bu nedenle, gerçek bir 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. Bu çağrı, hizmetin talep ettiği tüm kaynakları temizlemesi ve serbest bırakması için son şans, 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