Eşzamansız işlevleri yeniden deneme

Bu belgede, başarısız olduğunda yeniden denemesi için asenkron (HTTPS olmayan) arka plan işlevlerini nasıl isteyeceğiniz açıklanmaktadır.

Yeniden deneme semantiği

Cloud Functions, bir etkinlik kaynağı tarafından yayınlanan her etkinlik için etkinlik odaklı bir işlevin en az bir kez yürütülmesini sağlar. Varsayılan olarak, bir işlev çağrısı hatayla sonlandırılırsa işlev tekrar çağrılmaz ve etkinlik atlanır. Etkinlik odaklı bir işlevde yeniden denemeleri etkinleştirdiğinizde Cloud Functions, işlem başarıyla tamamlanana veya yeniden deneme aralığının süresi dolana kadar başarısız bir işlev çağrısını yeniden dener.

2. nesil işlevler için bu yeniden deneme aralığının süresi 24 saattir. 1. nesil işlevlerde bu süre 7 gün sonra dolar. Cloud Functions, yeni oluşturulan etkinlik odaklı işlevleri, 10 ila 600 saniye arasında artan bir geri yükleme süresiyle eksponansiyel geri yükleme stratejisi kullanarak yeniden dener. Bu politika, yeni işlevleri ilk kez dağıttığınızda uygulanır. Bu değişiklik, işlevleri yeniden dağıtsanız bile bu sürüm notunda açıklanan değişiklikler yürürlüğe girmeden önce ilk kez dağıtılan mevcut işlevlere geriye dönük olarak uygulanmaz.

Bir işlev için yeniden denemeler etkinleştirilmediğinde (varsayılan ayar budur) işlev her zaman başarıyla çalıştığını bildirir ve günlüklerinde 200 OK yanıt kodları görünebilir. Bu durum, işlev bir hatayla karşılaşsa bile gerçekleşir. İşleviniz bir hatayla karşılaştığında bunu netleştirmek için hataları uygun şekilde bildirdiğinizden emin olun.

Olay odaklı işlevler neden tamamlanamaz?

Nadir durumlarda, bir işlev dahili bir hata nedeniyle erken çıkabilir ve varsayılan olarak işlev otomatik olarak yeniden denenebilir veya denenmeyebilir.

Daha genel olarak, etkinliğe dayalı bir işlev, işlev kodunun kendisinde bildirilen hatalar nedeniyle başarıyla tamamlanamayabilir. Bunun olası nedenleri şunlardır:

  • İşlev bir hata içerir ve çalışma zamanı bir istisna bildirir.
  • İşlev bir hizmet uç noktasına ulaşamıyor veya bunu yapmaya çalışırken zaman aşımına uğrayor.
  • İşlev kasıtlı olarak istisna atar (örneğin, bir parametre doğrulama işlemini geçemediğinde).
  • Bir Node.js işlevi, reddedilen bir promise döndürür veya bir geri çağırma işlevine null olmayan bir değer iletir.

Bu durumların herhangi birinde, işlev varsayılan olarak yürütmeyi durdurur ve etkinlik silinir. Hata oluştuğunda işlevi yeniden denemek için "başarısızlıkta yeniden dene" özelliğini ayarlayarak varsayılan yeniden deneme politikasını değiştirebilirsiniz. Bu durum, işlev başarıyla tamamlanana veya yeniden deneme zaman aşımı süresi dolana kadar etkinliğin tekrar tekrar yeniden denenmesine neden olur.

Yeniden denemeleri etkinleştirme veya devre dışı bırakma

Yeniden denemeleri konsoldan yapılandırma

Yeni bir işlev oluşturuyorsanız:

  1. İşlev Oluştur ekranındaki Tetikleyici bölümünde, işleviniz için tetikleyici görevi görecek etkinlik türünü seçin.
  2. Yeniden denemeleri etkinleştirmek için Başarısız olması durumunda yeniden dene onay kutusunu işaretleyin.

Mevcut bir işlevi güncelliyorsanız:

  1. Cloud Functions Genel Bakış sayfasında, güncellediğiniz işlevin adını tıklayarak İşlev ayrıntıları ekranını açın, ardından menü çubuğundan Düzenle'yi seçerek Tetikleyici bölmesini görüntüleyin.
  2. Yeniden denemeleri etkinleştirmek veya devre dışı bırakmak için Başarısız olması durumunda yeniden dene onay kutusunu işaretleyin veya kutunun işaretini kaldırın.

İşlev kodunuzdan yeniden deneme ayarlarını yapılandırma

Cloud Functions for Firebase ile bir işlevin kodunda yeniden denemeleri etkinleştirebilirsiniz. functions.foo.onBar(myHandler); gibi bir arka plan işlevi için bunu yapmak üzere runWith kullanın ve bir hata politikası yapılandırın:

functions.runWith({failurePolicy: true}).foo.onBar(myHandler);

true gösterildiği gibi ayarlanırsa hata durumunda yeniden denemek için bir işlev yapılandırılır.

En iyi uygulamalar

Bu bölümde, yeniden denemelerin kullanılmasıyla ilgili en iyi uygulamalar açıklanmaktadır.

