Creazione di attività push

In questa pagina viene descritto come creare attività e inserirle in code in modalità push. Quando vuoi elaborare un'attività, devi creare un nuovo oggetto attività e inserirlo in una coda. Puoi specificare esplicitamente il servizio e il gestore che elaborano l'attività, e, facoltativamente, passare dati specifici dell'attività al gestore. Puoi anche ottimizza la configurazione dell'attività, ad esempio programmando un'ora nel futuro quando deve essere eseguita o limita il numero di volte in cui vuoi che l'attività in caso di errore.

Creazione di una nuova attività in corso...

Per creare e accodare un'attività, chiama la funzione taskqueue.Add.

import("google.golang.org/appengine/taskqueue")

Specifica del servizio worker

Quando un'attività viene rimossa dalla coda, il servizio Task Queue la inoltra a un servizio worker. Ogni attività ha un target e un url, che determinano e quale servizio e gestore eseguirà l'attività.

target

La destinazione specifica il servizio che riceverà la richiesta HTTP per eseguire l'attività. È una stringa che specifica un servizio/una versione/un'istanza uno qualsiasi dei moduli canonici. I moduli più utilizzati sono:

    service
    version.service
    instance.version.service

La stringa di destinazione è anteposta al nome di dominio dell'app. Esistono tre tipi di modi per impostare la destinazione per un'attività:

  • Dichiara il target quando crei l'attività. Puoi impostare il target in modo esplicito durante la creazione dell'oggetto Task impostando intestazione Host:

    h := http.Header{}
    h.Add("Host", "versionHostname")
    task := taskqueue.Task{
    	Header: h,
    }

  • Includi un'istruzione target quando definisci una coda in queue.yaml, come nella definizione di queue-blue. Tutte le attività aggiunte a una coda con un target utilizzeranno questo target, anche se all'attività è stato assegnato un target diverso al momento della creazione.

  • Se non viene specificata nessuna destinazione in base a uno dei due metodi precedenti, il target dell'attività è la versione del servizio che la accoda. Tieni presente che se accoda un'attività dal servizio e dalla versione predefiniti in in questo modo e la versione predefinita cambia prima dell'esecuzione dell'attività, verranno eseguite nella nuova versione predefinita.

url

url seleziona uno dei gestori nel servizio di destinazione, che eseguire l'attività.

url deve corrispondere a uno dei pattern URL del gestore nel target completamente gestito di Google Cloud. url può includere parametri di ricerca se il metodo specificato nell'attività è GET o PULL. Se non viene specificato url, viene utilizzato l'URL predefinito /_ah/queue/[QUEUE_NAME], dove [QUEUE_NAME] è il nome della fila della task.

Trasferimento dei dati all'handler

Puoi passare i dati al gestore come parametri di ricerca nell'URL dell'attività, ma solo se il metodo specificato nell'attività è GET o PULL.

La NewPOSTTask ha un argomento posizionale per query_data. I dati di solito sono un dizionario di coppie chiave-valore. Se il metodo dell'attività è POST o PUT, i dati vengono aggiunti al payload della richiesta HTTP. Se il metodo è GET, viene aggiunto all'URL come parametri di ricerca.

Assegnare un nome a un'attività

Quando crei una nuova attività, App Engine assegna all'attività un nome univoco predefinito. Tuttavia, puoi assegnare il tuo nome a un'attività utilizzando il parametro name. Un vantaggio dell'assegnazione di nomi alle attività è che le attività con nome vengono eliminate, il che significa che puoi utilizzare i nomi delle attività per garantire che un'attività venga aggiunta una sola volta. La deduplicazione continua per 9 giorni dopo il viene completata o eliminata.

Tieni presente che la logica di deduplica introduce un overhead significativo delle prestazioni, con un conseguente aumento delle latenze e potenzialmente dei tassi di errore associati alle attività con nome. Questi costi possono essere aumentati significativamente se sono sequenziali, ad esempio con i timestamp. Pertanto, se assegni i tuoi nomi, consigliamo di utilizzare un prefisso ben distribuito per i nomi delle attività, ad esempio un hash dei contenuti.

Se assegni i tuoi nomi alle attività, tieni presente che la lunghezza massima del nome è 500 e il nome può contenere lettere maiuscole e minuscole, numeri trattini bassi e trattini.

Inserimento in coda delle attività nelle transazioni Cloud Datastore

Puoi accodare un'attività come parte di una transazione Datastore, ad esempio che l'attività è in coda (e la garanzia sarà accodata) solo se la transazione eseguito correttamente il commit. Le attività aggiunte in una transazione sono considerate parte di essa e hanno lo stesso livello di isolamento e coerenza.

Un'applicazione non può inserire più di cinque attività di transazione nelle code di lavoro durante una singola transazione. Le attività di transazione non devono avere nomi specificati dall'utente.

Il seguente esempio di codice mostra come inserire attività transazionali in una coda push nell'ambito di una transazione Datastore:

import (
	"net/url"

	"golang.org/x/net/context"

	"google.golang.org/appengine/datastore"
	"google.golang.org/appengine/taskqueue"
)

func f(ctx context.Context) {
	err := datastore.RunInTransaction(ctx, func(ctx context.Context) error {
		t := taskqueue.NewPOSTTask("/worker", url.Values{
			// ...
		})
		// Use the transaction's context when invoking taskqueue.Add.
		_, err := taskqueue.Add(ctx, t, "")
		if err != nil {
			// Handle error
		}
		// ...
		return nil
	}, nil)
	if err != nil {
		// Handle error
	}
	// ...
}

Utilizzo del pacchetto con ritardo anziché di un servizio di lavoro

La configurazione di un gestore per ogni attività distinta (come descritto nelle sezioni precedenti) può essere complicata, così come la serializzazione e la deserializzazione di argomenti complessi per l'attività, in particolare se hai molte attività diverse, ma piccole, da eseguire nella coda. L'SDK Go include un pacchetto (appengine/delay) con l'esposizione di un'API semplice che ti consente di ignorare tutto il lavoro di impostare gestori di attività dedicati, nonché di serializzare e deserializzare i parametri.

Per utilizzare il pacchetto delay:

var expensiveFunc = delay.Func("some-arbitrary-key", func(ctx context.Context, a string, b int) {
	// do something expensive!
})

// Somewhere else
expensiveFunc.Call(ctx, "Hello, world!", 42)

Il pacchetto delay serializza la chiamata di funzione e i suoi argomenti, quindi aggiunge alla coda di attività. Quando l'attività viene eseguita, il pacchetto delay esegue la funzione.

Per saperne di più sull'utilizzo del pacchetto delay, consulta la documentazione.

Utilizzo delle attività in un'applicazione multi-tenant

Per impostazione predefinita, le code in modalità push utilizzano lo spazio dei nomi attuale impostato nello spazio dei nomi nel momento in cui viene creata l'attività. Se la tua applicazione utilizza la multitenancy, consulta l'API Namespaces Go 1.11.

Passaggi successivi