Creazione di connessioni permanenti con WebSocket

Puoi utilizzare i 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 bidirezionale di dati tra il client e il server in qualsiasi momento, con conseguente latenza inferiore e migliore utilizzo delle risorse.

WebSockets

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'intestazione "upgrade".

I casi d'uso tipici per i WebSocket includono:

  • Aggiornamenti degli eventi in tempo reale, come feed dei social media, risultati sportivi, notizie o prezzi del mercato azionario
  • Notifiche utente, ad esempio aggiornamenti di software o contenuti
  • Applicazioni di chat
  • Strumenti di modifica collaborativa
  • Giochi multiplayer

I WebSocket sono sempre disponibili per la tua applicazione senza alcuna configurazione aggiuntiva. Una volta stabilita una connessione WebSocket, questa scadrà dopo un'ora. L'utilizzo di WebSocket viene fatturato in base all'utilizzo della connessione fino al timeout o alla chiusura del socket.

Esecuzione di un'applicazione di esempio con WebSocket

Gli esempi di codice in questo documento descrivono come eseguire un'applicazione di esempio con Websocket.

Prerequisiti e configurazione

Segui le istruzioni riportate in Configurazione dell'ambiente di sviluppo per configurare l'ambiente e il progetto e per capire 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 l'esempio localmente

Per l'esecuzione 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 dell'esempio su App Engine ed eseguilo

Per eseguire il deployment dell'applicazione nell'ambiente flessibile di App Engine, esegui il comando seguente dalla directory in cui si trova app.yaml:

gcloud app deploy

A questo punto puoi indirizzare il browser a https://PROJECT_ID.REGION_ID.r.appspot.com

Affinità sessione

Non tutti i client supportano i WebSocket. Per risolvere questo problema, molte applicazioni utilizzano librerie come socket.io che ricorrono al long polling HTTP con i client che non supportano i WebSocket.

In genere, App Engine distribuisce le richieste in modo uniforme tra le istanze disponibili. Tuttavia, quando si utilizza 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 esaminando un cookie e le indirizza alla stessa istanza.

L'affinità di sessione in App Engine viene implementata al meglio delle possibilità. Quando sviluppi la tua app, devi sempre presupporre che l&#39affinità sessionee 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 che gestiscono la tua applicazione. L'applicazione potrebbe riassegnare il carico e l'istanza di destinazione potrebbe spostarsi. Per ridurre al minimo questo rischio, assicurati di aver impostato 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 su un'istanza integra. Per saperne di più sui controlli di integrità e sulle relative opzioni di personalizzazione, consulta Dividere i controlli di integrità.
  • L'affinità di sessione viene persa quando un'istanza viene riavviata per manutenzione o aggiornamenti software. Le 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 long polling HTTP nei casi in cui la connessione viene interrotta. Non devi mai utilizzareaffinità sessioneà per creare applicazioni stateful.

Attivazione e disattivazione dell'affinità sessione

Per impostazione predefinita, l'affinità sessione è disattivata per tutte le applicazioni App Engine. L'affinità sessione viene impostata a livello di versione dell'applicazione e può essere attivata o disattivata durante il deployment.

Per attivare affinità sessione per la tua versione di App Engine, aggiungi la seguente voce al file app.yaml:

network:
  session_affinity: true

Una volta eseguito il deployment della versione con il file app.yaml aggiornato, le nuove richieste inizieranno a essere gestite dalla stessa istanza, a condizione che sia disponibile.

Per disattivare l'affinità sessione, rimuovi la voce dal file app.yaml o imposta il valore su false:

network:
  session_affinity: false