Geçici hataları işlemek için yeniden deneme özelliğini kullanma

İşleviniz başarılı bir şekilde yürütülene kadar sürekli olarak yeniden denendiği için yeniden denemelerin etkinleştirilmesinden önce hatalar gibi kalıcı hataların test yoluyla kodunuzdan kaldırılması gerekir. Yeniden deneme, kararsız hizmet uç noktası veya zaman aşımı gibi yeniden deneme sonrasında çözüm olasılığı yüksek olan aralıklı veya geçici hataları işlemek için en iyi şekilde kullanılır.

Sonsuz yeniden deneme döngülerini önlemek için bir bitiş koşulu ayarlama

Yeniden deneme özelliğini kullanırken işlevinizi sürekli döngüye karşı korumak en iyi uygulamadır. Bunu, işlev işlemeye başlamadan önce iyi tanımlanmış bir bitiş koşulu ekleyerek yapabilirsiniz. Bu tekniğin yalnızca işleviniz başarıyla başlatılırsa ve bitiş koşulunu değerlendirebiliyorsa çalıştığını unutmayın.

Basit ancak etkili bir yaklaşım, belirli bir zamandan eski zaman damgaları olan etkinlikleri atmaktır. Bu, hatalar kalıcı olduğunda veya beklenenden uzun ömürlü olduğunda aşırı yürütme işlemi yapılmasını önlemeye yardımcı olur.

Örneğin, bu kod snippet'i 10 saniyeden eski tüm etkinlikleri atar:

const eventAgeMs = Date.now() - Date.parse(event.timestamp);
const eventMaxAgeMs = 10000;
if (eventAgeMs > eventMaxAgeMs) {
  console.log(`Dropping event ${event} with age[ms]: ${eventAgeMs}`);
  callback();
  return;
}

catch'ü Promises ile kullanma

İşlevinizde yeniden deneme etkinse işlenmemiş tüm hatalar yeniden denemeyi tetikler. Kodunuzun, yeniden denemeyle sonuçlanmaması gereken tüm hataları yakaladığından emin olun.

Yapmanız gerekenleri aşağıdaki örnekte görebilirsiniz:

return doFooAsync().catch((err) => {
    if (isFatal(err)) {
        console.error(`Fatal error ${err}`);
    }
    return Promise.reject(err);
});

Tekrarlanabilir olay odaklı işlevleri tekil hale getirme

Yeniden denenebilen etkinliğe dayalı işlevler idempotent olmalıdır. Bu tür bir işlevi tekil hale getirmeyle ilgili bazı genel yönergeler aşağıda verilmiştir:

  • Birçok harici API (Stripe gibi), parametre olarak bir idempotency anahtarı sağlamanıza olanak tanır. Bu tür bir API kullanıyorsanız tekilleştirme anahtarı olarak etkinlik kimliğini kullanmanız gerekir.
  • Idempotence, yeniden denemeyi güvenli hale getirdiği için en az bir kez teslimatta iyi sonuç verir. Bu nedenle, güvenilir kod yazmaya yönelik genel en iyi uygulama, aciliyeti yeniden denemelerle birleştirmektir.
  • Kodunuzun dahili olarak idempotent olduğundan emin olun. Örneğin:
    • Sonucu değiştirmeden mutasyonların birden fazla kez gerçekleşebildiğinden emin olun.
    • Durumu değiştirmeden önce bir işlemde veritabanı durumunu sorgulayın.
    • Tüm yan etkilerin de idempotent olduğundan emin olun.
  • İşlevin dışında, koddan bağımsız bir işlem denetimi uygulayın. Örneğin, belirli bir etkinlik kimliğinin daha önce işlendiğini kaydeden bir durumu bir yere kaydedin.
  • Bant dışı yinelenen işlev çağrılarıyla ilgilenme. Örneğin, yinelenen işlev çağrılarından sonra temizlenen ayrı bir temizleme işlemi uygulayın.

Yeniden deneme politikasını yapılandırma

İşlevinizin ihtiyaçlarına bağlı olarak yeniden deneme politikasını doğrudan yapılandırmak isteyebilirsiniz. Bu sayede aşağıdakilerin herhangi bir kombinasyonunu oluşturabilirsiniz:

  • Yeniden deneme aralığını 7 günden en az 10 dakikaya kısaltın.
  • Üslü geri çekilme yeniden deneme stratejisi için minimum ve maksimum geri çekilme süresini değiştirin.
  • Yeniden deneme stratejisini hemen yeniden deneyecek şekilde değiştirin.
  • Geçersiz konu yapılandırın.
  • Maksimum ve minimum teslimat denemesi sayısını ayarlayın.

Yeniden deneme politikasını yapılandırmak için:

  1. Bir HTTP işlevi yazın.
  2. Hedef olarak işlevin URL'sini belirterek Pub/Sub aboneliği oluşturmak için Pub/Sub API'yi kullanın.

Pub/Sub uygulamasını doğrudan yapılandırma hakkında daha fazla bilgi için hataların işlenmesiyle ilgili Pub/Sub dokümanlarına bakın.