Ponów próbę użycia funkcji asynchronicznych

Z tego dokumentu dowiesz się, jak żądania dostępu asynchronicznego (innego niż HTTPS) w tle, aby ponawiać próby w przypadku niepowodzenia.

Semantyka ponowienia próby

Cloud Functions umożliwia wykonanie funkcji opartej na zdarzeniach co najmniej raz dla każdego zdarzenia generowanego przez źródło zdarzeń. Domyślnie, jeśli funkcja wywoływanie kończy się błędem, funkcja nie zostaje ponownie wywołana i zostanie usunięte. Po włączeniu ponownych prób w odpowiedzi na zdarzenia , Cloud Functions ponawia nieudane wywołanie funkcji do czasu lub ponowna próba wygaśnie.

W przypadku funkcji 2 generacji ten okres ponawiania wygasa po 24 godzinach. W przypadku funkcji 1 generacji traci ważność po 7 dniach. Cloud Functions ponawia próbę utworzenia nowo utworzonych funkcji opartych na zdarzeniach za pomocą: strategię ponowienia w okresie wykładniczego z rosnącym czasem ponowienia wynoszącym od 10 i 600 sekundzie. Ta zasada jest stosowana do nowych funkcji przy pierwszym wdrożeniu. Nie jest stosowana wstecznie do istniejących funkcji, które zostały wdrożone przed zmianami opisanymi w artykule tej informacji o wersji nawet po ponownym wdrożeniu funkcji.

Jeśli ponowna próba jest wyłączona dla funkcji, która jest ustawieniem domyślnym, funkcja zawsze zgłasza, że zostało wykonane pomyślnie, a 200 OK kodów odpowiedzi może widoczne w dziennikach. Dzieje się tak nawet wtedy, gdy funkcja napotkała błąd. Do jasno przedstaw, kiedy funkcja napotka błąd, zgłoś błędy w odpowiedni sposób.

Dlaczego funkcje oparte na zdarzeniach nie kończą się

W rzadkich przypadkach funkcja może zakończyć się przedwcześnie z powodu błędu wewnętrznego, i domyślnie ta funkcja może być powtarzana automatycznie.

Zwykle funkcja oparta na zdarzeniach może nie działać prawidłowo z powodu na błędy w kodzie funkcji. Możliwe powody to między innymi:

  • Funkcja zawiera błąd, a środowisko wykonawcze zgłasza wyjątek.
  • Funkcja nie może połączyć się z punktem końcowym usługi lub przekracza limit czasu podczas próby to zrobić.
  • Funkcja celowo zgłasza wyjątek (np. gdy parametr nie powiodła się).
  • Funkcja Node.js zwraca odrzuconą obietnicę lub przekazuje wartość inną niż null do oddzwonienie.

W każdym z tych przypadków domyślnie funkcja przestaje wykonywać, a zdarzenie jest odrzucany. Aby ponownie wykonać funkcję w przypadku wystąpienia błędu, możesz: zmień domyślną zasadę ponawiania o ustawienie „Ponów próbę w przypadku niepowodzenia” usługi. Powoduje to, że zdarzenie jest ponawiane wielokrotnie do momentu funkcja zostanie wykonana lub limit czasu ponownej próby wygaśnie.

Włączanie i wyłączanie ponawiania prób

Konfigurowanie ponownych prób w konsoli

Jeśli tworzysz nową funkcję:

  1. Z poziomu ekran Create Function (Utwórz funkcję), w sekcji Reguła i wybierz typ zdarzenia, które ma wywoływać działanie .
  2. Zaznacz pole wyboru Ponów próbę w przypadku niepowodzenia, aby włączyć ponawianie prób.

Jeśli aktualizujesz istniejącą funkcję:

  1. Na stronie z podsumowaniem funkcji w Cloud Functions kliknij nazwę funkcji, którą aktualizujesz, aby otworzyć ekran Szczegóły funkcji, a potem kliknij Edytuj na pasku menu, aby wyświetlić panel Reguła.
  2. Zaznacz lub odznacz pole wyboru Ponów próbę w przypadku niepowodzenia, aby włączyć lub wyłączyć tę funkcję. ponownych prób.

Skonfiguruj ponowne próby na podstawie kodu funkcji

Dzięki Cloud Functions dla Firebase możesz włączyć ponawianie prób w kodzie dla . Żeby zrobić to w przypadku funkcji działających w tle, takiej jak functions.foo.onBar(myHandler);, użyj runWith. i skonfiguruj zasadę niepowodzenia:

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

Ustawienie true tak jak pokazano, konfiguruje funkcję ponawiania próby w przypadku niepowodzenia.

