Funkcje kolejki zadań korzystają z usługi GoogleCloud Tasks, aby pomagać aplikacji w asynchronicznym wykonywaniu czasochłonnych, zasobożernych lub wymagających dużej przepustowości zadań poza głównym przepływem aplikacji.
Załóżmy na przykład, że chcesz utworzyć kopie zapasowe dużego zestawu plików graficznych, które są obecnie hostowane w interfejsie API z limitem liczby żądań. Aby być odpowiedzialnym użytkownikiem tego interfejsu API, musisz przestrzegać limitów liczby żądań. Dodatkowo takie długotrwałe zadanie może być podatne na awarie z powodu limitów czasu i pamięci.
Aby zmniejszyć tę złożoność, możesz napisać funkcję kolejki zadań, która ustawia podstawowe opcje zadań, takie jak scheduleTime
i dispatchDeadline
, a następnie przekazuje funkcję do kolejki w Cloud Tasks. Środowisko Cloud Tasks zostało zaprojektowane specjalnie z myślą o zapewnieniu skutecznej kontroli przeciążenia i zasad ponawiania w przypadku tego rodzaju operacji.
Pakiet SDK Firebase w wersji Cloud Functions for Firebase 3.20.1 i nowszej współpracuje z Firebase Admin SDK w wersji 10.2.0 i nowszej, aby obsługiwać funkcje kolejki zadań.
Korzystanie z funkcji kolejki zadań w Firebase może wiązać się z opłatami za przetwarzanie.Cloud Tasks Więcej informacji znajdziesz w Cloud Taskscenniku.
Tworzenie funkcji kolejki zadań
Aby korzystać z funkcji kolejki zadań, wykonaj te czynności:
- Napisz funkcję kolejki zadań za pomocą pakietu SDK Firebase dla Cloud Functions.
- Przetestuj funkcję, aktywując ją za pomocą żądania HTTP.
- Wdróż funkcję za pomocą interfejsu Firebase CLI. Podczas pierwszego wdrażania funkcji kolejki zadań interfejs CLI utworzy kolejkę zadań w Cloud Tasks z opcjami (ograniczanie szybkości i ponawianie) określonymi w kodzie źródłowym.
- Dodaj zadania do nowo utworzonej kolejki zadań, przekazując parametry, aby w razie potrzeby skonfigurować harmonogram wykonywania. Możesz to zrobić, pisząc kod za pomocą Admin SDK i wdrażając go w Cloud Functions for Firebase.
Pisanie funkcji kolejki zadań
Aby rozpocząć pisanie funkcji kolejki zadań, użyj onDispatch
. Ważnym elementem pisania funkcji kolejki zadań jest skonfigurowanie ponawiania prób i ograniczania szybkości dla poszczególnych kolejek. Przykłady kodu na tej stronie są oparte na aplikacji, która konfiguruje usługę tworzącą kopie zapasowe wszystkich obrazów z Astronomy Picture of the Day NASA:
Konfigurowanie funkcji kolejki zadań
Funkcje kolejki zadań mają zaawansowany zestaw ustawień konfiguracji, które umożliwiają precyzyjne kontrolowanie limitów szybkości i ponawiania w kolejce zadań:
exports.backupApod = functions
.runWith( {secrets: ["NASA_API_KEY"]})
.tasks.taskQueue({
retryConfig: {
maxAttempts: 5,
minBackoffSeconds: 60,
},
rateLimits: {
maxConcurrentDispatches: 6,
},
}).onDispatch(async (data) => {
retryConfig.maxAttempts=5
: każde zadanie w kolejce zadań jest automatycznie ponawiane maksymalnie 5 razy. Pomaga to ograniczyć przejściowe błędy, takie jak błędy sieciowe lub tymczasowe przerwy w działaniu zależnej usługi zewnętrznej.retryConfig.minBackoffSeconds=60
: każda próba wykonania zadania jest ponawiana co najmniej co 60 sekund. Dzięki temu między poszczególnymi próbami jest duży bufor, więc nie wyczerpujemy zbyt szybko 5 prób ponowienia.rateLimits.maxConcurrentDispatch=6
: W danym momencie wysyłanych jest maksymalnie 6 zadań. Zapewnia to stały strumień żądań do funkcji bazowej i pomaga zmniejszyć liczbę aktywnych instancji oraz uruchomień „na zimno”.
Testowanie funkcji kolejki zadań
W większości przypadków Cloud Functionsemulator jest najlepszym sposobem na testowanie funkcji kolejki zadań. Więcej informacji o tym, jak przygotować aplikację do emulacji funkcji kolejki zadań, znajdziesz w dokumentacji pakietu Emulator Suite.
Funkcje kolejki zadań są też udostępniane jako proste funkcje HTTP w Firebase Local Emulator Suite. Funkcję emulowanego zadania możesz przetestować, wysyłając żądanie HTTP POST z ładunkiem danych JSON:
# start the Firebase Emulators
firebase emulators:start
# trigger the emulated task queue function
curl \
-X POST # An HTTP POST request...
-H "content-type: application/json" \ # ... with a JSON body
http://localhost:$PORT/$PROJECT_ID/$REGION/$NAME \ # ... to function url
-d '{"data": { ... some data .... }}' # ... with JSON encoded data
Wdrażanie funkcji kolejki zadań
Wdróż funkcję kolejki zadań za pomocą wiersza poleceń Firebase:
$ firebase deploy --only functions:backupApod
Podczas pierwszego wdrażania funkcji kolejki zadań interfejs CLI tworzy w Cloud Tasks kolejkę zadań z opcjami (ograniczanie szybkości i ponawianie) określonymi w kodzie źródłowym.
Jeśli podczas wdrażania funkcji wystąpią błędy uprawnień, sprawdź, czy użytkownikowi, który uruchamia polecenia wdrażania, przypisano odpowiednie role uprawnień.
Dodawanie do kolejki zadań funkcji
Funkcje kolejki zadań można umieszczać w kolejce w Cloud Tasks z zaufanego środowiska serwera, takiego jak Cloud Functions for Firebase, za pomocą Firebase Admin SDK dla Node.js. Jeśli dopiero zaczynasz korzystać z Admin SDK, zapoznaj się z artykułem Dodawanie Firebase do serwera.
W typowym przepływie pracy Admin SDK tworzy nowe zadanie, umieszcza je w kolejce Cloud Tasks i konfiguruje je:
exports.enqueueBackupTasks = functions.https.onRequest(
async (_request, response) => {
const queue = getFunctions().taskQueue("backupApod");
const enqueues = [];
for (let i = 0; i <= 10; i += 1) {
// Enqueue each task with i*60 seconds delay. Our task queue function
// should process ~1 task/min.
const scheduleDelaySeconds = i * 60
enqueues.push(
queue.enqueue(
{ id: `task-${i}` },
{
scheduleDelaySeconds,
dispatchDeadlineSeconds: 60 * 5 // 5 minutes
},
),
);
}
await Promise.all(enqueues);
response.sendStatus(200);
});
scheduleDelaySeconds
: przykładowy kod próbuje rozłożyć wykonywanie zadań w czasie, przypisując do N-tego zadania opóźnienie wynoszące N minut. Oznacza to wywoływanie około 1 zadania na minutę. Pamiętaj, że możesz też użyćscheduleTime
, jeśli chcesz, aby Cloud Tasks wywoływało zadanie o określonej godzinie.dispatchDeadlineSeconds
: Maksymalny czas, przez jaki Cloud Tasks będzie czekać na ukończenie zadania. Cloud Tasks ponowi próbę wykonania zadania zgodnie z konfiguracją ponownych prób w kolejce lub do momentu osiągnięcia tego terminu. W przykładzie kolejka jest skonfigurowana tak, aby ponawiać wykonanie zadania maksymalnie 5 razy, ale zadanie jest automatycznie anulowane, jeśli cały proces (w tym próby ponowienia) trwa dłużej niż 5 minut.
Rozwiązywanie problemów
Włącz logowanie Cloud Tasks
Dzienniki z Cloud Tasks zawierają przydatne informacje diagnostyczne, takie jak stan żądania powiązanego z zadaniem. Domyślnie logi z usługi Cloud Tasks są wyłączone ze względu na dużą liczbę logów, które mogą być generowane w Twoim projekcie. Zalecamy włączenie dzienników debugowania podczas aktywnego tworzenia i debugowania funkcji kolejki zadań. Zobacz sekcję Włączanie logowania.
Uprawnienia
Podczas dodawania zadań do kolejki lub gdy Cloud Tasks próbuje wywołać funkcje kolejki zadań, mogą pojawić się błędy PERMISSION DENIED
. Sprawdź, czy Twój projekt ma te powiązania IAM:
Tożsamość używana do umieszczania zadań w kolejce w usłudze Cloud Tasks musi mieć uprawnienia
cloudtasks.tasks.create
IAM.W przykładzie jest to App Engine domyślne konto usługi.
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
--role=roles/cloudtasks.enqueuer
Tożsamość używana do umieszczania zadań w kolejce w usłudze Cloud Tasks musi mieć uprawnienia do korzystania z konta usługi powiązanego z zadaniem w usłudze Cloud Tasks.
W przykładzie jest to App Engine domyślne konto usługi.
Instrukcje dodawania App Engine domyślnego konta usługi jako użytkownika App Engine domyślnego konta usługi znajdziesz w dokumentacji Cloud IAM.
Tożsamość używana do wywoływania funkcji kolejki zadań musi mieć uprawnienie
cloudfunctions.functions.invoke
.W przykładzie jest to App Engine domyślne konto usługi.
gcloud functions add-iam-policy-binding $FUNCTION_NAME \
--region=us-central1 \
--member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
--role=roles/cloudfunctions.invoker