Asignar tiempo para tareas de extracción

Una vez que las tareas están en una lista de extracción, se puede asignar tiempo a un trabajador para que las procese. Después de procesar las tareas, el trabajador debe borrarlas.

Antes de comenzar

Contexto importante

  • Este método solo se aplica a trabajadores que se ejecutan dentro de un servicio del entorno estándar.
  • Cuando utilizas las listas de extracción, tienes la responsabilidad de escalar los trabajadores según el volumen de procesamiento.

Asignación de tiempo para tareas

Cuando las tareas se encuentran en la lista, se puede asignar tiempo a un trabajador para una o más de ellas con el método taskqueue.Lease. Puede llevar algo de tiempo que las tareas recién agregadas con taskqueue.Add estén disponibles mediante taskqueue.Lease.

Cuando solicitas una asignación, debes especificar la cantidad de tareas (hasta un máximo de 1,000) y la duración en segundos (hasta un máximo de una semana). La asignación debe durar lo suficiente para garantizar que la tarea más lenta tenga tiempo de completarse antes de que venza el período de la asignación. Puedes modificar la asignación de tiempo de una tarea mediante taskqueue.ModifyLease.

Cuando se asigna tiempo para una tarea, esta deja de estar disponible para que la procese otro trabajador hasta que venza la asignación.

En el ejemplo de código que sigue, se realiza una asignación de tiempo de una hora para 100 tareas de la lista pull-queue.

tasks, err := taskqueue.Lease(ctx, 100, "pull-queue", 3600)

Agrupación en lotes con etiquetas de tareas

No todas las tareas son iguales. Tu código puede “etiquetar” tareas y después elegir para qué tareas asignar tiempo según la etiqueta. La etiqueta actúa como un filtro. El siguiente ejemplo de código demuestra cómo etiquetar tareas y luego arrendar según las etiquetas:

_, err = taskqueue.Add(ctx, &taskqueue.Task{
	Payload: []byte("parse"), Method: "PULL", Tag: "parse",
}, "pull-queue")
_, err = taskqueue.Add(ctx, &taskqueue.Task{
	Payload: []byte("render"), Method: "PULL", Tag: "render",
}, "pull-queue")

// leases render tasks, but not parse
tasks, err = taskqueue.LeaseByTag(ctx, 100, "pull-queue", 3600, "render")

// Leases up to 100 tasks that have same tag.
// Tag is that of "oldest" task by ETA.
tasks, err = taskqueue.LeaseByTag(ctx, 100, "pull-queue", 3600, "")

Regulación de los índices de consulta

Los trabajadores que sondeen la lista en busca de tareas para las que puedan asignarse tiempo deberían detectar si están intentando asignarse tiempo para tareas más rápido de lo que la lista puede proporcionarlas. Si se produce este error, se mostrará un error de tiempo de espera en taskqueue.Lease.

El código debe manejar estos errores, dejar de llamar a taskqueue.Lease y volver a intentarlo más tarde. Para evitar este problema, considera establecer un plazo mayor de RPC cuando llames a taskqueue.Lease. También debes dejar de llamar si una solicitud de asignación muestra una lista vacía de tareas. Si generas más de 10 solicitudes LeaseTasks por lista por segundo, solo las primeras 10 solicitudes mostrarán resultados. Si las solicitudes superan este límite, se muestra OK sin resultados.

Supervisa tareas en Cloud Console

Para ver información sobre todas las tareas y las listas en tu aplicación, haz lo siguiente:

  1. Abre la página Lista de tareas en cola en Cloud Console y selecciona la pestaña Listas de extracción en la barra de menú en la parte superior de la página.

    Ir a la pestaña Listas de extracción

  2. Haz clic en el nombre de la lista que te interesa y abre la página de detalles de la lista. Se muestran todas las tareas en la lista seleccionada.

Cómo borrar tareas

Una vez que un trabajador completa una tarea, debe borrarla de la lista. Si ves que las tareas permanecen en una cola después de que el trabajador termina de procesarlas, es probable que haya fallado; en ese caso, otro trabajador procesará las tareas.

Para borrar una lista de tareas, como la que muestra taskqueue.Lease, pásala a taskqueue.DeleteMulti:

tasks, err = taskqueue.Lease(ctx, 100, "pull-queue", 3600)
// Perform some work with the tasks here

taskqueue.DeleteMulti(ctx, tasks, "pull-queue")