Aracılığıyla paylaş


Azure İşlevleri ve Event Hubs ile güvenilir olay işleme

Azure Event Hubs tetikleyicileri ile Azure İşlevleri kullanarak güçlü, güvenilir sunucusuz çözümler oluşturmayı öğrenin. Bu makale, hiçbir olayın kaybolmadığından ve olay odaklı uygulamalarınızın kararlı ve dayanıklı kaldığından emin olmak için denetim noktaları, hata işleme ve devre kesici desenlerini uygulamaya yönelik en iyi yöntemleri kapsar.

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, her dakikada birden çok paralel örnek, her saniye gelen 100 olayı işleyebilir.

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.

İşleme sırasında iletileri kilitleyen Azure Kuyruk depolama tetikleyicisinden farklı olarak Azure Event Hubs, akıştaki tek bir noktadan bölüm başına okur. 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. Başka bir deyişle, tek bir olayı işleyen bir sorunla ilgilenmek 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:

  1. Olay hub'ının her bölümü için Azure Depolama'da bir işaretçi oluşturulur ve kalıcı hale getirilir.
  2. Yeni olaylar bir toplu işlemde (varsayılan olarak) alınır ve konak, işleme için bir olay toplu işlemini sağlayan işlevi tetiklemeye çalışır.
  3. İşlev, istisnalar olsun ya da olmasın, yürütmeyi tamamladığında, işaretçi ilerletilir ve bir denetim noktası varsayılan konak depolama hesabına kaydedilir.
  4. Koşullar işlev yürütmenin tamamlanmasını engellerse, ana makine 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 İşlevleri tasarlama.

Ö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 ilkelerini kullanırken, yalnızca yeni bir istisna oluşturursunuz ve sunucu tanımlanan ilkeye göre olayı yeniden 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 bkz . İlkeleri yeniden deneme.

Ö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 idempotency 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.
  • Devre durumunu ya open ya da closed olarak yönetebilen bir ana süreç.

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'da, 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:

  1. Kalıcı depolama hatalarını günlüğe kaydeder.
  2. Olay hata eşiğinin karşılandığından emin olmak için yeni hatalar günlüğe kaydedildiğinde sıralı sayıyı inceleyin.
  3. Belirlenen eşik karşılandığında sisteme devreyi kesmesini bildiren bir olay oluşturun.

Azure Logic Apps ile devre durumunu yönetme

Azure Logic Apps, farklı hizmetlere, özelliklere ve durum bilgisi olan düzenlemelere yönelik yerleşik bağlayıcılarla birlikte gelir ve devre durumunu yönetmek için doğal bir seçimdir. 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:

  1. İşlev işlemeyi durduran bir Event Grid iş akışını tetikleme.
  2. İş akışını yeniden başlatma seçeneği içeren bir bildirim e-postası gönderin.

Uygulama ayarlarını kullanarak belirli işlevleri devre dışı bırakma ve yeniden etkinleştirme hakkında bilgi edinmek için bkz. Azure İşlevleri'nde işlevleri devre dışı bırakma.

E-posta alıcısı bağlantı hattının durumunu araştırabilir ve uygun olduğunda, bildirim e-postasında yer alan bir bağlantı aracılığıyla bağlantı hattını yeniden başlatabilir. İş akışı işlev yeniden başlatıldığında, olaylar son olay merkezi kontrol noktasından işlenir.

Bu yaklaşımı kullandığınızda hiçbir olay kaybolmaz, olaylar sırayla işlenir ve gerektiğinde devreyi bozabilirsiniz.

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, geçiş işlemi sırasında hem aynı olay akışından hem de aynı çıkış hedefine yazabilen iki uygulamanız olabilir.

Geçiş işlemi sırasında olay veri kaybını veya yinelemeyi önlemek için tüketici gruplarını kullanmayı düşünmelisiniz:

  1. Yeni hedef uygulama için yeni bir tüketici grubu oluşturun.

  2. Yeni uygulamadaki tetikleyiciyi bu yeni tüketici grubunu kullanacak şekilde yapılandırın.

    Bu, her iki uygulamanın da doğrulama sırasında olayları bağımsız olarak işlemesine olanak tanır.

  3. Yeni uygulamanın olayları doğru şekilde işlediğini doğrulayın.

  4. Özgün uygulamayı durdurun veya aboneliğini/tüketici grubunu kaldırın.