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:
- Hizmet oluşturulur.
StatelessService.CreateServiceInstanceListeners()
çağrılır ve döndürülen dinleyiciler açılır.ICommunicationListener.OpenAsync()
her dinleyicide çağrılır.- 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.
- Hizmetin
Durum bilgisi olmayan hizmet kapatma
Durum bilgisi olmayan bir hizmeti kapatmak için, aynı desen tam tersten izlenir:
- Açık dinleyiciler kapalıdır.
ICommunicationListener.CloseAsync()
her dinleyicide çağrılır. - geçirilen
RunAsync()
iptal belirteci iptal edilir. İptal belirtecininIsCancellationRequested
özelliğinin denetimi true değerini döndürür ve çağrılırsa belirtecinThrowIfCancellationRequested
yöntemi birOperationCanceledException
oluşturur. Service Fabric tamamlanmasını beklerRunAsync()
. - Tamamlandıktan sonra
RunAsync()
, varsa hizmetinStatelessService.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ılmakStatelessService.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. - 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:
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 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.
- Hizmet bir Birincil hizmetse, döndürülen tüm dinleyiciler açılır.
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.- Hizmet şu anda Birincil ise, hizmetin
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.
ICommunicationListener.CloseAsync()
her dinleyicide çağrılır.StatefulServiceBase.OnCloseAsync()
yöntemi çağrılır. Bu çağrı yaygın olmayan bir geçersiz kılmadır, ancak kullanılabilir.geçirilen
RunAsync()
iptal belirteci iptal edilir. İptal belirtecininIsCancellationRequested
özelliğinin denetimi true değerini döndürür ve çağrılırsa belirtecinThrowIfCancellationRequested
yöntemi birOperationCanceledException
oluşturur. Service Fabric tamamlanmasını beklerRunAsync()
.Not
RunAsync'in bitmesini bekleme gereksinimi yalnızca bu çoğaltma birincil çoğaltmaysa gereklidir.
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:
- Açık dinleyiciler kapalıdır.
ICommunicationListener.CloseAsync()
her dinleyicide çağrılır. - geçirilen
RunAsync()
iptal belirteci iptal edilir. İptal belirtecininIsCancellationRequested
özelliğinin denetimi true değerini döndürür ve ç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 İ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:
ICommunicationListener.CloseAsync()
tüm açık dinleyiciler için çağrılır (ListenOnSecondary = true ile işaretlenmiştir).- Tüm iletişim dinleyicileri açılır.
ICommunicationListener.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 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 hemCreateServiceReplicaListeners/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ınaRunAsync()
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. TamamlanmaRunAsync()
, 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.