Eşzamansız işlevleri yeniden deneme

Bu dokümanda, eşzamansız (HTTPS olmayan) için nasıl istekte bulunabileceğiniz açıklanmaktadır arka plan işlevlerini kullanarak yeniden deneyin.

Yeniden denemenin anlamı

Cloud Functions, etkinliğe dayalı bir işlevin en az bir kez yürütülmesini sağlar bir etkinlik kaynağı tarafından yayınlanan her etkinlik için Varsayılan olarak, çağrı bir hatayla sonlandırılır, işlev tekrar çağrılmaz ve etkinlik atlanır. Etkinliğe dayalı bir kampanyada yeniden denemeleri etkinleştirdiğinizde işlevini yerine getirmiyorsa Cloud Functions, işlem başarıyla tamamlanır veya yeniden deneme aralığının süresi dolar.

2. nesil işlevler için bu yeniden deneme aralığının süresi 24 saat sonra dolar. 1. nesil işlevlerde şu tarihte sona erer: 7 gün sonra. Cloud Functions, yeni oluşturulan etkinliğe dayalı işlevleri aşağıdakileri kullanarak yeniden dener: üstel geri çekilme stratejisidir. 10 arasında artan bir geri çekilme ile ve 600 saniye uzunluğunda Bu politika yeni işlevlere uygulanır ilk kez dağıttığınızda. Mevcut raporlara geriye dönük olarak uygulanmaz değişikliklerden önce ilk olarak dağıtılan işlevler bu sürüm notu ve işlevleri yeniden dağıtsanız bile geçerlilik kazanmıştır.

Varsayılan değer olan bir işlev için yeniden denemeler etkinleştirilmediğinde, her zaman başarılı bir şekilde yürütüldüğünü bildirir ve 200 OK yanıt kodları, görünür. Bu durum, işlev bir hatayla karşılaşsa bile gerçekleşir. Alıcı: işleviniz bir hatayla karşılaştığında bunu netleştirmek için, hata bildirme sağlayabilir.

Etkinlik odaklı işlevler neden tamamlanamıyor?

Nadiren de olsa dahili bir hatadan dolayı işlev zamanından önce kapatılabilir. ve varsayılan olarak, işlev otomatik olarak yeniden denenebilir de olmayabilir de.

Daha genel olarak, etkinliğe dayalı bir işlev, hatalardan kaçının. Bu durumun olası nedenleri şunlar olur:

  • İşlev bir hata içerir ve çalışma zamanı bir istisna bildirir.
  • İşlev, bir hizmet uç noktasına erişemiyor veya lütfen unutmayın.
  • İşlev kasıtlı olarak bir istisna atar (örneğin, bir parametre doğrulama başarısız olur).
  • Bir Node.js işlevi reddedilen bir vaadi döndürür veyanull geri arama.

Bu durumların herhangi birinde, işlev varsayılan olarak yürütülmeyi durdurur ve etkinlik bu URL'ler atılır. Hata oluştuğunda işlevi yeniden denemek için: varsayılan yeniden deneme politikasını şu şekilde değiştir: "hata durumunda yeniden dene" ayarını mülkü kullanarak gerçekleştirebilirsiniz. Bu durum, etkinliğin şu zamana kadar tekrar tekrar yeniden denenmesine neden olur: işlevi başarıyla tamamlanır veya yeniden deneme zaman aşımının süresi dolar.

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

Yeniden denemeleri konsoldan yapılandırma

Yeni bir işlev oluşturuyorsanız:

  1. Şuradan: İşlev Oluşturma ekranı Tetikleyici'ye gidin ve kampanyanız için tetikleyici olacak etkinlik türünü seçin. işlevini kullanın.
  2. Yeniden denemeleri etkinleştirmek için Başarısız olduğunda yeniden dene onay kutusunu işaretleyin.

Mevcut bir işlevi güncelliyorsanız:

  1. Cloud Functions'a Genel Bakış sayfasında İşlev ayrıntıları ekranını açmak için güncellediğiniz işlevi, Tetikleyici bölmesini görüntülemek için menü çubuğundan Düzenle'yi seçin.
  2. Başarısız olduğunda yeniden dene onay kutusunu işaretleyerek etkinleştirin veya devre dışı bırakın. yeniden deneme sayısı.

