Eşzamansız işlevleri yeniden deneyin

Bu belgede, eşzamansız (HTTPS olmayan) arka plan işlevlerinin başarısızlık durumunda yeniden denemesini nasıl isteyebileceğiniz açıklanmaktadır.

Yeniden denemenin anlamı

Cloud Functions, bir olay kaynağı tarafından yayılan her olay için olaya dayalı bir işlevin en az bir kez yürütülmesini garanti eder. Varsayılan olarak, bir işlev çağrısı bir hatayla sonlanırsa işlev yeniden çağrılmaz ve olay bırakılır. Olaya dayalı bir işlevde yeniden denemeleri etkinleştirdiğinizde Cloud Functions, başarısız bir işlev çağrısını başarıyla tamamlanana veya yeniden deneme penceresi sona erene kadar yeniden dener.

2. nesil işlevler için bu yeniden deneme aralığı 24 saat sonra sona erer. 1. nesil işlevler için bu süre 7 gün sonra sona erer. Cloud Functions, 10 ila 600 saniye arasında artan bir geri çekilme süresiyle, üstel bir geri çekilme stratejisi kullanarak yeni oluşturulan olay odaklı işlevleri yeniden dener. Bu politika, yeni işlevlere onları ilk kez dağıttığınızda uygulanır. İşlevleri yeniden dağıtsanız bile, bu sürüm notunda açıklanan değişikliklerin yürürlüğe girmesinden ö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 olarak), işlev her zaman başarıyla yürütüldüğünü bildirir ve günlüklerinde 200 OK yanıt kodu görünebilir. Bu, 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 tamamlanamıyor?

Nadir durumlarda, dahili bir hata nedeniyle bir işlev zamanından önce sonlandırılabilir ve varsayılan olarak işlev otomatik olarak yeniden denenebilir veya denenmeyebilir.

Daha tipik olarak, olaya dayalı bir işlev, işlev kodunun kendisinde oluşturulan hatalar nedeniyle başarıyla tamamlanamayabilir. Bunun gerçekleşmesinin nedenleri arasında şunlar yer alabilir:

  • İşlev bir hata içeriyor ve çalışma zamanı bir istisna atıyor.
  • İşlev bir hizmet uç noktasına ulaşamıyor veya ulaşmaya çalışırken zaman aşımına uğruyor.
  • İşlev kasıtlı olarak bir istisna atar (örneğin, bir parametre doğrulamada başarısız olduğunda).
  • Node.js işlevi reddedilen bir sözü döndürür veya geri çağırmaya null olmayan bir değer iletir.

Yukarıdaki durumların herhangi birinde, işlevin yürütülmesi varsayılan olarak durdurulur ve olay atılır. Bir hata oluştuğunda işlevi yeniden denemek için, "başarısızlık durumunda yeniden dene" özelliğini ayarlayarak varsayılan yeniden deneme ilkesini değiştirebilirsiniz. Bu, işlev başarıyla tamamlanana veya yeniden deneme zaman aşımı süresi dolana kadar olayın tekrar tekrar denenmesine neden olur.

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

GCP Konsolundan yeniden denemeleri yapılandırın

Yeni bir işlev oluşturuyorsanız:

  1. İşlev Oluştur ekranından Tetikleyici ekle'yi seçin ve işleviniz için tetikleyici görevi görecek olay türünü seçin.
  2. Yeniden denemeleri etkinleştirmek için Eventarc tetikleyici bölmesinde Başarısızlık durumunda yeniden dene onay kutusunu seçin.

Mevcut bir işlevi güncelliyorsanız:

  1. Bulut İşlevlerine Genel Bakış sayfasından, güncellediğiniz işlevin adına tıklayarak İşlev ayrıntıları ekranını açın, ardından HTTPS ve Eventarc tetikleyici bölmelerini görüntülemek için menü çubuğundan Düzenle'yi seçin.
  2. Eventarc tetikleyici bölmesinde, tetikleyicinizin ayarlarını düzenlemek için düzenle simgesine tıklayın.
  3. Yeniden denemeleri etkinleştirmek veya devre dışı bırakmak için Eventarc tetikleyici bölmesinde, Başarısızlık durumunda yeniden dene onay kutusunu seçin veya temizleyin.

İşlev kodunuzdan yeniden denemeleri yapılandırın

