Lease delle attività pull

Una volta che le attività si trovano in una coda in modalità pull, un worker può prestarle in leasing. Una volta elaborate le attività, il worker deve eliminarle.

Prima di iniziare

Contesto importante

  • Questo metodo è applicabile solo ai worker in esecuzione all'interno di un servizio nell'ambiente standard.
  • Quando utilizzi le code in modalità pull, sei responsabile della scalabilità dei worker in base al volume di elaborazione.

Attività di leasing

Quando le attività sono in coda, un worker può acquisire una o più attività in leasing utilizzando il metodo taskqueue.Lease. Potrebbe verificarsi un leggero ritardo prima che le attività aggiunte di recente utilizzando taskqueue.Add diventino disponibili tramite taskqueue.Lease.

Quando richiedi un lease, specifichi il numero di attività da prendere in lease (fino a un massimo di 1000 attività) e la durata del lease in secondi (fino a un massimo di una settimana). La durata del lease deve essere abbastanza lunga da garantire che l'attività più lenta abbia il tempo di essere completata prima della scadenza del periodo di lease. Puoi modificare il lease di un'attività utilizzando taskqueue.ModifyLease.

Il leasing di un'attività la rende non disponibile per l'elaborazione da parte di un altro worker e rimane non disponibile fino alla scadenza del lease.

Il seguente esempio di codice prende in prestito 100 attività dalla coda pull-queue per un'ora:

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

Batch con tag attività

Non tutte le attività sono uguali; il codice può "taggare" le attività e quindi scegliere le attività da acquisire in base ai tag. Il tag agisce come filtro. Il seguente esempio di codice mostra come taggare le attività e quindi eseguire il lease in base ai tag:

_, 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, "")

Regolazione dei tassi di polling

I worker che eseguono il polling della coda per le attività di cui eseguire il lease devono rilevare se stanno tentando di eseguire il lease delle attività più velocemente rispetto a quanto consentito dalla coda. Se si verifica questo errore, taskqueue.Lease restituirà un errore di backoff.

Il tuo codice deve gestire questi errori, annullare la chiamata a taskqueue.Lease e riprovare più tardi. Per evitare questo problema, ti consigliamo di impostare una scadenza RPC più elevata quando chiami taskqueue.Lease. Dovresti anche tornare indietro quando una richiesta di lease restituisce un elenco vuoto di attività. Se generi più di 10 richieste LeaseTasks per coda al secondo, solo le prime 10 richieste restituiranno risultati. Se le richieste superano questo limite, viene restituito OK con zero risultati.

Monitoraggio delle attività nella console Google Cloud

Per visualizzare le informazioni su tutte le attività e le code nella tua applicazione:

  1. Apri la pagina Cloud Tasks nella console Google Cloud e cerca il valore Pull nella colonna Tipo.

    Vai a Cloud Tasks

  2. Fai clic sul nome della coda che ti interessa per aprire la pagina dei dettagli della coda. Vengono visualizzate tutte le attività nella coda selezionata.

Eliminazione delle attività in corso...

Una volta che un worker ha completato un'attività, deve eliminarla dalla coda. Se noti delle attività che rimangono in coda dopo che un worker ha terminato di elaborarle, è probabile che il worker non sia riuscito; in questo caso, le attività verranno elaborate da un altro worker.

Puoi eliminare un elenco di attività, ad esempio quella restituita da taskqueue.Lease, passandolo 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")