İşlev kodunuzdan yeniden denemeleri yapılandırma

Cloud Functions for Firebase ile belirli bir boyut için kodda yeniden işlevini kullanın. Bu işlemi, functions.foo.onBar(myHandler);, kullan runWith 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 denemeleri kullanmayla ilgili en iyi uygulamalar açıklanmaktadır.

Geçici hataları işlemek için yeniden denemeyi kullanma

İşleviniz başarılı bir şekilde yürütülene kadar sürekli olarak yeniden denendiğinden, hatalar gibi kalıcı hatalar test yoluyla kodunuzdan giderilmelidir yeniden deneyin. Aralıklı veya geçici durumları işlemek için en iyi yeniden deneme işlemleri yeniden deneme sırasında, çözüm olasılığı yüksek olan hatalar gibi kesintili hizmet uç noktası veya zaman aşımı

Sonsuz yeniden deneme döngüsünden kaçınmak için bir bitiş koşulu ayarlayın

Bu işlem sırasında işlevinizi sürekli döngüye karşı korumak için bunu kullanabilirsiniz. Bunu, iyi tanımlanmış bir bitiş koşulu ekleyerek, önce oluşturun. Bu tekniğin yalnızca aşağıdaki durumlarda işe yaradığını unutmayın: fonksiyonunuz başarıyla başlatılır ve son koşulu değerlendirebilir.

Basit ancak etkili bir yaklaşım, şundan daha eski zaman damgalarına sahip etkinlikleri silmektir: devam edebilir. Bu sayede, başarısızlık olduğunda aşırı yürütme veya beklenenden daha uzun ömürlü olabilir.

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

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 uygulamasını Vaatler ile 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.

Yapmanız gerekenlerle ilgili bir örnek:

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

Yeniden denenebilir, etkinliğe dayalı işlevleri benzersiz hale getirin

Yeniden denenebilen, etkinliğe dayalı işlevler idempotent olmalıdır. Aşağıda bazı örnekler verilmiştir: aşağıdaki genel yönergeleri izleyin:

  • Birçok harici API (Stripe gibi) bir idempotency anahtarı sağlamanıza olanak tanır kullanabilirsiniz. Böyle bir API kullanıyorsanız etkinlik kimliğini idempotency anahtarını kullanın.
  • Geçicilik, en az bir kez teslimatta iyi performans gösterir çünkü yeniden dene. Güvenilir kod yazmak için genel en iyi uygulama, .
  • Kodunuzun dahili olarak idempotent olduğundan emin olun. Örnek:
    • yardımcı olur.
    • Durumu değiştirmeden önce işlemdeki veritabanı durumunu sorgulayın.
    • Tüm yan etkilerin birbiriyle alakalı olduğundan emin olun.
  • İşlev dışında, koddan bağımsız bir işlem denetimi uygulayın. Örneğin, belirli bir etkinlik kimliğinin bulunduğu bir kayıttaki durumu devam ettir zaten işlendi.
  • Bant dışı yinelenen işlev çağrılarıyla ilgilenme. Örneğin, her ay web sitenizde sonra temizlenen bağımsız bir işlemdir.

Yeniden deneme politikasını yapılandırma

Cloud Functions işlevinizin ihtiyaçlarına bağlı olarak, yeniden deneyebilirsiniz. Bu yöntem, satın alınacak reklam öğelerinin takip etmek için:

  • Yeniden deneme aralığını 7 günden 10 dakikaya indirebilirsiniz.
  • Eksponansiyel geri yükleme için minimum ve maksimum geri yükleme süresini değiştirin yeniden deneme stratejisi.
  • Yeniden deneme stratejisini değiştirerek hemen yeniden deneyin.
  • Şunu yapılandır: kaçınılan konuyu belirtin.
  • Maksimum ve minimum teslim denemesi sayısı belirleyin.

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

  1. HTTP işlevi yazın.
  2. Pub/Sub aboneliği oluşturmak için Pub/Sub API'sini kullanarak hedef olarak belirleyin.

Hatalarla ilgili Pub/Sub dokümanlarına bakın sayfasına göz atın.