Creare attività push

Questa pagina descrive come creare le attività e inserirle nelle code in modalità in 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, trasmettere dati specifici dell'attività al gestore. Puoi anche perfezionare la configurazione dell'attività, ad esempio pianificando un orario futuro in cui deve essere eseguita o limitando il numero di tentativi di esecuzione dell'attività in caso di errore.

Creazione di una nuova attività

Per creare e mettere in coda un'attività, chiama la taskqueue.Add funzione.

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

Specifica del servizio worker

Quando un'attività viene estratta dalla coda, il servizio Coda di attività la invia a un servizio worker. Ogni attività ha un target e un url, che determinano il servizio e il gestore che eseguiranno l'attività.

target

Il target specifica il servizio che riceverà la richiesta HTTP per eseguire l'attività. È una stringa che specifica un servizio/versione/istanza in una delle forme canoniche. Le forme più utilizzate sono:

    service
    version.service
    instance.version.service

La stringa di destinazione viene anteposta al nome di dominio dell'app. Esistono tre modi per impostare il target di un'attività:

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

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

  • Includi una direttiva 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 quel target, anche se all'attività è stato assegnato un target diverso al momento della creazione.

  • Se non viene specificato alcun target con uno dei due metodi precedenti, il target dell'attività è la versione del servizio che la mette in coda. Tieni presente che se metti in coda un'attività dal servizio e dalla versione predefiniti in questo modo e la versione predefinita cambia prima dell'esecuzione dell'attività, quest'ultima verrà eseguita nella nuova versione predefinita.

url

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

L'url deve corrispondere a uno dei pattern URL del gestore nel servizio di destinazione. L'url può includere parametri di ricerca se il metodo specificato nell'attività è GET o PULL. Se non viene specificato alcun url, viene utilizzato l'URL predefinito /_ah/queue/[QUEUE_NAME], dove [QUEUE_NAME] è il nome di coda dell'attività.

Trasmissione di dati al gestore

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

La NewPOSTTask funzione ha un argomento posizionale per query_data. I dati sono in genere 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.

Denominazione di un'attività

Quando crei una nuova attività, App Engine le assegna un nome univoco per impostazione predefinita. Tuttavia, puoi assegnare un nome personalizzato a un'attività utilizzando il parametro name. Un vantaggio dell'assegnazione di nomi di attività personalizzati è che le attività denominate vengono deduplicate, 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 completamento o l'eliminazione dell'attività.

Tieni presente che la logica di deduplicazione introduce un overhead significativo delle prestazioni, con conseguente aumento della latenza e potenzialmente dei tassi di errore associati alle attività denominate. Questi costi possono aumentare in modo significativo se i nomi delle attività sono sequenziali, ad esempio con timestamp. Pertanto, se assegni nomi personalizzati, ti consigliamo di utilizzare un prefisso ben distribuito per i nomi delle attività, ad esempio un hash dei contenuti.

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

Aggiunta di attività in modo asincrono

Per impostazione predefinita, le chiamate che aggiungono attività alle code sono sincrone. Nella maggior parte degli scenari, le chiamate sincrone funzionano correttamente. L'aggiunta di un'attività a una coda è in genere un'operazione rapida. Esiste una piccola percentuale di operazioni di aggiunta di attività che possono richiedere molto più tempo, ma il tempo medio per aggiungere un'attività è inferiore a 5 ms.

Le operazioni di aggiunta di attività a code diverse non possono essere raggruppate, pertanto l'API Coda di attività fornisce anche chiamate asincrone che consentono di aggiungere queste attività in parallelo, riducendo ulteriormente la latenza. Questa opzione è utile se stai creando un'applicazione estremamente sensibile alla latenza che deve eseguire più operazioni di aggiunta di attività a code diverse contemporaneamente.

Se vuoi effettuare chiamate asincrone a una coda di attività, utilizza i metodi asincroni forniti dalla

Messa in coda delle attività nelle transazioni Cloud Datastore

Puoi mettere in coda un'attività come parte di una transazione Datastore, in modo che l'attività venga messa in coda (e garantita) solo se la transazione viene eseguita correttamente. Le attività aggiunte in una transazione sono considerate parte di essa e hanno lo stesso livello di transazione .

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

Il seguente esempio di codice mostra come inserire attività transazionali in una coda in modalità push come parte di una transazione Datastore:

import (
    "net/url"

    "golang.org/x/net/context"

    "google.golang.org/appengine/v2"
    "google.golang.org/appengine/v2/datastore"
    "google.golang.org/appengine/v2/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 ritardato anziché un servizio worker

La configurazione di un gestore per ogni attività distinta (come descritto nelle sezioni precedenti) può essere complessa, così come la serializzazione e la deserializzazione di argomenti complessi per l'attività, soprattutto se hai molte attività diverse ma piccole che vuoi eseguire nella coda. L'SDK Go include un pacchetto (appengine/delay) che espone una semplice API che ti consente di bypassare tutto il lavoro di configurazione di gestori di attività dedicati e di serializzazione e deserializzazione dei 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 relativi argomenti, quindi li aggiunge alla coda di attività. Quando l'attività viene eseguita, il pacchetto delay esegue la funzione.

Per ulteriori informazioni sull'utilizzo del pacchetto delay, consulta delay.

Utilizzo delle attività in un'applicazione multi-tenant

Per impostazione predefinita, le code in modalità in push utilizzano lo spazio dei nomi corrente impostato nel gestore dello spazio dei nomi al momento della creazione dell'attività. Se la tua applicazione utilizza l'architettura multi-tenant, consulta l'API Namespaces.

Passaggi successivi