Kolejkowanie funkcji za pomocą Cloud Tasks (1 generacji)

Funkcje kolejki zadań korzystają z Google Cloud Tasks aby umożliwić aplikacji asynchroniczne wykonywanie zadań czasochłonnych, wymagających dużej ilości zasobów lub ograniczonych przepustowością poza głównym przepływem aplikacji.

Wyobraź sobie na przykład, że chcesz utworzyć kopie zapasowe dużego zbioru plików graficznych, które są obecnie hostowane w interfejsie API z limitem liczby żądań. Aby korzystać z tego interfejsu API w sposób odpowiedzialny, musisz przestrzegać jego limitów liczby żądań. Ponadto tego rodzaju długotrwałe zadania mogą być podatne na awarie z powodu przekroczenia 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 w celu zapewnienia skutecznej kontroli przeciążenia i zasad ponawiania w przypadku tego rodzaju operacji.

Pakiet SDK Firebase dla Cloud Functions for Firebase w wersji 3.20.1 lub nowszej współpracuje z Firebase Admin SDK w wersji 10.2.0 lub nowszej, aby obsługiwać funkcje kolejki zadań.

Korzystanie z funkcji kolejki zadań w Firebase może wiązać się z opłatami za Cloud Tasks przetwarzanie. Więcej informacji znajdziesz w cenniku Cloud Tasks.

Tworzenie funkcji kolejki zadań

Aby korzystać z funkcji kolejki zadań, wykonaj te czynności:

  1. Napisz funkcję kolejki zadań za pomocą pakietu Firebase SDK dla Cloud Functions.
  2. Przetestuj funkcję, wywołując ją za pomocą żądania HTTP.
  3. Wdróż funkcję za pomocą wiersza poleceń Firebase. Podczas pierwszego wdrażania funkcji kolejki zadań interfejs wiersza poleceń utworzy w Cloud Tasks kolejkę zadań z opcjami (ograniczanie liczby żądań i ponawianie) określonymi w kodzie źródłowym.
  4. 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 zacząć pisać funkcje kolejki zadań, użyj onDispatch. Ważną częścią pisania funkcji kolejki zadań jest ustawienie konfiguracji ponawiania i ograniczania liczby żądań dla każdej kolejki. Przykłady kodu na tej stronie są oparte na aplikacji, która konfiguruje usługę tworzącą kopie zapasowe wszystkich zdjęć z Astronomy Picture of the Day NASA:

Konfigurowanie funkcji kolejki zadań

Funkcje kolejki zadań mają zaawansowany zestaw ustawień konfiguracyjnych, które umożliwiają precyzyjne kontrolowanie limitów liczby żądań i zachowania ponawiania kolejki 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żde zadanie jest ponawiane co najmniej 60 sekund po każdej próbie. Zapewnia to duży bufor między każdą próbą, dzięki czemu nie wyczerpiemy zbyt szybko 5 prób ponowienia.
  • rateLimits.maxConcurrentDispatch=6: w danym momencie wysyłanych jest maksymalnie 6 zadań. Pomaga to zapewnić stały strumień żądań do funkcji bazowej i zmniejszyć liczbę aktywnych instancji oraz uruchomień „na zimno”.

Testowanie funkcji kolejki zadań

W większości przypadków najlepszym sposobem na testowanie funkcji kolejki zadań jest emulator Cloud Functions. Informacje o tym, jak przygotować aplikację do emulacji funkcji kolejki zadań, znajdziesz w dokumentacji pakietu Emulator Suite.

Dodatkowo funkcje kolejki zadań są udostępniane jako proste funkcje HTTP w Firebase Local Emulator Suite. Możesz przetestować emulowaną funkcję zadania, 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 wiersza poleceń utworzy kolejkę zadań w Cloud Tasks z opcjami (ograniczanie liczby żądań i ponawianie) określonymi w kodzie źródłowym.

Jeśli podczas wdrażania funkcji wystąpią błędy uprawnień, sprawdź, czy do użytkownika wykonującego polecenia wdrożenia są przypisane odpowiednie role uprawnień.

Dodawanie funkcji kolejki zadań do kolejki

Funkcje kolejki zadań można dodawać do kolejki 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 Admin SDK tworzy nowe zadanie, dodaje je do kolejki w Cloud Tasks, i ustawia konfigurację zadania:

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ń, przypisując opóźnienie N minut do N-tego zadania. Oznacza to wywoływanie ok. 1 zadania na minutę. Jeśli chcesz, aby Cloud Tasks wywoływało zadanie o określonej godzinie, możesz też użyć scheduleTime.
  • dispatchDeadlineSeconds: maksymalny czas, przez jaki Cloud Tasks będzie czekać na wykonanie zadania. Cloud Tasks ponowi zadanie zgodnie z konfiguracją ponawiania kolejki lub do momentu osiągnięcia tego terminu. W przykładzie, kolejka jest skonfigurowana tak, aby ponawiać zadanie 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łączanie logowania Cloud Tasks

Dzienniki z Cloud Tasks zawierają przydatne informacje diagnostyczne, takie jak stan żądania powiązanego z zadaniem. Domyślnie dzienniki z Cloud Tasks są wyłączone ze względu na dużą liczbę dzienników, które mogą być generowane w Twoim projekcie. Zalecamy włączenie dzienników debugowania podczas aktywnego tworzenia i debugowania funkcji kolejki zadań. Zobacz 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 uprawnień:

  • Tożsamość używana do dodawania zadań do kolejki w Cloud Tasks musi mieć cloudtasks.tasks.create uprawnienie.

    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 dodawania zadań do kolejki w Cloud Tasks musi mieć uprawnienia do korzystania z konta usługi powiązanego z zadaniem w Cloud Tasks.

    W przykładzie jest to App Engine domyślne konto usługi.

Instrukcje dotyczące dodawania App Engine domyślnego konta usługi jako użytkownika App Engine domyślnego konta usługi znajdziesz w dokumentacji Google 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