Poner en cola funciones con Cloud Tasks

Las funciones de la cola de tareas aprovechan Google Cloud Tasks para ayudar a su aplicación a ejecutar tareas que consumen mucho tiempo, consumen muchos recursos o tienen un ancho de banda limitado de forma asíncrona, fuera del flujo principal de la aplicación.

Por ejemplo, imagine que desea crear copias de seguridad de un gran conjunto de archivos de imagen que actualmente están alojados en una API con un límite de velocidad. Para ser un consumidor responsable de esa API, debe respetar sus límites de velocidad. Además, este tipo de trabajo de ejecución prolongada podría ser vulnerable a fallas debido a tiempos de espera y límites de memoria.

Para mitigar esta complejidad, puede escribir una función de cola de tareas que establezca opciones de tareas básicas como scheduleTime y dispatchDeadline , y luego transfiera la función a una cola en Cloud Tasks. El entorno de Cloud Tasks está diseñado específicamente para garantizar un control eficaz de la congestión y políticas de reintento para este tipo de operaciones.

El SDK de Firebase para Cloud Functions para Firebase v3.20.1 y versiones posteriores interactúa con Firebase Admin SDK v10.2.0 y versiones posteriores para admitir funciones de cola de tareas.

El uso de funciones de cola de tareas con Firebase puede generar cargos por el procesamiento de Cloud Tasks. Consulte los precios de Cloud Tasks para obtener más información.

Creación de funciones de cola de tareas

Para usar las funciones de la cola de tareas, siga este flujo de trabajo:

  1. Escriba una función de cola de tareas con el SDK de Firebase para Cloud Functions.
  2. Pruebe sus funciones con Firebase Local Emulator Suite.
  3. Implemente su función con Firebase CLI. Al implementar su función de cola de tareas por primera vez, la CLI creará una cola de tareas en Cloud Tasks con opciones (límite de velocidad y reintento) especificadas en su código fuente.
  4. Agregue tareas a la cola de tareas recién creada, transmitiendo parámetros para configurar un cronograma de ejecución si es necesario. Puede lograr esto escribiendo el código con el SDK de administrador e implementándolo en Cloud Functions para Firebase.

Escribir funciones de cola de tareas

Use onDispatch para comenzar a escribir funciones de cola de tareas. Una parte importante de escribir una función de cola de tareas es establecer la configuración de limitación de velocidad y reintento por cola. Los ejemplos de código de esta página se basan en una aplicación que configura un servicio que realiza una copia de seguridad de todas las imágenes de la Imagen astronómica del día de la NASA:

Configuración de la cola de tareas

Las funciones de la cola de tareas vienen con un poderoso conjunto de ajustes de configuración para controlar con precisión los límites de velocidad y el comportamiento de reintento de una cola de tareas:

exports.backupApod = functions
    .runWith( {secrets: ["NASA_API_KEY"]})
    .tasks.taskQueue({
      retryConfig: {
        maxAttempts: 5,
        minBackoffSeconds: 60,
      },
      rateLimits: {
        maxConcurrentDispatches: 6,
      },
    }).onDispatch(async (data) => {
  • retryConfig.maxAttempts=5 : Cada tarea en la cola de tareas se reintenta automáticamente hasta 5 veces. Esto ayuda a mitigar los errores transitorios, como los errores de red o la interrupción temporal del servicio de un servicio externo dependiente.
  • retryConfig.minBackoffSeconds=60 : cada tarea se vuelve a intentar con al menos 60 segundos de diferencia entre cada intento. Esto proporciona un gran búfer entre cada intento para que no nos apresuremos a agotar los 5 reintentos demasiado rápido.
  • rateLimits.maxConcurrentDispatch=6 : se envían como máximo 6 tareas en un momento dado. Esto ayuda a garantizar un flujo constante de solicitudes a la función subyacente y ayuda a reducir la cantidad de instancias activas y arranques en frío.

Probar las funciones de la cola de tareas con Firebase Local Emulator Suite

Las funciones de la cola de tareas en Firebase Local Emulator Suite se exponen como funciones HTTP simples. Puede probar una función de tarea emulada enviando una solicitud HTTP POST con una carga útil de datos 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

Implementación de la función de cola de tareas

Implementa la función de cola de tareas mediante Firebase CLI:

$ firebase deploy --only functions:backupApod

Al implementar una función de cola de tareas por primera vez, la CLI crea una cola de tareas en Cloud Tasks con opciones (límite de velocidad y reintento) especificadas en su código fuente.

Si encuentra errores de permisos al implementar funciones, asegúrese de que los roles de IAM apropiados estén asignados al usuario que ejecuta los comandos de implementación.

Poner en cola la función

Las funciones de la cola de tareas se pueden poner en cola en Cloud Tasks desde un entorno de servidor confiable como Cloud Functions para Firebase mediante el SDK de administrador de Firebase para Node.js. Si es nuevo en los SDK de administrador, consulte Agregar Firebase a un servidor para comenzar.

En un flujo típico, Admin SDK crea una nueva tarea, la pone en cola en {cloudtasks_name}} y establece la configuración para la tarea:

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 : el código de ejemplo intenta distribuir la ejecución de tareas asociando un retraso de N minutos para la tarea N. Esto se traduce en activar ~ 1 tarea/minuto. Tenga en cuenta que también puede usar scheduleTime si desea que Cloud Tasks active una tarea en un momento específico.
  • dispatchDeadlineSeconds : cantidad máxima de tiempo que Cloud Tasks esperará a que se complete una tarea. Cloud Tasks volverá a intentar la tarea siguiendo la configuración de reintentos de la cola o hasta que se alcance esta fecha límite. En el ejemplo, la cola está configurada para volver a intentar la tarea hasta 5 veces, pero la tarea se cancela automáticamente si todo el proceso (incluidos los reintentos) tarda más de 5 minutos.

Solución de problemas

Activar el registro de tareas en la nube

Los registros de Cloud Tasks contienen información de diagnóstico útil, como el estado de la solicitud asociada con una tarea. De forma predeterminada, los registros de Cloud Tasks están desactivados debido al gran volumen de registros que puede generar potencialmente en su proyecto. Le recomendamos que active los registros de depuración mientras desarrolla y depura activamente las funciones de la cola de tareas. Consulte Activación del registro .

Permisos de gestión de identidades y accesos

Es posible que vea errores de PERMISSION DENIED DENEGADO al poner en cola tareas o cuando Cloud Tasks intenta invocar sus funciones de cola de tareas. Asegúrate de que tu proyecto tenga los siguientes enlaces de IAM:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudtasks.enqueuer

Consulte la documentación de Google Cloud IAM para obtener instrucciones sobre cómo agregar la cuenta de servicio predeterminada de App Engine como usuario de la cuenta de servicio predeterminada de App Engine.

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