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 ottimizzare la configurazione dell'attività, ad esempio programmare un orario nel futuro quando deve essere eseguita o limita il numero di volte che 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().
Il codice seguente crea un'attività che ha come target il servizio denominato worker
e
richiama il proprio gestore impostando l'URL /update-counter
:
In alternativa, puoi creare un oggetto Task e chiamarlo add().
Specificare il 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 e quale servizio e gestore eseguirà l'attività.
target
La destinazione specifica il servizio che riceverà la richiesta HTTP eseguire l'attività. Si tratta di una stringa che specifica un servizio/una versione/un'istanza in uno dei formati 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 utilizzando il parametro
target
in taskqueue.add() personalizzata. Vedi l'esempio riportato sopra.Includi un'istruzione
target
quando definisci una coda nelqueue.yaml
, come nella definizione diqueue-blue
. Tutte le attività aggiunte a una coda con untarget
utilizzeranno quel target, anche se è stato assegnato un obiettivo diverso all'attività al momento della costruzione.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 query se il metodo specificato nell'attività è GET
o PULL
. Se non viene specificato alcun url
, l'URL predefinito
Viene utilizzato /_ah/queue/[QUEUE_NAME]
, dove [QUEUE_NAME]
è il nome
dell'attività.
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
.
payload
, che consegna i dati delle attività nel corpo della richiesta HTTP.params
Queste tre chiamate sono equivalenti:
taskqueue.add(method=GET, url='/update-counter?key=blue', target='worker')
taskqueue.add(url='/update-counter', params={'key': 'blue'}, target='worker')
taskqueue.add(url='/update-counter', payload="{'key': 'blue'}", target='worker')
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
l'attività è stata completata o eliminata.
Tieni presente che la logica di deduplicazione introduce un overhead significativo in termini di prestazioni, con conseguente aumento delle latenze e potenziali maggiori tassi di errore associate ad attività con nome. Questi costi possono essere aumentati significativamente se sono sequenziali, ad esempio con i timestamp. Quindi, se assegni nomi personalizzati, consigliamo di utilizzare un prefisso ben distribuito per i nomi delle attività, come un hash nei contenuti.
Se assegni i tuoi nomi 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.
taskqueue.add(url='/url/path', name='first-try')
Aggiunta di attività in modo asincrono
Per impostazione predefinita, le chiamate che aggiungono attività alle code sono sincrone. Per la maggior parte in scenari diversi, le chiamate sincrone vanno bene. L'aggiunta di un'attività a una coda è in genere per un'operatività veloce. Esiste una piccola percentuale di operazioni di aggiunta delle attività che richiede molto più tempo, ma il tempo medio per aggiungere un'attività è inferiore a 5 ms.
L'aggiunta di operazioni a code diverse non può essere suddivisa in batch, pertanto l'API Task Queue fornisce anche chiamate asincrone che consentono di aggiungere queste attività in parallelo, riducendo ulteriormente la latenza. Questo è utile se stai creando un un'applicazione estremamente sensibile alla latenza che deve eseguire diverse attività di aggiunta operazioni su diverse code contemporaneamente.
Se vuoi effettuare chiamate asincrone a una coda di attività, utilizza i metodi asincroni forniti dalla classe Queue e da un oggetto RPC. Chiama get_result()
su
l'oggetto RPC
restituito per forzare il completamento della richiesta. Quando in modo asincrono
aggiungi attività in una transazione, devi chiamare get_result()
sul RPC
prima di eseguire il commit della transazione per garantire che la richiesta sia terminata
di Google.
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. Attività aggiunte in un transazione sono ne viene considerata una parte e hanno lo stesso livello isolamento e coerenza.
Un'applicazione non può inserire più di cinque attività transazionali in code di attività durante un singolo transazione. Le attività transazionali non devono avere nomi specificati dall'utente.
Il seguente esempio di codice mostra come inserire attività transazionali in un Esegui coda in modalità push come parte di una transazione Datastore:
from google.appengine.api import taskqueue
from google.appengine.ext import ndb
@ndb.transactional
def do_something_in_transaction():
taskqueue.add(url='/path/to/my/worker', transactional=True)
#...
do_something_in_transaction()
Utilizzo della libreria di attività differite anziché di un servizio worker
L'impostazione di un gestore per ogni singola attività (come descritto
sezioni) possono essere complicate, così come la serializzazione e la deserializzazione
argomenti adatti all'attività, soprattutto se si svolgono molte attività diverse ma piccole
che vuoi eseguire in coda. L'SDK Python include una libreria
(google.appengine.ext.deferred
) mediante l'esposizione di una funzione semplice che ti consente di
di ignorare tutto il lavoro di configurazione
di gestori di attività dedicati, di serializzazione
deserializzare i parametri.
Per usare questa libreria, devi aggiungere l'deferred
integrata a app.yaml
. Per
ulteriori informazioni, consulta
Sezione Gestori integrati di
il riferimento app.yaml
.
Per utilizzare la libreria deferred
, è sufficiente passare la funzione e i suoi argomenti a
deferred.defer()
:
import logging
from google.appengine.ext import deferred
def do_something_expensive(a, b, c=None):
logging.info("Doing something expensive!")
# Do your work here
# Somewhere else
deferred.defer(do_something_expensive, "Hello, world!", 42, True)
La libreria deferred
pacchettizza la chiamata di funzione e i relativi argomenti, quindi aggiunge
alla coda di attività. Quando l'attività viene eseguita, la libreria deferred
viene eseguita
do_something_expensive("Hello, world!", 42, True)
.
Utilizzo delle attività in un'applicazione multi-tenant
Per impostazione predefinita, le code 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 la multitenancy, vedi l'API Python 2 degli spazi dei nomi.
Passaggi successivi
- Scopri come creare un'attività e i gestori di rete.