Sprawdzone metody

W tej sekcji opisano sprawdzone metody korzystania z ponownych prób.

Ponów próbę w celu obsługi błędów przejściowych

Ponieważ funkcja jest ponawiana w sposób ciągły aż do momentu pomyślnego wykonania, trwałe błędy, takie jak błędy, należy wyeliminować z kodu poprzez testowanie przed włączeniem ponownych prób. Ponowne próby użycia są najlepsze w przypadku żądań tymczasowych i przejściowych. błędów, które z dużym prawdopodobieństwem zostaną rozwiązane po ponownej próbie, np. niestabilny punkt końcowy usługi lub czas oczekiwania.

Ustaw warunek końcowy, aby uniknąć nieskończonej pętli ponownych prób

Sprawdzoną metodą jest ochrona funkcji przed ciągłym zapętlaniem, gdy: przy użyciu ponownych prób. Możesz to zrobić, dodając dobrze zdefiniowany warunek końcowy, przed rozpoczęciem przetwarzania. Pamiętaj, że ta metoda działa tylko wtedy, gdy twój proces się uruchamia i może ocenić warunek końcowy.

Prostym, ale skutecznym sposobem jest odrzucanie zdarzeń z sygnaturami czasowymi starszym niż w określonym czasie. Pomaga to uniknąć nadmiernej liczby wykonań w przypadku błędów mogą być trwałe lub długotrwałe niż oczekiwano.

Na przykład ten fragment kodu odrzuca wszystkie zdarzenia starsze niż 10 sekund:

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;
}

Używaj produktu catch w połączeniu z obietnicami

Jeśli w Twojej funkcji włączone są ponawianie prób, każdy nieobsługiwany błąd aktywuje ponawianie. Sprawdź, czy Twój kod rejestruje wszystkie błędy, które nie powinny powodować ponowienia próby.

Oto przykład, co należy zrobić:

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

Ustaw jako idempotentne funkcje oparte na zdarzeniach z możliwością ponowienia

Funkcje oparte na zdarzeniach, które można powtarzać, muszą być idempotentne. Oto kilka ogólne wskazówki dotyczące ustawiania funkcji jako idempotentnej:

  • Wiele zewnętrznych interfejsów API (takich jak Stripe) umożliwia dostarczenie klucza idempotentności . Jeśli korzystasz z takiego interfejsu API, użyj identyfikatora zdarzenia jako klucz-wartość idempotentności.
  • Idempotentność sprawdza się co najmniej raz, ponieważ zapewnia spróbuj jeszcze raz. Ogólną sprawdzoną metodą pisania niezawodnego kodu jest więc łączenie idempotentności i ponownych prób.
  • Upewnij się, że Twój kod jest wewnętrznie idempotentny. Na przykład:
    • Sprawdź, czy mutacje mogą wystąpić więcej niż raz bez zmiany parametru wyniki.
    • Zapytanie o stan bazy danych w transakcji przed zmianą stanu.
    • Upewnij się, że wszystkie efekty uboczne mają charakter idempotentny.
  • Narzucaj kontrolę transakcyjną poza funkcją, niezależnie od kodu. Na przykład: bądź w miejscu, w którym zarejestrowano informację o tym, że dany identyfikator zdarzenia zostały już przetworzone.
  • Radzenie sobie ze zduplikowanymi wywołaniami funkcji poza zakresem. Na przykład przeprowadź osobną procedurę czyszczenia który oczyszcza po zduplikowanych wywołaniach funkcji.

Skonfiguruj zasadę ponawiania

W zależności od potrzeb funkcji w Cloud Functions warto skonfigurować ponawianie próby. Dzięki temu możesz skonfigurować dowolną kombinację :

  • Skróć okres ponawiania próby z 7 dni do maksymalnie 10 minut.
  • Zmień minimalny i maksymalny czas do ponowienia dla wzrastającego czasu do ponowienia ponów próbę.
  • Zmień strategię ponawiania prób, aby natychmiast spróbować ponownie.
  • Skonfiguruj temat niedostarczonych komunikatów.
  • Ustaw maksymalną i minimalną liczbę prób dostarczenia.

Aby skonfigurować zasadę ponawiania:

  1. napisać funkcję HTTP,
  2. Użyj interfejsu Pub/Sub API, aby utworzyć subskrypcję Pub/Sub, określając adres URL i ustaw funkcję jako obiekt docelowy.

Zapoznaj się z dokumentacją Pub/Sub dotyczącą błędów obsługi , aby dowiedzieć się więcej o bezpośrednim konfigurowaniu Pub/Sub.