Arrienda tareas de extracción

Una vez que las tareas están en una lista de extracción, un trabajador puede arrendarlas. 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.

Arrendamiento de tareas

Una vez que las tareas se encuentran en la cola, un trabajador puede solicitar la asignación de una o más tareas con el método taskqueue.Lease. Puede haber una breve demora antes de que las tareas agregadas recientemente con taskqueue.Add estén disponibles a través de taskqueue.Lease.

Cuando solicitas un arrendamiento, especificas la cantidad de tareas a arrendar (hasta un máximo de 1,000) y la duración del arrendamiento en segundos (hasta un máximo de una semana). El arrendamiento debe durar lo suficiente para garantizar que la tarea más lenta tenga tiempo de completarse antes de que se venza el período de arrendamiento. Puedes modificar la solicitud de asignación de tareas con taskqueue.ModifyLease.

Cuando se asigna una tarea, esta no está disponible para que la procese otro trabajador, y no lo estará hasta que venza la tarea.

El siguiente ejemplo de código arrienda 100 tareas de la lista pull-queue durante una hora:

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 qué tareas solicitar 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 consultan la lista en busca de tareas para arrendar deben detectar si intentan arrendar las tareas más rápido de lo que la cola puede proporcionarlas. Si esto ocurre, se mostrará un error de tiempo de espera en taskqueue.Lease.

Tu código debe detectar estos errores, retirar la llamada 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 retirarte cuando 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.

Cómo supervisar tareas en GCP Console

Para ver información sobre todas las tareas y las listas en tu aplicación, realiza los siguientes pasos:

  1. Abre la página Listas de tareas en cola en GCP Console y selecciona la pestaña Listas de extracción en la barra de menú, que se encuentra 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")
¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Entorno estándar de App Engine para Go