Функции очереди задач используют возможности Google Cloud Tasks , чтобы помочь вашему приложению выполнять ресурсоемкие, требующие больших затрат времени или ограниченные по пропускной способности задачи асинхронно, вне основного потока работы приложения.
Например, представьте, что вы хотите создать резервные копии большого набора файлов изображений, которые в настоящее время размещены на API с ограничением скорости запросов. Чтобы быть ответственным пользователем этого API, вам необходимо соблюдать его ограничения. Кроме того, подобная длительная задача может быть уязвима для сбоев из-за таймаутов и ограничений памяти.
Чтобы уменьшить эту сложность, можно написать функцию очереди задач, которая устанавливает основные параметры задачи, такие как scheduleTime и dispatchDeadline , а затем передает эту функцию в очередь в Cloud Tasks . Среда Cloud Tasks специально разработана для обеспечения эффективного управления перегрузкой и политик повторных попыток для таких операций.
Firebase SDK для Cloud Functions for Firebase версии 3.20.1 и выше взаимодействует с Firebase Admin SDK версии 10.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-й задачи. Это означает запуск примерно 1 задачи в минуту. Обратите внимание, что вы также можете использоватьscheduleTimeесли хотите, чтобы Cloud Tasks запускал задачу в определенное время. -
dispatchDeadlineSeconds: Максимальное время, в течение которого Cloud Tasks будет ожидать завершения задачи. Cloud Tasks будет повторять выполнение задачи в соответствии с настройками очереди повторных попыток или до истечения этого крайнего срока. В примере очередь настроена на повторную попытку выполнения задачи до 5 раз, но задача автоматически отменяется, если весь процесс (включая попытки повторного выполнения) занимает более 5 минут.
Поиск неисправностей
Включите ведение журнала Cloud Tasks .
Журналы Cloud Tasks содержат полезную диагностическую информацию, например, статус запроса, связанного с задачей. По умолчанию ведение журналов Cloud Tasks отключено из-за большого объема данных, которые оно может генерировать в вашем проекте. Мы рекомендуем включить отладочные журналы во время активной разработки и отладки функций очереди задач. См. раздел «Включение ведения журналов» .
Разрешения IAM
При добавлении задач в очередь или при попытке Cloud Tasks вызвать функции вашей очереди задач могут появляться ошибки PERMISSION DENIED . Убедитесь, что ваш проект имеет следующие привязки 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