Функции очереди задач используют преимущества 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 .
Создание функций очереди задач
Чтобы использовать функции очереди задач, следуйте этому рабочему процессу:
- Напишите функцию очереди задач, используя Firebase SDK для облачных функций.
- Проверьте свои функции с помощью Firebase Local Emulator Suite.
- Разверните свою функцию с помощью интерфейса командной строки Firebase. При первом развертывании функции очереди задач интерфейс командной строки создаст очередь задач в Cloud Tasks с параметрами (ограничение скорости и повтор), указанными в исходном коде.
- Добавьте задачи во вновь созданную очередь задач, передав параметры для настройки расписания выполнения, если это необходимо. Этого можно добиться, написав код с помощью Admin SDK и развернув его в Cloud Functions для Firebase.
Написание функций очереди задач
Используйте onTaskDispatched
, чтобы начать писать функции очереди задач. Важной частью написания функции очереди задач является установка конфигурации повторных попыток и ограничения скорости для каждой очереди. Примеры кода на этой странице основаны на приложении, которое настраивает службу, которая выполняет резервное копирование всех изображений из программы NASA Astronomy Picture of the Day :
Конфигурация очереди задач
Функции очереди задач поставляются с мощным набором параметров конфигурации для точного управления ограничениями скорости и поведением повторных попыток очереди задач:
exports.backupapod = onTaskDispatched(
{
retryConfig: {
maxAttempts: 5,
minBackoffSeconds: 60,
},
rateLimits: {
maxConcurrentDispatches: 6,
},
}, async (req) => {
-
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 Local Emulator Suite
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 создает новую задачу, ставит ее в очередь в Cloud Tasks и устанавливает конфигурацию для задачи:
exports.enqueuebackuptasks = onRequest(
async (_request, response) => {
const queue = getFunctions().taskQueue("backupapod");
const targetUri = await getFunctionUrl("backupapod");
const enqueues = [];
for (let i = 0; i <= BACKUP_COUNT; i += 1) {
const iteration = Math.floor(i / HOURLY_BATCH_SIZE);
// Delay each batch by N * hour
const scheduleDelaySeconds = iteration * (60 * 60);
const backupDate = new Date(BACKUP_START_DATE);
backupDate.setDate(BACKUP_START_DATE.getDate() + i);
// Extract just the date portion (YYYY-MM-DD) as string.
const date = backupDate.toISOString().substring(0, 10);
enqueues.push(
queue.enqueue({date}, {
scheduleDelaySeconds,
dispatchDeadlineSeconds: 60 * 5, // 5 minutes
uri: targetUri,
}),
);
}
await Promise.all(enqueues);
response.sendStatus(200);
});
-
scheduleDelaySeconds
: пример кода пытается распределить выполнение задач, связывая задержку в N минут для N-й задачи. Это означает запуск ~ 1 задачи в минуту. Обратите внимание, что вы также можете использоватьscheduleTime
, если хотите, чтобы облачные задачи запускали задачу в определенное время. -
dispatchDeadlineSeconds
: максимальное количество времени, в течение которого облачные задачи будут ожидать завершения задачи. Облачные задачи будут повторять задачу после повторной настройки очереди или до тех пор, пока не будет достигнут этот крайний срок. В образце очередь настроена на повторение задачи до 5 раз, но задача автоматически отменяется, если весь процесс (включая повторные попытки) занимает более 5 минут.
Получить и включить целевой URI
Поскольку облачные функции для Firebase (2-го поколения) не поддерживают детерминированные URL-адреса HTTP, вы должны вручную получать и включать целевой URI в каждую поставленную в очередь задачу. Вы также можете программно получить URL-адрес своей функции, как показано ниже:
/**
* Get the URL of a given v2 cloud function.
*
* @param {string} name the function's name
* @param {string} location the function's location
* @return {Promise<string>} The URL of the function
*/
async function getFunctionUrl(name, location="us-central1") {
if (!auth) {
auth = new GoogleAuth({
scopes: "https://www.googleapis.com/auth/cloud-platform",
});
}
const projectId = await auth.getProjectId();
const url = "https://cloudfunctions.googleapis.com/v2beta/" +
`projects/${projectId}/locations/${location}/functions/${name}`;
const client = await auth.getClient();
const res = await client.request({url});
const uri = res.data?.serviceConfig?.uri;
if (!uri) {
throw new Error(`Unable to retreive uri for function at ${url}`);
}
return uri;
}
Исправление проблем
Включите ведение журнала облачных задач
Журналы Cloud Tasks содержат полезную диагностическую информацию, например статус запроса, связанного с задачей. По умолчанию журналы из Cloud Tasks отключены из-за большого объема журналов, которые он потенциально может генерировать в вашем проекте. Мы рекомендуем включать журналы отладки во время активной разработки и отладки функций очереди задач. См. Включение ведения журнала .
IAM-разрешения
Вы можете увидеть ошибки PERMISSION DENIED
DENIED при постановке задач в очередь или когда Cloud Tasks пытается вызвать ваши функции очереди задач. Убедитесь, что ваш проект имеет следующие привязки IAM:
Удостоверение, используемое для постановки задач в очередь в Cloud Tasks, требует разрешения
cloudtasks.tasks.create
IAM.В примере это учетная запись службы App Engine по умолчанию .
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 по умолчанию.
Удостоверение, используемое для запуска функции очереди задач, требует разрешения
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