Jobs, cron i kolejka niedostarczonych wiadomości
Jak uruchomić pracę poza żądaniem: czym jest zadanie, w jaki sposób jest ponawiane, jak cron tworzy zadania i co zrobić z zadaniami, które kończą się martwymi.
1. Umieść zadanie w kolejce
Zadanie to jedno wywołanie funkcji w tle. Kolejkuj go z serwera za pomocą klucza service_role.
| Opcja | Domyślny | Oznaczający |
|---|---|---|
payload | null | JSON podany do funkcji jako treść żądania |
delaySecs | 0 | Sekundy oczekiwania przed pierwszą próbą. Do tego czasu stanowisko pozostaje pending. |
maxAttempts | 3 | Łączna liczba prób, łącznie z pierwszą |
Odczytujesz zadanie za pomocą getJob(id) lub listJobs({ status, limit }) (limit mieści się w przedziale od 1 do 500, domyślnie 50). Zadanie ma status, attempts, max_attempts, error i daty scheduled_at, started_at, completed_at.
enqueueJob, getJob i listJobs potrzebują klucza service_role. Klucz publiczny otrzymuje 403.
2. Co otrzymuje Twoja funkcja
Zadanie wywołuje Twoją funkcję jak każde inne żądanie, z trzema różnicami, z którymi musisz się uporać:
| Część | Wartość |
|---|---|
| Metoda | JOB (nie POST) |
| Ścieżka | /jobs/<job id> |
| Ciało | Zadanie ma postać payload w formacie JSON |
| Nagłówki tożsamości | Brak: x-aura-role i x-aura-user-id są nieobecne |
Prawdziwe połączenie zostało zarejestrowane {"method":"JOB","path":"/jobs/d443d541-…","role":null,"userId":null,"body":"{\"items\":[\"a\",\"b\"],\"order\":42}"}.
Zadanie działa bez użytkownika: nie polegaj na x-aura-user-id. Jeśli utwór należy do użytkownika, umieść identyfikator użytkownika w ładunku.
3. Cykl życia i ponowne próby
- Zadanie jest uruchamiane przynajmniej raz. Może zostać uruchomiona dwukrotnie, jeśli proces roboczy zatrzyma się podczas jej działania, dlatego należy uczynić tę funkcję idempotentną.
- Nieudana próba jest ponawiana po ustalonym opóźnieniu wynoszącym 5 sekund, aż do osiągnięcia
maxAttempts. Zadaniem jest zatemdead. Opóźnienie i domyślna liczba prób to ustawienia usługi (JOB_RETRY_DELAY_SECS,JOB_MAX_RETRIES). - Zadanie, które po dzierżawie (domyślnie 450 sekund) nadal ma status
running, jest odzyskiwane przez usługę. - Gotowe zadania są domyślnie przechowywane przez 14 dni.
Zadanie jest completed, gdy tylko funkcja odpowie, niezależnie od kodu stanu. W prawdziwym działaniu funkcja, która zwróciła 500, po jednej próbie utworzyła zadanie completed i nigdy nie została ponowiona.
Zadanie kończy się niepowodzeniem i jest ponawiane tylko wtedy, gdy samo wywołanie nie powiedzie się: funkcja nie istnieje lub jest nieaktywna, środowisko wykonawcze jest nieosiągalne lub upłynął limit czasu wywołania. Jeśli chcesz ponowić próbę, gdy Twój własny kod wykryje błąd, umieść w kolejce nowe zadanie od procedury obsługi (z delaySecs w celu wycofania) zamiast polegać na kodzie stanu.
W tym samym rzeczywistym przebiegu zadanie dla funkcji, która nie istnieje, przeszło następującą sekwencję: próba 1 nie powiodła się po 3 s z Fonction 'ghost' introuvable, próba 2 nie powiodła się po około 9 s, a zadanie stało się dead z attempts równym max_attempts.
4. Kolejka utraconych wiadomości
Martwe zadania pozostają w kolejce i można je wyświetlić i ponowić. Te trasy nie mają jeszcze metody SDK: użyj protokołu HTTP z kluczem service_role.
Ponowna próba przywraca zadanie do pending bez resetowania licznika prób, więc wykonuje dokładnie jeszcze jedną próbę i powraca do dead, jeśli ponownie się nie powiedzie. Napraw przyczynę (na przykład wdróż brakującą funkcję) przed ponowną próbą.
5. Zaplanuj za pomocą crona
Wpis cron nie wywołuje samej funkcji: za każdym razem, gdy zostaje uruchomiony, umieszcza zadanie w kolejce.
- Harmonogram zawiera 5 pól (
min hour day month weekday) lub 6 pól (sec min hour day month weekday). Harmonogram 5-polowy ma0sekundy do przodu:*/1 * * * *jest przechowywany jako0 */1 * * * *. - Aliasy takie jak
@dailysą odrzucane za pomocą400określającego oczekiwany format. - Godziny są w formacie UTC.
last_runinext_runsąnullaż do pierwszego odpalenia. W rzeczywistości harmonogram utworzony o 15:40 uruchomił się o 15:41:00, a następnie pokazywałnext_run15:42:00.- Ładunek zostaje zablokowany podczas tworzenia wpisu.
- Usunięcie nieznanej nazwy zwraca
404. Usunięcie wpisu cron również zatrzymuje jego uruchomienie. - SDK nie ma
getCronJobaniupdateCronJob: usuń wpis i utwórz go ponownie.
W przypadku pracy wyłącznie z bazą danych rozszerzenie Postgres pg_cron pozwala uniknąć podróży w obie strony do funkcji: zobacz stronę Cron.