Функции очереди задач используют преимущества 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 «Астрономическая фотография дня» :
Настройка функций очереди задач
Функции очереди задач поставляются с мощным набором параметров конфигурации для точного управления ограничениями скорости и поведением повторных попыток очереди задач:
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-й задачи. Это соответствует запуску примерно одной задачи в минуту. Обратите внимание, что вы также можете использовать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