Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

Функции очереди задач используют преимущества Google Cloud Tasks , чтобы помочь вашему приложению выполнять трудоемкие, ресурсоемкие задачи или задачи с ограниченной пропускной способностью асинхронно, вне основного потока приложения.

Например, представьте, что вы хотите создать резервные копии большого набора файлов изображений, которые в настоящее время размещены на API с ограничением скорости. Чтобы быть ответственным потребителем этого API, вам необходимо соблюдать их ограничения скорости. Кроме того, такие длительные задания могут быть подвержены сбоям из-за тайм-аутов и ограничений памяти.

Чтобы уменьшить эту сложность, вы можете написать функцию очереди задач, которая устанавливает основные параметры задачи, такие как scheduleTime и dispatchDeadline , а затем передает функцию в очередь в Cloud Tasks. Среда Cloud Tasks разработана специально для обеспечения эффективного контроля перегрузки и политик повторных попыток для таких операций.

Firebase SDK для облачных функций для Firebase версии 3.20.1 и выше взаимодействует с Firebase Admin SDK версии 10.2.0 и выше для поддержки функций очереди задач.

Использование функций очереди задач с Firebase может привести к взиманию платы за обработку облачных задач. Для получения дополнительной информации см. цены на Cloud Tasks .

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

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

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

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

Используйте onDispatch , чтобы начать писать функции очереди задач. Важной частью написания функции очереди задач является установка конфигурации повторных попыток и ограничения скорости для каждой очереди. Примеры кода на этой странице основаны на приложении, которое настраивает службу, которая выполняет резервное копирование всех изображений из программы NASA 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 задач. Это помогает обеспечить постоянный поток запросов к базовой функции и помогает сократить количество активных экземпляров и холодных запусков.

Тестирование функций очереди задач с помощью Firebase Local Emulator Suite

Функции очереди задач в Firebase Local Emulator Suite представлены как простые функции HTTP. Вы можете протестировать эмулируемую функцию задачи, отправив 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:

$ firebase deploy --only functions:backupApod

При первом развертывании функции очереди задач интерфейс командной строки создает очередь задач в Cloud Tasks с параметрами (ограничение скорости и повтор), указанными в исходном коде.

Если вы столкнулись с ошибками разрешений при развертывании функций, убедитесь, что соответствующие роли IAM назначены пользователю, выполняющему команды развертывания.

Поставить функцию в очередь

Функции очереди задач можно ставить в очередь в Cloud Tasks из доверенной серверной среды, такой как Cloud Functions для Firebase, с помощью Firebase Admin SDK для Node.js. Если вы не знакомы с Admin SDK, см. раздел Добавление Firebase на сервер , чтобы начать работу.

В типичном процессе Admin SDK создает новую задачу, ставит ее в очередь в {cloudtasks_name}} и задает конфигурацию для задачи:

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 day. 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 , если хотите, чтобы облачные задачи запускали задачу в определенное время.
  • dispatchDeadlineSeconds : максимальное количество времени, в течение которого облачные задачи будут ожидать завершения задачи. Облачные задачи будут повторять задачу после повторной настройки очереди или до тех пор, пока не будет достигнут этот крайний срок. В образце очередь настроена на повторение задачи до 5 раз, но задача автоматически отменяется, если весь процесс (включая повторные попытки) занимает более 5 минут.

Исправление проблем

Включите ведение журнала облачных задач

Журналы Cloud Tasks содержат полезную диагностическую информацию, например статус запроса, связанного с задачей. По умолчанию журналы из Cloud Tasks отключены из-за большого объема журналов, которые он потенциально может генерировать в вашем проекте. Мы рекомендуем включать журналы отладки во время активной разработки и отладки функций очереди задач. См. Включение ведения журнала .

IAM-разрешения

Вы можете увидеть ошибки PERMISSION DENIED DENIED при постановке задач в очередь или когда Cloud Tasks пытается вызвать ваши функции очереди задач. Убедитесь, что ваш проект имеет следующие привязки IAM:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudtasks.enqueuer
  • Удостоверение, используемое для постановки задач в облачные задачи, требует разрешения на использование учетной записи службы, связанной с задачей в облачных задачах.

    В примере это учетная запись службы App Engine по умолчанию .

См. документацию Google Cloud IAM для получения инструкций о том, как добавить учетную запись службы App Engine по умолчанию в качестве пользователя учетной записи службы App Engine по умолчанию.

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