Cloud Functions for Firebase ile bir işlev için kodda yeniden denemeleri etkinleştirebilirsiniz. Bunu, functions.foo.onBar(myHandler); , runWith kullanın ve bir hata politikası yapılandırın:

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

Gösterildiği gibi true ayarı, bir işlevin başarısızlık durumunda yeniden denenmesini yapılandırır.

En iyi uygulamalar

Bu bölümde yeniden denemelerin kullanımına ilişkin en iyi uygulamalar açıklanmaktadır.

Geçici hataları işlemek için yeniden denemeyi kullanın

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

Sonsuz yeniden deneme döngülerinden kaçınmak için bir bitiş koşulu belirleyin

Yeniden denemeleri kullanırken işlevinizi sürekli döngüye karşı korumak en iyi uygulamadır. Bunu, fonksiyon işlenmeye başlamadan önce iyi tanımlanmış bir bitiş koşulu ekleyerek yapabilirsiniz. Bu tekniğin yalnızca işleviniz başarılı bir şekilde başlatıldığında ve bitiş koşulunu değerlendirebildiğinde işe yaradığını unutmayın.

Basit ama etkili bir yaklaşım, zaman damgası belirli bir zamandan daha eski olan olayları atmaktır. Bu, arızaların kalıcı olduğu veya beklenenden daha uzun sürdüğü durumlarda aşırı yürütmelerin önlenmesine yardımcı olur.

Örneğin, bu kod pasajı 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;
}

Promises ile catch kullanın

İşlevinizde yeniden denemeler etkinse işlenmeyen herhangi bir hata yeniden denemeyi tetikler. Kodunuzun, yeniden denemeyle sonuçlanmaması gereken hataları yakaladığından emin olun.

İşte yapmanız gerekenlere bir örnek:

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

Yeniden denenebilir olay odaklı işlevleri bağımsız hale getirin

Yeniden denenebilen olaya dayalı işlevler aynı güce sahip olmalıdır. Böyle bir işlevi bağımsız hale getirmeye yönelik bazı genel yönergeler şunlardır:

  • Birçok harici API (Stripe gibi), parametre olarak bir önemsizlik anahtarı sağlamanıza olanak tanır. Böyle bir API kullanıyorsanız etkinlik kimliğini kimlik anahtarı olarak kullanmalısınız.
  • Idempotency, en az bir kez teslimatla iyi çalışır çünkü yeniden denemeyi güvenli hale getirir. Bu nedenle, güvenilir kod yazmaya yönelik genel en iyi uygulama, uyumsuzluğu yeniden denemelerle birleştirmektir.
  • Kodunuzun dahili olarak bağımsız olduğundan emin olun. Örneğin:
    • Mutasyonların sonucu değiştirmeden birden fazla kez gerçekleşebileceğinden emin olun.
    • Durumu değiştirmeden önce bir işlemdeki veritabanı durumunu sorgulayın.
    • Tüm yan etkilerin kendilerinin önemsiz olduğundan emin olun.
  • Koddan bağımsız olarak fonksiyonun dışında bir işlem kontrolü uygulayın. Örneğin, belirli bir olay kimliğinin zaten işlenmiş olduğunu kaydeden bir yerde kalıcı durum.
  • Bant dışı yinelenen işlev çağrılarıyla ilgilenin. Örneğin, yinelenen işlev çağrılarından sonra temizleyen ayrı bir temizleme işleminiz olsun.

Yeniden deneme ilkesini yapılandırma

Bulut İşlevinizin ihtiyaçlarına bağlı olarak yeniden deneme ilkesini doğrudan yapılandırmak isteyebilirsiniz. Bu, aşağıdakilerin herhangi bir kombinasyonunu ayarlamanıza olanak tanır:

  • Yeniden deneme aralığını 7 günden 10 dakikaya kadar kısaltın.
  • Üstel geri alma yeniden deneme stratejisi için minimum ve maksimum geri çekilme süresini değiştirin.
  • Hemen yeniden denemek için yeniden deneme stratejisini değiştirin.
  • Geçersiz bir konu yapılandırın.
  • Maksimum ve minimum teslimat denemesi sayısını ayarlayın.

Yeniden deneme ilkesini yapılandırmak için:

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

Pub/Sub'u doğrudan yapılandırma hakkında daha fazla bilgi için hataların ele alınmasıyla ilgili Pub/Sub belgelerine bakın.