Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Azure Function'u Azure Event Hubs tetikleyicileriyle kullanarak sağlam ve güvenilir sunucusuz çözümler nasıl oluşturulacağını öğrenin. Bu makale, kontrol noktaları, hata yönetimi ve devre kesici kalıplarının uygulanması için en iyi uygulamaları ele alır; böylece hiçbir olay kaybetmenizi ve olay odaklı uygulamalarınızın stabil ve dayanıklı kalmasını sağlar.
Dağıtılmış sistemlerde olay akışlarının zorlukları
Saniye başına sabit 100 olay hızında olay gönderen bir sistem düşünün. Bu hızda, birden fazla paralel örnek her saniye gelen 100 olayı tüketebilir.
Ancak, bir olay akışını kullanmayla ilgili şu zorlukları göz önünde bulundurun:
- Olay yayımcısı hatalı bir olay gönderir.
- İşlev kodunuz işlenmeyen bir özel durumla karşılaşır.
- Aşağı akış sistemi çevrimdışı olur ve olay işlemeyi engeller.
Azure Kuyruğu depolama tetikleyicisinin işleme sırasında iletileri kilitlemesinden farklı olarak, Azure Event Hubs her bir bölüm için akıştaki belirli bir noktadan okuma yapar. Daha çok bir video oynatıcıya benzeyen bu okuma davranışı, yüksek aktarım hızı, birden çok tüketici grubu ve yeniden yürütme özelliğinin istenen avantajlarını sağlar. Olaylar bir denetim noktasından okunur, ileri veya geri doğru, ancak işaretçiyi yeni olayları işlemek için güncellemeniz gerekir. Daha fazla bilgi için Event Hubs belgelerindeki Denetim Noktası'na bakın.
Akışta hatalar oluştuğunda ve işaretçiyi ilerletmemeyi seçtiğinizde, daha fazla olay işleme engellenir. Yani, tek bir olayla ilgili bir sorunla uğraşmak için işaretçiyi durdurursanız, işlenmemiş olaylar birikmeye başlar.
İşlevler, başarılı veya başarısız olursa olsun akışın işaretçisini her zaman ilerleterek kilitlenmeleri önler. İşaretçi ilerlemeye devam ettiğinden işlevlerinizin hatalarla uygun şekilde ilgilenmesi gerekir.
Event Hubs tetikleyicisi olayları nasıl tüketir?
Azure İşlevleri aşağıdaki adımları izleyerek bir olay hub'ından olayları tüketir:
- Tetikleyici, olay merkezinin her bölümü için Azure Depolama'da bir işaretçi oluşturur ve devam eder.
- Tetikleyici yeni olayları toplu olarak alır (varsayılan olarak) ve konak, işlenmek üzere olay grubunu sağlayarak işlevi tetiklemeye çalışır.
- Fonksiyon çalıştırmayı tamamladığında, istisnalarla ya da istisnasız, tetikleyici işaretçiyi ilerletir ve varsayılan ana depolama hesabına bir kontrol noktası kaydeder.
- Eğer koşullar fonksiyon yürütmesini engelliyorsa, sunucu işaretçiyi ilerletemez. İşaretçi ilerleyemiyorsa, sonraki yürütmeler aynı olayları tekrar işler.
Bu davranış birkaç önemli noktayı ortaya koyuyor:
İşlenmeyen özel durumlar olayları kaybetmenize neden olabilir:
Özel durum oluşturan işlev yürütmeleri işaretçiyi ilerletmeye devam eder. Yeniden deneme ilkesi veya başka bir yeniden deneme mantığının ayarlanması, yeniden denemenin tamamı tamamlanana kadar işaretçinin ilerlemesini geciktiriyor.
İşlevler en az bir kez teslimi garanti eder:
Kodunuzun ve bağımlı sistemlerinizin aynı olayın iki kez işlenebileceği gerçeğini hesaba katması gerekebilir. Daha fazla bilgi için bkz. Aynı Giriş için Azure İşlevlerini Tasarlama.
Denetim noktası durumu Azure Depolama'da depolanır:
Tetikleyici, kontrol noktasını (işlem işaretçisi) işlev uygulamasının
AzureWebJobsStorageayarında yapılandırılan depolama hesabında kalıcı olarak depolar. Bu depolanan kontrol noktası referansı şu anlama gelir:- Farklı bir depolama hesabına referans vermek için değiştirdiğinizde
AzureWebJobsStorage, fonksiyon yeni bir konumdan işlemeye başlar ve bu da olayların yeniden işlenmesine yol açabilir. - Bir olay merkezi silinip yeniden oluşturulduğunda, olay akışı konumu (örneğin dizi numaraları ve ofsetler) sıfırlanırken, saklanan kontrol noktası referansları değişmeden kalır. Bu durumda, fonksiyon kontrol noktası manuel olarak silinene kadar yeni olayları işlemeyebilir.
- Farklı bir depolama hesabına referans vermek için değiştirdiğinizde
Özel Durumların Yönetimi
Tüm işlev kodu en yüksek kod düzeyinde try/catch bloğu içermelidir ancak bir bloğun olması catch Event Hubs olaylarını kullanan işlevler için daha da önemlidir. Bu şekilde, bir özel durum oluştuğunda, catch bloğu işaretçi ilerlemeden önce hatayı işler.
Yeniden deneme mekanizmaları ve ilkeleri
Buluttaki birçok özel durum geçici olduğundan hata işlemenin ilk adımı her zaman işlemi yeniden denemektir. Yerleşik yeniden deneme ilkeleri uygulayabilir veya kendi yeniden deneme mantığınızı tanımlayabilirsiniz.
İlkeleri yeniden deneme
İşlevler, Event Hubs için yerleşik yeniden deneme ilkeleri sağlar. Yeniden deneme politikaları kullanıldığında, sadece yeni bir istisna oluşturursunuz ve sunucu, tanımlı politikaya göre olayı tekrar işlemeye çalışır. Bu yeniden deneme davranışı, Event Hubs uzantısının 5.x veya sonraki bir sürümünü gerektirir. Daha fazla bilgi için Yeniden deneme ilkeleri bölümüne bakın.
Özel yeniden deneme mantığı
Ayrıca işlevin kendi içinde kendi yeniden deneme mantığınızı tanımlayabilirsiniz. Örneğin, aşağıdaki kurallarla gösterilen bir iş akışını izleyen bir ilke uygulayabilirsiniz:
- Bir olayı üç kez işlemeyi deneyin (yeniden denemeler arasında gecikme olabilir).
- Tüm yeniden denemelerin nihai sonucu bir hataysa işlemenin akışta devam edebilmesi için kuyruğa bir olay ekleyin.
- Bozuk veya işlenmemiş olaylar daha sonra işlenir.
Uyarı
Polly , C# uygulamaları için dayanıklılık ve geçici hata işleme kitaplığı örneğidir.
İstisna olmayan hatalar
Bazı sorunlar özel durum oluşmadan oluşabilir. Örneğin, isteğin zaman aşımına uğradığı veya işlevi çalıştıran örneğin çöktüğü bir durumu düşünün. Bir işlev özel durum olmadan tamamlanamadıysa, ofset işaretçisi hiçbir zaman ileri gitmez. İşaretçi ilerlemezse, başarısız bir yürütmeden sonra çalışan herhangi bir örnek aynı olayları okumaya devam eder. Bu durum en az bir kez garanti sağlar.
Her olayın en az bir kez işlendiğinden emin olmak, bazı olayların birden çok kez işlenebileceği anlamına gelir. İşlev uygulamalarınızın bu olasılığın farkında olması ve idempotentlik ilkelerine göre inşa edilmiş olması gerekir.
Hata durumlarını işleme
Uygulamanız olay işlemedeki birkaç hatayı kabul edilebilir şekilde işleyebilir. Ancak, aşağı akış işlemedeki hataların bir sonucu olarak ortaya çıkabilecek kalıcı hata durumunu işlemeye de hazırlıklı olmanız gerekir. Aşağı akış veri deposunun çevrimdışı olması gibi bir hata durumunda, sistem iyi durumda olana kadar işlevinizin olaylar üzerinde tetiklenmesine son vermelidir.
Devre kesici deseni
Devre kesici düzenini uyguladığınızda, uygulamanız olay işlemeyi etkili bir şekilde duraklatabilir ve sorunlar çözüldükten sonra daha sonra devam edebilir.
Bir olay akışı işleminde devre kesici uygulamak için gereken iki bileşen vardır:
- Bağlantı hattının sağlığını izlemek ve denetlemek için tüm örneklerde paylaşılan durum.
- Birincil bir işlem, devre durumunu
openveyaclosedolarak yönetebilir.
Uygulama ayrıntıları farklılık gösterebilir, ancak örneklerin durumunu paylaşmak için bir depolama mekanizmasına ihtiyacınız vardır. durumu Azure Depolama, Redis önbelleğinde veya işlev uygulaması örnekleriniz tarafından erişilebilen başka bir kalıcı hizmette depolayabilirsiniz.
hem Dayanıklı İşlevler hem de Azure Logic Apps iş akışlarını ve devre durumlarını yönetmek için altyapı sağlar. Bu makalede, işlev yürütmelerini duraklatmak ve yeniden başlatmak için Logic Apps'in kullanılması açıklanır ve devre kesici düzenini uygulamak için gereken denetim sağlanır.
Örnekler arasında hata eşiği tanımlama
Birden fazla örnek aynı anda etkinlikleri işlerken devrenin durumunu izlemek için kalıcı paylaşılan dış durum gereklidir. Daha sonra bu kalıcı durumu, aşağıdakiler gibi bir hata durumunu gösteren kurallara göre izleyebilirsiniz:
Tüm örneklerde 30 saniyelik bir süre içinde 100'den fazla olay hatası olduğunda, yeni olaylarda tetiklemeyi durdurmak için devreyi kesin.
Bu izleme mantığının uygulama ayrıntıları, belirli uygulama gereksinimlerinize bağlı olarak değişir, ancak genel olarak şunları sağlayan bir sistem oluşturmanız gerekir:
- Kalıcı depolama hatalarını günlüğe kaydeder.
- Olay hata eşiğinin karşılandığından emin olmak için yeni hatalar günlüğe kaydedildiğinde sıralı sayıyı inceleyin.
- Belirlenen eşik karşılandığında sisteme devreyi kesmesini bildiren bir olay oluşturun.
devre durumunu Azure Logic Apps ile yönetme
Azure Logic Apps, farklı servislere, özelliklere ve durumlu orkestrasyonlara yerleşik bağlayıcılar içerir. Devre durumunu yönetmek doğal bir tercihtir. Bir bağlantı hattının ne zaman kesmesi gerektiğini algıladıktan sonra, bu iş akışını uygulamak için bir mantıksal uygulama oluşturabilirsiniz:
- İşlev işlemeyi durduran bir Event Grid iş akışını tetikleme.
- İş akışını yeniden başlatma seçeneği içeren bir bildirim e-postası gönderin.
Uygulama ayarlarını kullanarak belirli fonksiyonları devre dışı bırakıp yeniden etkinleştirmeyi öğrenmek için Azure İşlevleri'da fonksiyonları devre dışı bırakmak için bkz.
E-posta alıcısı, devrenin sağlığını inceleyebilir ve uygun olduğunda bildirim e-postasındaki bir bağlantı üzerinden devreyi yeniden başlatabilir. İş akışı işlevi yeniden başlattığında, Event Hub’daki son denetim noktasından olayları işlemeye başlar.
Bu yaklaşımı kullandığınızda, hiçbir etkinliği kaybetmezsiniz, olayları sırayla işlersiniz ve devreyi gerektiği kadar kesebilirsiniz.
Event Grid tetikleyicileri için geçiş stratejileri
Mevcut bir işlev uygulamasını bölgeler arasında veya bazı planlar arasında geçirirken, geçiş işlemi sırasında uygulamayı yeniden oluşturmanız gerekir. Bu durumda, göç sürecinde, aynı olay akışından tüketebilen ve aynı çıktı hedefine yazabilen iki uygulamanız olabilir.
Göç sürecinde olay veri kaybı veya çoğaltmayı önlemek için, tüketici gruplarını kullanmayı düşünün:
Yeni hedef uygulama için yeni bir tüketici grubu oluşturun.
Yeni uygulamadaki tetikleyiciyi bu yeni tüketici grubunu kullanacak şekilde yapılandırın.
Bu yaklaşımla, her iki uygulama da doğrulama sırasında olayları bağımsız olarak işleyebilir.
Yeni uygulamanın olayları doğru şekilde işlediğini doğrulayın.
Orijinal uygulamayı durdurun veya aboneliğini ya da tüketici grubunu kaldırın.