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


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


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


Функции очереди задач используют преимущества 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. Разверните свою функцию с помощью CLI 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 является лучшим способом проверки функций очереди задач. См. Документацию эмулятора, чтобы узнать, как придать приложение для функций очереди задач эмуляция .

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

Развернуть функции очереди задач

Развернуть функцию очереди задач с помощью CLI Firebase:

$ firebase deploy --only functions:backupApod

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

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

Функции очереди задач Enqueue

Функции очереди задач могут быть включены в Cloud Tasks из среды доверенного сервера, таких как Cloud Functions for Firebase используя Firebase Admin SDK для node.js. Если вы новичок в Admin SDK S, см. Add 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 -й минуты для NTH задачи. Это переводится на запуск ~ 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 .

    В примере это учетная запись Service Service App Engine Default .

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

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