Kolejkowanie funkcji za pomocą Cloud Tasks


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

Załóżmy, że chcesz utworzyć kopie zapasowe dużej ilości plików z obrazami, które są obecnie hostowane w interfejsie API z ograniczeniem szybkości. Aby korzystać z tego interfejsu API w sposób odpowiedzialny, musisz przestrzegać związanych z nim limitów liczby żądań. Dodatkowo tego rodzaju długotrwałe zadanie może być podatne na awarie z powodu przekroczenia limitów czasu i limitów pamięci.

Aby uprościć ten proces, 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 tak, aby zapewnić skuteczną kontrolę nad zatorami oraz zasady ponawiania prób w przypadku tego typu operacji.

Pakiet SDK Firebase na 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 spowodować naliczenie opłat za przetwarzanie Cloud Tasks. Więcej informacji znajdziesz w cenniku usługi Cloud Tasks.

Tworzenie funkcji kolejki zadań

Aby używać funkcji kolejki zadań:

  1. Napisz funkcję kolejki zadań za pomocą pakietu SDK Firebase dla Cloud Functions.
  2. Przetestuj funkcję przez aktywowanie jej za pomocą żądania HTTP.
  3. Wdróż funkcję za pomocą interfejsu wiersza poleceń Firebase. Podczas pierwszego wdrażania funkcji kolejki zadań narzędzie wiersza poleceń utworzy kolejkę zadań w Cloud Tasks z opcjami (ograniczeniem szybkości i ponowną próbą) 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. Aby to zrobić, napisz kod za pomocą funkcji Admin SDK i wdróż go w kontekście Cloud Functions for Firebase.

Pisanie funkcji kolejki zadań

Aby zacząć pisać funkcje kolejki zadań, użyj onDispatch. Ważnym elementem funkcji kolejki zadań jest konfiguracja limitu prób i częstotliwości na podstawie kolejki. Przykładowe fragmenty kodu na tej stronie pochodzą z aplikacji konfigurującej usługę tworzącą kopie zapasowe wszystkich zdjęć ze zdjęcia dnia NASA Astronomy Picture of the Day:

Konfigurowanie funkcji kolejki zadań

Funkcje kolejki zadań są wyposażone w zaawansowany zestaw ustawień konfiguracji, który umożliwia dokładne kontrolowanie limitów szybkości i zachowania funkcji ponownego próbowania 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 powtarzane do 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 powtarzane co co najmniej 60 sekund. Zapewnia to duży bufor między próbami, dzięki czemu nie wyczerpujemy zbyt szybko 5 prób.
  • rateLimits.maxConcurrentDispatch=6: w danym momencie wysyłanych jest maksymalnie 6 zadań. Pomaga to zapewnić stały strumień żądań do funkcji bazowej oraz zmniejszyć liczbę aktywnych instancji i uruchomień „na zimno”.

Testowanie funkcji kolejki zadań

W większości przypadków najlepszym sposobem na przetestowanie funkcji kolejki zadań jest użycie emulatora Cloud Functions. W dokumentacji pakietu emulatorów dowiesz się, jak przetestować aplikację pod kątem emulacji funkcji kolejki zadań.

Dodatkowo funkcje kolejki zadań są udostępniane jako proste funkcje HTTP w Firebase Local Emulator Suite. Aby przetestować emulowaną funkcję zadania, wyślij żą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ń CLI tworzy kolejkę zadań w Cloud Tasks z opcjami (ograniczeniem szybkości i ponowną próbą) określonymi w kodzie źródłowym.

Jeśli podczas wdrażania funkcji wystąpią błędy uprawnień, sprawdź, czy użytkownik wykonujący polecenia wdrażania ma przypisane odpowiednie role uprawnień IAM.

Funkcja kolejkowania zadań

Funkcje kolejki zadań można umieszczać w kole w Cloud Tasks z zaufanego środowiska serwera, takiego jak Cloud Functions for Firebase, za pomocą funkcji Firebase Admin SDK w Node.js. Jeśli dopiero zaczynasz korzystać z Admin SDK, zapoznaj się z artykułem Dodawanie Firebase do serwera.

W typowym przypadku usługa Admin SDK tworzy nowe zadanie, umieszcza je w kole Cloud Tasks i ustala jego konfigurację:

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 stara się rozłożyć wykonywanie zadań w czasie, przypisując opóźnienie o N minut do N-tego zadania. Oznacza to, że zadanie jest wykonywane około 1 raz na minutę. Pamiętaj, że możesz też użyć scheduleTime, jeśli chcesz, aby Cloud Tasks wywołało zadanie o określonym czasie.
  • dispatchDeadlineSeconds: maksymalny czas, przez który Cloud Tasks będzie czekać na wykonanie zadania. Cloud Tasks spróbuje ponownie wykonać zadanie zgodnie z konfiguracją kolejki lub do momentu osiągnięcia tego terminu. W tym przykładzie kolejka jest skonfigurowana tak, aby próbować wykonać zadanie maksymalnie 5 razy, ale zadanie jest automatycznie anulowane, jeśli cały proces (w tym próby ponownego wykonania) trwa dłużej niż 5 minut.

Rozwiązywanie problemów

„Zadania w chmurze” > Włącz logowanie Cloud Tasks

Logi 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ą potencjalnie wygenerować w Twoim projekcie. Zalecamy włączenie dzienników debugowania podczas aktywnego tworzenia i debugowania funkcji kolejki zadań. Zobacz Włączanie logowania.

Uprawnienia

Podczas kolejkowania zadań lub wywoływania funkcji kolejki zadań przez Cloud Tasks mogą wystąpić błędy PERMISSION DENIED. Sprawdź, czy Twój projekt ma te powiązania uprawnień:

  • Tożsamość używana do umieszczania zadań w kolejce w usłudze Cloud Tasks wymaga uprawnienia cloudtasks.tasks.create.

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

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

Instrukcje dodawania domyślnego konta usługi App Engine jako użytkownika domyślnego konta usługi App Engine znajdziesz w dokumentacji Google Cloud IAM.

  • Tożsamość użyta do wywołania funkcji kolejki zadań musi mieć uprawnienia cloudfunctions.functions.invoke.

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

gcloud functions add-iam-policy-binding $FUNCTION_NAME \
  --region=us-central1 \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudfunctions.invoker