Функции постановки в очередь с помощью Cloud Tasks


Функции очереди задач используют преимущества 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 .

Создание функций очереди задач

Чтобы использовать функции очереди задач, следуйте следующему рабочему процессу:

  1. Напишите функцию очереди задач, используя Firebase SDK для Cloud Functions .
  2. Проверьте свою функцию, запустив ее с помощью HTTP-запроса.
  3. Разверните свою функцию с помощью Firebase CLI. При первом развертывании функции очереди задач интерфейс командной строки создаст очередь задач в Cloud Tasks с параметрами (ограничение скорости и повтор), указанными в исходном коде.
  4. Добавьте задачи во вновь созданную очередь задач, передав параметры для настройки расписания выполнения, если это необходимо. Этого можно добиться, написав код с помощью Admin SDK и развернув его в Cloud Functions for Firebase .

Написание функций очереди задач

Используйте onDispatch , чтобы начать писать функции очереди задач. Важной частью написания функции очереди задач является установка повторных попыток для каждой очереди и настройка ограничения скорости. Примеры кода на этой странице основаны на приложении, которое настраивает службу резервного копирования всех изображений из «Астрономического изображения дня НАСА»:

Настройка функций очереди задач

Функции очереди задач имеют мощный набор настроек конфигурации, позволяющий точно контролировать ограничения скорости и повторять поведение очереди задач:

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

При первом развертывании функции очереди задач интерфейс командной строки создает очередь задач в 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:

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.

gcloud functions add-iam-policy-binding $FUNCTION_NAME \
  --region=us-central1 \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudfunctions.invoker