Функции очереди задач используют преимущества Google Cloud Tasks , чтобы помочь вашему приложению выполнять трудоемкие, ресурсоемкие или ограниченные по полосе пропускания задачи асинхронно, вне основного потока приложения.
Например, представьте, что вы хотите создать резервные копии большого набора файлов изображений, которые в настоящее время размещены на API с ограничением скорости. Чтобы быть ответственным потребителем этого API, вам нужно соблюдать его ограничения скорости. Кроме того, такого рода долгосрочные задания могут быть уязвимы для сбоев из-за тайм-аутов и ограничений памяти.
Чтобы уменьшить эту сложность, вы можете написать функцию очереди задач, которая устанавливает основные параметры задач, такие как scheduleTime
и dispatchDeadline
, а затем передает функцию в очередь в Cloud Tasks . Среда Cloud Tasks специально разработана для обеспечения эффективного контроля перегрузки и политик повторных попыток для таких операций.
Firebase SDK для Cloud Functions for Firebase v3.20.1 и выше взаимодействует с Firebase Admin SDK v10.2.0 и выше для поддержки функций очереди задач.
Использование функций очереди задач с Firebase может привести к расходам на обработку Cloud Tasks . Для получения дополнительной информации см. цены на Cloud Tasks .
Создать функции очереди задач
Чтобы использовать функции очереди задач, следуйте этой последовательности действий:
- Напишите функцию очереди задач с помощью Firebase SDK для Cloud Functions .
- Протестируйте свою функцию, запустив ее с помощью HTTP-запроса.
- Разверните свою функцию с помощью Firebase CLI. При первом развертывании функции очереди задач CLI создаст очередь задач в Cloud Tasks с параметрами (ограничение скорости и повтор), указанными в исходном коде.
- Добавьте задачи в недавно созданную очередь задач, передавая параметры для настройки расписания выполнения, если необходимо. Вы можете добиться этого, написав код с помощью Admin SDK и развернув его в Cloud Functions for Firebase .
Функции очереди задач записи
Используйте onDispatch
, чтобы начать писать функции очереди задач. Важной частью написания функции очереди задач является настройка повтора для каждой очереди и конфигурации ограничения скорости. Примеры кода на этой странице основаны на приложении, которое настраивает службу, которая создает резервные копии всех изображений из NASA's Astronomy Picture of the Day :
Настройка функций очереди задач
Функции очереди задач поставляются с мощным набором параметров конфигурации для точного управления ограничениями скорости и поведением повторных попыток очереди задач:
exports.backupApod = functions
.runWith( {secrets: ["NASA_API_KEY"]})
.tasks.taskQueue({
retryConfig: {
maxAttempts: 5,
minBackoffSeconds: 60,
},
rateLimits: {
maxConcurrentDispatches: 6,
},
}).onDispatch(async (data) => {
retryConfig.maxAttempts=5
: Каждая задача в очереди задач автоматически повторяется до 5 раз. Это помогает смягчить временные ошибки, такие как сетевые ошибки или временное нарушение обслуживания зависимой внешней службы.-
retryConfig.minBackoffSeconds=60
: Каждая задача повторяется не менее чем через 60 секунд после каждой попытки. Это обеспечивает большой буфер между каждой попыткой, поэтому мы не торопимся исчерпать 5 попыток слишком быстро. -
rateLimits.maxConcurrentDispatch=6
: в заданное время отправляется максимум 6 задач. Это помогает обеспечить постоянный поток запросов к базовой функции и помогает сократить количество активных экземпляров и холодных запусков.
Функции очереди тестовых задач
В большинстве случаев эмулятор Cloud Functions — лучший способ протестировать функции очереди задач. Ознакомьтесь с документацией Emulator Suite, чтобы узнать, как инструментировать свое приложение для эмуляции функций очереди задач .
Кроме того, функции очереди задач представлены как простые функции HTTP в Firebase Local Emulator Suite . Вы можете протестировать эмулированную функцию задачи, отправив запрос HTTP POST с полезной нагрузкой данных 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
Развертывание функций очереди задач
Разверните функцию очереди задач с помощью Firebase CLI:
$ firebase deploy --only functions:backupApod
При первом развертывании функции очереди задач CLI создает очередь задач в Cloud Tasks с параметрами (ограничение скорости и повтор), указанными в исходном коде.
Если при развертывании функций возникают ошибки разрешений, убедитесь, что пользователю, запускающему команды развертывания, назначены соответствующие роли IAM .
Функции постановки задач в очередь
Функции очереди задач можно поставить в очередь в Cloud Tasks из доверенной серверной среды, например Cloud Functions for Firebase используя Firebase Admin SDK для Node.js. Если вы новичок в Admin SDK , см. раздел Добавление Firebase на сервер , чтобы начать работу.
В типичном потоке Admin SDK создает новую задачу, помещает ее в очередь в Cloud Tasks и задает конфигурацию для задачи:
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
: пример кода пытается распределить выполнение задач, связывая задержку в N-е минут для N-й задачи. Это соответствует запуску ~ 1 задачи/минуту. Обратите внимание, что вы также можете использоватьscheduleTime
если хотите, чтобы Cloud Tasks запускал задачу в определенное время.-
dispatchDeadlineSeconds
: Максимальное время, в течение которого Cloud Tasks будет ожидать завершения задачи. Cloud Tasks будет повторять задачу после настройки повтора очереди или до достижения этого крайнего срока. В примере очередь настроена на повтор задачи до 5 раз, но задача автоматически отменяется, если весь процесс (включая попытки повтора) занимает более 5 минут.
Поиск неисправностей
Включите ведение журнала Cloud Tasks
Журналы из Cloud Tasks содержат полезную диагностическую информацию, например, статус запроса, связанного с задачей. По умолчанию журналы из Cloud Tasks отключены из-за большого объема журналов, которые они потенциально могут генерировать в вашем проекте. Мы рекомендуем вам включить журналы отладки, пока вы активно разрабатываете и отлаживаете функции очереди задач. См. Включение ведения журнала .
Разрешения IAM
Вы можете увидеть ошибки PERMISSION DENIED
при постановке задач в очередь или когда Cloud Tasks пытается вызвать функции очереди задач. Убедитесь, что ваш проект имеет следующие привязки IAM:
Для идентификации, используемой для постановки задач в очередь в Cloud Tasks необходимо разрешение IAM
cloudtasks.tasks.create
.В примере это учетная запись службы App Engine по умолчанию.
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
--role=roles/cloudtasks.enqueuer
Для идентификации, используемой для постановки задач в очередь в Cloud Tasks необходимо разрешение на использование учетной записи службы, связанной с задачей в Cloud Tasks .
В примере это учетная запись службы App Engine по умолчанию .
Инструкции по добавлению учетной записи службы App Engine по умолчанию в качестве пользователя учетной записи службы App Engine по умолчанию см. в документации Google Cloud IAM.
Для идентификации, используемой для запуска функции очереди задач, необходимо разрешение
cloudfunctions.functions.invoke
.В примере это учетная запись службы App Engine по умолчанию.
gcloud functions add-iam-policy-binding $FUNCTION_NAME \
--region=us-central1 \
--member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
--role=roles/cloudfunctions.invoker