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.
- geçirilen
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:
- Hizmet oluşturulur.
StatelessService.createServiceInstanceListeners()
çağrılır ve döndürülen dinleyiciler açılır.CommunicationListener.openAsync()
her dinleyicide çağrılır.- 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.
- Hizmetin
Durum bilgisi olmayan hizmet kapatma
Durum bilgisi olmayan bir hizmet kapatılırken aynı desen izlenir ancak tersten yapılır:
- Açık dinleyiciler kapalıdır.
CommunicationListener.closeAsync()
her dinleyicide çağrılır. - geçirilen
runAsync()
iptal belirteci iptal edilir. İptal belirtecininisCancelled
özelliği denetlenirse döndürürtrue
ve çağrılırsa belirtecinthrowIfCancellationRequested
yöntemi birCancellationException
oluşturur. - Tamamlandığında
runAsync()
, varsa hizmetinStatelessService.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. - 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:
- Hizmet oluşturulur.
StatefulServiceBase.onOpenAsync()
çağrıldığında. Bu çağrı hizmette yaygın olarak geçersiz kılınmıyor.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.
- Hizmet birincil hizmetse, döndürülen tüm dinleyiciler açılır.
- 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.
- Hizmet şu anda birincil bir hizmetse, hizmetin
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:
- Açık dinleyiciler kapalıdır.
CommunicationListener.closeAsync()
her dinleyicide çağrılır. - geçirilen
runAsync()
iptal belirteci iptal edilir. İptal belirtecininisCancelled()
yöntemine yapılan bir çağrı döndürürtrue
ve çağrılırsa belirtecinthrowIfCancellationRequested()
yöntemi birOperationCanceledException
oluşturur. Service Fabric tamamlanmasını beklerrunAsync()
.
Not
Yalnızca bu çoğaltma birincil çoğaltmaysa bitmesi beklenebilir runAsync
.
- Tamamlandıktan sonra
runAsync()
hizmetinStatefulServiceBase.onCloseAsync()
yöntemi çağrılır. Bu çağrı yaygın olmayan bir geçersiz kılmadır, ancak kullanılabilir. - 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:
- Açık dinleyiciler kapalıdır.
CommunicationListener.closeAsync()
her dinleyicide çağrılır. - geçirilen
runAsync()
iptal belirteci iptal edilir. İptal belirtecininisCancelled()
yönteminin denetimi döndürürtrue
. Çağrılırsa belirtecinthrowIfCancellationRequested()
yöntemi birOperationCanceledException
oluşturur. Service Fabric tamamlanmasını beklerrunAsync()
. - listenOnSecondary = true olarak işaretlenmiş dinleyiciler açılır.
- 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:
CommunicationListener.closeAsync()
tüm açık dinleyiciler için çağrılır (listenOnSecondary = true ile işaretlenir)- Tüm iletişim dinleyicileri açılır.
CommunicationListener.openAsync()
her dinleyicide çağrılır. - 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.
- Hizmetin
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 hemcreateServiceInstanceListeners/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ınarunAsync()
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.