Poner en cola funciones con Cloud Tasks


Las funciones de cola de tareas aprovechan Google Cloud Tasks para ayudar a que su aplicación ejecute tareas que requieren mucho tiempo, recursos o ancho de banda limitado de forma asincrónica, fuera del flujo principal de su aplicación.

Por ejemplo, imagine que desea crear copias de seguridad de un gran conjunto de archivos de imágenes que actualmente están alojados en una API con un límite de velocidad. Para ser un consumidor responsable de esa API, debes respetar sus límites de tarifas. Además, este tipo de trabajo de larga duración 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 básicas de tareas como scheduleTime y dispatchDeadline , y luego entregue la función a una cola en Cloud Tasks. El entorno de Cloud Tasks está diseñado específicamente para garantizar un control de congestión eficaz 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 interopera con el SDK de Firebase Admin 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.

Crear funciones de cola de tareas

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

  1. Escriba una función de cola de tareas utilizando el SDK de Firebase para Cloud Functions.
  2. Pruebe su función activándola con una solicitud HTTP.
  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 (limitación de velocidad y reintento) especificadas en su código fuente.
  4. Agregue tareas a la cola de tareas recién creada, pasando parámetros para configurar un cronograma de ejecución si es necesario. Puede lograr esto escribiendo el código usando el SDK de administración e implementándolo en Cloud Functions para Firebase.

Escribir funciones de cola de tareas

Utilice 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:

Configurar funciones de cola de tareas

Las funciones de la cola de tareas vienen con un potente 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 errores transitorios, como errores de red o interrupciones temporales del servicio de un servicio externo dependiente.
  • retryConfig.minBackoffSeconds=60 : cada tarea se reintenta con al menos 60 segundos de diferencia entre cada intento. Esto proporciona un gran margen 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 funciones de cola de tareas

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

Implementar funciones de cola de tareas

Implemente 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 (limitación de velocidad y reintento) especificadas en su código fuente.

Si encuentra errores de permisos al implementar funciones, asegúrese de que se asignen las funciones de IAM adecuadas al usuario que ejecuta los comandos de implementación.

Poner en cola funciones de cola de tareas

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 usando el SDK de Firebase Admin para Node.js. Si eres nuevo en los SDK de administración, consulta Agregar Firebase a un servidor para comenzar.

En un flujo típico, el SDK de administración crea una nueva tarea, la pone en cola en Cloud Tasks y establece la configuración de 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 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 : el código de muestra intenta distribuir la ejecución de tareas asociando un retraso de enésimo minuto para la enésima tarea. Esto se traduce en activar ~ 1 tarea/minuto. Tenga en cuenta que también puede utilizar scheduleTime si desea que Cloud Tasks active una tarea en un momento específico.
  • dispatchDeadlineSeconds : cantidad máxima de tiempo que Cloud Tasks esperará hasta que se complete una tarea. Cloud Tasks reintentará la tarea después de la configuración de reintento de la cola o hasta que se alcance esta fecha límite. En el ejemplo, la cola está configurada para reintentar 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 potencialmente puede generar 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 Activar el registro .

Permisos de IAM

Es posible que vea errores PERMISSION DENIED al poner en cola tareas o cuando Cloud Tasks intenta invocar sus funciones de cola de tareas. Asegúrese de que su 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