Creazione di connessioni persistenti con WebSocket

ID regione

REGION_ID è un codice abbreviato assegnato da Google in base all'area geografica selezionata al momento della creazione dell'app. Il codice non corrisponde a un paese o a una provincia, anche se alcuni ID di area geografica potrebbero essere simili ai codici di paese e provincia di uso comune. Per le app create dopo febbraio 2020, REGION_ID.r è incluso negli URL di App Engine. Per le app esistenti create prima di questa data, l'ID area geografica è facoltativo nell'URL.

Scopri di più sugli ID dell'area geografica.

Puoi utilizzare WebSocket per creare una connessione permanente da un client (ad esempio un dispositivo mobile o un computer) a un'istanza di App Engine. La connessione aperta consente lo scambio bidirezionale di dati tra il client e il server in qualsiasi momento, con conseguente riduzione della latenza e migliore utilizzo delle risorse.

WebSocket

Il protocollo WebSocket, definito in 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 "quot;upgrade".

I casi d'uso tipici per WebSocket includono:

  • Aggiornamenti in tempo reale degli eventi, come feed di social media, risultati sportivi, notizie o prezzi del mercato azionario
  • Notifiche utente, ad esempio aggiornamenti di software o contenuti
  • Chat con le applicazioni
  • Strumenti di editing collaborativi
  • Giochi multiplayer

WebSocket sono sempre disponibili nell'applicazione senza alcuna configurazione aggiuntiva. Una volta stabilita una connessione WebSocket, si verifica un timeout dopo un'ora.

Esecuzione di un'applicazione di esempio con WebSocket

Innanzitutto, segui le istruzioni in &Hello, World!" per Python su App Engine, per configurare il tuo ambiente e il tuo progetto e per comprendere come sono strutturate le app Python per App Engine.

Clonare l'applicazione di esempio

Copia le app di esempio nella tua macchina locale e accedi alla directory websockets:

git clone https://github.com/GoogleCloudPlatform/python-docs-samples
cd python-docs-samples/appengine/flexible/websockets/

Esegui l'esempio a livello locale

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

Deployment ed esecuzione di un campione su App Engine

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

gcloud app deploy

Puoi quindi 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 utilizzano HTTP a lungo con client che non supportano 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 da parte dello stesso utente alla stessa istanza, puoi abilitare l'affinità sessione. App Engine quindi identifica quali richieste vengono inviate dagli stessi utenti ispezionando un cookie e instrada tali richieste alla stessa istanza.

L'affinità sessione in App Engine viene implementata secondo il criterio del "best effort". Quando sviluppi la tua app, devi sempre presupporre 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 che forniscono l'applicazione. L'applicazione potrebbe riassegnare il carico e l'istanza di destinazione potrebbe essere spostata. Per ridurre al minimo questo rischio, assicurati di avere 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 in un'istanza in stato integro. Per ulteriori informazioni sui controlli di integrità e sulle relative opzioni di personalizzazione, vedi Suddividere i controlli di integrità.
  • L'affinità sessione viene persa al riavvio di un'istanza per la manutenzione o gli aggiornamenti software. Le istanze VM dell'ambiente flessibile di App Engine vengono riavviate ogni settimana.

Poiché l'affinità sessione non è garantita, dovresti utilizzarla solo per sfruttare la capacità di socket.io e di altre librerie di ricorrere al polling HTTP lungo nei casi in cui la connessione non funziona. Non devi mai utilizzare l'affinità sessione per creare applicazioni stateful.

Attivare e disattivare l'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 abilitata o disabilitata al momento del deployment.

Per abilitare l'affinità sessione per la versione App Engine, aggiungi la seguente voce al file app.yaml:

network:
  session_affinity: true

Una volta eseguito il deployment con il file app.yaml aggiornato, le nuove richieste inizieranno a essere pubblicate dalla stessa istanza fintanto che tale istanza è disponibile.

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

network:
  session_affinity: false