Funkcje umieszczania w kolejce za pomocą zadań w chmurze

Funkcje kolejki zadań wykorzystują Google Cloud Tasks , aby pomóc Twojej aplikacji wykonywać asynchronicznie czasochłonne, wymagające dużej ilości zasobów lub ograniczone przepustowością zadania poza głównym przepływem aplikacji.

Na przykład wyobraź sobie, że chcesz utworzyć kopie zapasowe dużego zestawu plików obrazów, które są obecnie hostowane w interfejsie API z ograniczeniem szybkości. Aby być odpowiedzialnym konsumentem tego interfejsu API, musisz przestrzegać ich limitów stawek. Ponadto tego rodzaju długotrwałe zadania mogą być podatne na niepowodzenie z powodu przekroczenia limitów czasu i limitów pamięci.

Aby złagodzić 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 tę funkcję do kolejki w Cloud Tasks. Środowisko Cloud Tasks zostało zaprojektowane specjalnie w celu zapewnienia skutecznej kontroli przeciążenia i zasad ponawiania prób dla tego rodzaju operacji.

Pakiet Firebase SDK dla funkcji Cloud Functions dla Firebase w wersji 3.20.1 lub nowszej współpracuje z pakietem Firebase Admin SDK w wersji 10.2.0 lub nowszej w celu obsługi funkcji kolejki zadań.

Korzystanie z funkcji kolejki zadań w Firebase może skutkować naliczeniem opłat za przetwarzanie Cloud Tasks. Więcej informacji znajdziesz w cenniku zadań w chmurze .

Tworzenie funkcji kolejki zadań

Aby korzystać z funkcji kolejki zadań, postępuj zgodnie z następującym przepływem pracy:

  1. Napisz funkcję kolejki zadań za pomocą pakietu Firebase SDK dla Cloud Functions.
  2. Przetestuj swoje funkcje za pomocą pakietu Firebase Local Emulator Suite.
  3. Wdróż swoją funkcję za pomocą interfejsu wiersza polecenia Firebase. Podczas wdrażania funkcji kolejki zadań po raz pierwszy, CLI utworzy kolejkę zadań w Cloud Tasks z opcjami (ograniczenie szybkości i ponawianie prób) określonymi w kodzie źródłowym.
  4. Dodaj zadania do nowo utworzonej kolejki zadań, przekazując parametry, aby w razie potrzeby ustawić harmonogram wykonania. Możesz to osiągnąć, pisząc kod przy użyciu pakietu Admin SDK i wdrażając go w Cloud Functions dla Firebase.

Pisanie funkcji kolejki zadań

Użyj onDispatch , aby rozpocząć pisanie funkcji kolejki zadań. Ważną częścią pisania funkcji kolejki zadań jest ustawienie ponawiania kolejnych kolejek i konfiguracji ograniczania szybkości. Próbki kodu na tej stronie są oparte na aplikacji, która konfiguruje usługę, która tworzy kopię zapasową wszystkich zdjęć z Astronomy Picture of the Day NASA:

Konfiguracja kolejki zadań

Funkcje kolejki zadań są dostarczane z potężnym zestawem ustawień konfiguracyjnych, aby precyzyjnie kontrolować limity szybkości i ponawiać zachowanie 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 złagodzić przejściowe błędy, takie jak błędy sieciowe lub tymczasowe zakłócenia usługi zależnej usługi zewnętrznej.
  • retryConfig.minBackoffSeconds=60 : Każde zadanie jest ponawiane co najmniej 60 sekund od każdej próby. Zapewnia to duży bufor między każdą próbą, więc nie spieszymy się zbyt szybko z wyczerpaniem 5 ponownych prób.
  • rateLimits.maxConcurrentDispatch=6 : Maksymalnie 6 zadań jest wysyłanych w danym czasie. Pomaga to zapewnić stały strumień żądań do podstawowej funkcji i pomaga zmniejszyć liczbę aktywnych instancji i zimnych startów.

Testowanie funkcji kolejki zadań za pomocą pakietu Firebase Local Emulator Suite

Funkcje kolejki zadań w pakiecie Firebase Local Emulator Suite są przedstawiane jako proste funkcje HTTP. Możesz przetestować funkcję emulowanego 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ą interfejsu Firebase CLI:

$ firebase deploy --only functions:backupApod

Podczas wdrażania funkcji kolejki zadań po raz pierwszy CLI tworzy kolejkę zadań w Cloud Tasks z opcjami (ograniczenie szybkości i ponawianie prób) określonymi w kodzie źródłowym.

Jeśli podczas wdrażania funkcji wystąpią błędy uprawnień, upewnij się, że odpowiednie role uprawnień są przypisane do użytkownika uruchamiającego polecenia wdrażania.

Umieść funkcję w kolejce

Funkcje kolejki zadań można umieszczać w kolejce w Cloud Tasks z zaufanego środowiska serwera, takiego jak Cloud Functions dla Firebase, przy użyciu pakietu Firebase Admin SDK dla Node.js. Jeśli nie masz doświadczenia z pakietami Admin SDK, zobacz Dodawanie Firebase do serwera , aby rozpocząć.

W typowym przepływie zestaw Admin SDK tworzy nowe zadanie, umieszcza je w kolejce w {cloudtasks_name}} 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 day. 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ń przez skojarzenie opóźnienia N-tego minut z N-tym zadaniem. Przekłada się to na wyzwalanie ~ 1 zadanie/minutę. Pamiętaj, że możesz również użyć funkcji scheduleTime , jeśli chcesz, aby zadania w chmurze uruchamiały zadanie o określonej godzinie.
  • dispatchDeadlineSeconds : maksymalny czas oczekiwania zadań w chmurze na zakończenie zadania. Cloud Tasks ponowi próbę wykonania zadania po skonfigurowaniu ponawiania próby w kolejce lub przed upływem tego terminu. W przykładzie kolejka jest skonfigurowana do ponawiania zadania do 5 razy, ale zadanie jest automatycznie anulowane, jeśli cały proces (w tym ponawianie prób) trwa dłużej niż 5 minut.

Rozwiązywanie problemów

Włącz rejestrowanie zadań w chmurze

Dzienniki z Cloud Tasks zawierają przydatne informacje diagnostyczne, takie jak stan żądania powiązanego z zadaniem. Domyślnie logi z Cloud Tasks są wyłączone ze względu na dużą liczbę logów, które mogą one potencjalnie generować w Twoim projekcie. Zalecamy włączenie dzienników debugowania podczas aktywnego opracowywania i debugowania funkcji kolejki zadań. Zobacz Włączanie rejestrowania .

Uprawnienia

Podczas dodawania zadań do kolejki lub gdy Cloud Tasks próbuje wywołać funkcje kolejki zadań, mogą pojawić się błędy PERMISSION DENIED DENIED. Upewnij się, że Twój projekt ma następujące powiązania uprawnień:

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

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

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 Cloud Tasks wymaga uprawnień 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 .

Zapoznaj się z dokumentacją Google Cloud IAM, aby dowiedzieć się, jak dodać domyślne konto usługi App Engine jako użytkownika domyślnego konta 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