Funkcje kolejki zadań wykorzystują technologię Google Cloud Tasks, aby ułatwić aplikacji asynchroniczne wykonywanie zadań, które zajmują czasochłonne, wymagające znacznych zasobów lub z ograniczoną przepustowością 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 ograniczonym limitem liczby żądań. Aby być odpowiedzialnym użytkownikiem tego interfejsu API, musisz przestrzegać jego limitów szybkości. Poza tym tego typu długotrwałe zadania mogą być podatne na błędy z powodu limitów czasu i pamięci.
Aby zmniejszyć złożoność, możesz napisać funkcję kolejki zadań, która ustawia podstawowe opcje zadań, takie jak scheduleTime
i dispatchDeadline
, a następnie przekazać ją do kolejki w Cloud Tasks. Środowisko Cloud Tasks zostało zaprojektowane pod kątem skutecznego kontrolowania natężenia ruchu i zapewniania zasad ponownych prób w przypadku tego rodzaju 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ć obciążenia za przetwarzanieCloud Tasks. Więcej informacji znajdziesz w cenniku.
Tworzenie funkcji kolejki zadań
Aby używać funkcji kolejki zadań:
- Napisz funkcję kolejki zadań za pomocą pakietu SDK Firebase dla Cloud Functions.
- Przetestuj funkcję przez aktywowanie jej za pomocą żądania HTTP.
- wdrożyć 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.
- Do nowo utworzonej kolejki zadań możesz dodawać zadania, 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łady kodu na tej stronie są oparte na aplikacji, która konfiguruje usługę tworzącą kopię zapasową wszystkich obrazów z Astronomy Picture of the Day (Astronomiczna fotografia dnia) z NASA:
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. Pozwala to utworzyć duży bufor pomiędzy każdą kolejną próbą, aby nie spieszyć się do zbyt szybkiego wykorzystania 5 prób.rateLimits.maxConcurrentDispatch=6
: w danym momencie wysyłanych jest maksymalnie 6 zadań. Pomaga to zapewnić stały napływ żądań do funkcji podstawowej i zmniejsza liczbę aktywnych instancji oraz uruchomień „na zimno”.
Testowanie funkcji kolejki zadań
W większości przypadków najlepszym sposobem testowania funkcji kolejki zadań jest emulator 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
Przy wdrażaniu funkcji kolejki zadań po raz pierwszy interfejs wiersza poleceń tworzy w Cloud Tasks kolejkę zadań z opcjami (ograniczanie liczby żądań i ponowienie prób) określonymi w kodzie źródłowym.
Jeśli podczas wdrażania funkcji wystąpią błędy uprawnień, sprawdź, czy do użytkownika, który wykonuje polecenia wdrażania, przypisane są odpowiednie role uprawnień.
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 czasu upływu 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.
Więcej informacji o dodawaniu 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 tym 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