Kolejkowanie funkcji za pomocą Cloud Tasks


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 scheduleTimedispatchDeadline, 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:

  1. Napisz funkcję kolejki zadań za pomocą pakietu SDK Firebase dla Cloud Functions.
  2. Przetestuj funkcję, aktywując ją za pomocą żądania HTTP.
  3. 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.
  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 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