Puoi utilizzare WebSocket per creare una connessione persistente da un client (ad esempio un dispositivo mobile o un computer) a un'istanza App Engine. La connessione aperta consente lo scambio di dati bidirezionale tra il client e il server in qualsiasi momento, con una latenza inferiore e un migliore utilizzo delle risorse.
WebSocket
Il protocollo WebSockets, definito nel documento RFC 6455, fornisce un canale di comunicazione full-duplex tra un client e un server. Il canale viene avviato da una richiesta HTTP(S) con un "upgrade" intestazione.
I casi d'uso tipici di WebSocket includono:
- Aggiornamenti in tempo reale sugli eventi, ad esempio feed di social media, risultati sportivi, notizie o prezzi del mercato azionario
- Notifiche per gli utenti, ad esempio aggiornamenti di software o contenuti
- Applicazioni di chat
- Strumenti di modifica collaborativa
- Giochi multiplayer
WebSocket sono sempre disponibili per la tua applicazione senza alcuna configurazione aggiuntiva. Una volta stabilita, la connessione WebSockets scade dopo un'ora. L'utilizzo di WebSocket viene fatturato in base all'utilizzo della connessione fino al timeout o alla terminazione del socket.
Eseguire un'applicazione di esempio con WebSocket
Prerequisiti e configurazione
Gli esempi di codice in questo documento descrivono come eseguire un'applicazione di esempio con con WebSockets for Python runtime versione 3.7 e precedenti. Per Python 3.8 e versioni successive, consulta Runtime Python per approfondire l'utilizzo delle versioni più recenti.
Segui le istruzioni in Configurazione dell'ambiente di sviluppo per configurare l'ambiente e il progetto e comprendere come sono strutturate le app.
Clona l'app di esempio
Copia le app di esempio sulla tua macchina locale e vai alla directory websockets
:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples
cd python-docs-samples/appengine/flexible_python37_and_earlier/websockets/
Esegui il sample localmente
Per l'esecuzione in locale, devi utilizzare Gunicorn con
il worker flask_socket
:
$ gunicorn -b 127.0.0.1:8080 -k flask_sockets.worker main:app
Esegui il deployment ed esegui l'esempio su App Engine
Per eseguire il deployment dell'applicazione nell'ambiente flessibile di App Engine, esegui
il comando seguente dalla directory in cui si trova il tuo app.yaml
:
gcloud app deploy
Dopodiché puoi indirizzare il browser a https://PROJECT_ID.REGION_ID.r.appspot.com
Affinità sessione
Non tutti i client supportano WebSocket. Per ovviare a questo problema, molte applicazioni utilizzano librerie come socket.io che ricorrono al polling http lungo con client che non supportano WebSocket.
App Engine in genere distribuisce le richieste in modo uniforme tra le istanze disponibili. Tuttavia, quando utilizzi il polling lungo HTTP, più richieste sequenziali di un determinato utente devono raggiungere la stessa istanza.
Per consentire ad App Engine di inviare richieste dello stesso utente alla stessa istanza, puoi attivare l'affinità sessione. App Engine identifica quindi le richieste inviate dagli stessi utenti ispezionando un cookie e le inoltra alla stessa istanza.
L'affinità di sessione in App Engine viene implementata secondo il criterio del "best effort". Quando sviluppare l'app, devi sempre presumere che l'affinità sessione non sia garantita. Un client può perdere l'affinità con l'istanza di destinazione nei seguenti scenari:
- Il gestore della scalabilità automatica di App Engine può aggiungere o rimuovere istanze la tua applicazione. L'applicazione potrebbe riallocare il carico potrebbe essere spostata l'istanza di destinazione. Per ridurre al minimo questo rischio, assicurati di avere imposta il numero minimo di istanze per gestire il carico previsto.
- Se l'istanza di destinazione non supera i controlli di integrità, App Engine sposta la sessione a un'istanza in stato integro. Per ulteriori informazioni sui controlli di integrità e sulle relative opzioni di personalizzazione, consulta Suddividere i controlli di integrità.
- L'affinità di sessione viene persa quando un'istanza viene riavviata per la manutenzione o gli aggiornamenti software. Istanze VM dell'ambiente flessibile di App Engine vengono riavviate su base settimanale.
Poiché l'affinità sessione non è garantita, devi utilizzarla solo per sfruttare la capacità di socket.io
e di altre librerie di eseguire il fallback sul polling lungo HTTP nei casi in cui la connessione sia interrotta. Non devi mai usare l'affinità di sessione per creare applicazioni stateful.
Attivazione e disattivazione dell'affinità sessione
Per impostazione predefinita, l'affinità sessione è disabilitata per tutte le applicazioni App Engine. L'affinità sessione è impostata a livello di versione dell'applicazione e può essere sia abilitato o disabilitato al momento del deployment.
Per abilitare l'affinità sessione per la tua versione di App Engine, aggiungi quanto segue
voce al tuo file app.yaml
:
network:
session_affinity: true
Una volta eseguito il deployment della versione con il file app.yaml aggiornato, le nuove richieste inizieranno per la gestione dalla stessa istanza purché questa sia disponibile.
Per disattivare l'affinità sessione, rimuovi la voce dal file app.yaml
,
oppure imposta il valore su false:
network:
session_affinity: false