Questo tutorial illustra un modo per un'app frontend, in questo caso un'applicazione per gestire volumi elevati di dati in entrata quando utilizzi in Google Cloud. Il tutorial descrive alcune delle difficoltà degli stream ad alto volume. Questo viene fornito con un'app di esempio tutorial che illustra come utilizzare WebSockets per visualizzare un flusso denso di in un argomento Pub/Sub, elaborandoli in modo tempestivo che mantiene un frontend efficiente.
Questo tutorial è rivolto agli sviluppatori che hanno familiarità con la tecnologia browser-to-server la comunicazione su HTTP e la scrittura di app di frontend tramite HTML, CSS e JavaScript. Il tutorial presuppone che tu abbia una certa esperienza con Google Cloud e hai familiarità con gli strumenti a riga di comando di Linux.
Obiettivi
- Crea e configura un'istanza di una macchina virtuale (VM) con i componenti necessari per trasmettere in streaming i payload di una sottoscrizione Pub/Sub ai client del browser.
- configura un processo sulla VM per la sottoscrizione a Pub/Sub e inviare i singoli messaggi a un log.
- Installa un server web per pubblicare contenuti statici e trasmettere il flusso del comando shell l'output ai client WebSocket.
- Visualizza le aggregazioni dello stream WebSocket e i singoli campioni di messaggio in un browser utilizzando HTML, CSS e JavaScript.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Prima di iniziare
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- Apri Cloud Shell per eseguire i comandi elencati in questo tutorial.
Esegui tutti i comandi del terminale in questo tutorial in Cloud Shell.
- Abilita l'API Compute Engine e l'API Pub/Sub:
gcloud services enable compute pubsub
Al termine di questo tutorial, puoi evitare la fatturazione continua eliminando il le risorse che hai creato. Consulta: Pulizia per ulteriori dettagli.
Introduzione
Poiché sempre più app adottano modelli basati su eventi, è importante che il frontend sono in grado di creare connessioni semplici e fluide alla messaggistica e servizi che costituiscono la pietra miliare di queste architetture.
Esistono diverse opzioni per trasmettere i flussi di dati ai client del browser web; il più alto comuni sono i WebSocket. Questo tutorial illustra la procedura di installazione di un processo che si iscrive a uno stream di messaggi pubblicati in un argomento Pub/Sub e inoltra questi messaggi tramite il server web ai client connessi tramite WebSocket.
Per questo tutorial, utilizzerai l'argomento Pub/Sub disponibile pubblicamente utilizzato nel codelab di Google Dataflow NYC Taxi Tycoon. Questo argomento fornisce uno stream in tempo reale di telemetria simulata dei taxi basato su dati storici delle corse acquisiti a New York dai set di dati dei registri delle corse della Taxi & Limousine Commission.
Architettura
Il seguente diagramma mostra l'architettura del tutorial che crei in questo tutorial.
Il diagramma mostra un publisher di messaggi esterno al progetto che contiene la risorsa Compute Engine; il publisher invia messaggi a un Pub/Sub. L'istanza Compute Engine rende disponibili i messaggi tramite WebSocket a un browser che esegue una dashboard basata su HTML5 e JavaScript.
Questo tutorial utilizza una combinazione di strumenti per creare un collegamento tra Pub/Sub e i web socket:
pulltop
è un programma Node.js che installi nell'ambito di questo tutorial. Lo strumento si iscrive a un argomento Pub/Sub e invia in streaming i messaggi ricevuti all'output standard.websocketd
è un piccolo strumento a riga di comando che aggrega un'interfaccia a riga di comando esistente e consente l'accesso tramite WebSocket.
Combinando pulltop
e websocketd
, puoi avere i messaggi che ricevi
dall'argomento Pub/Sub trasmesso in flusso a un browser usando WebSocket.
Regolazione della velocità effettiva dell'argomento Pub/Sub
L'argomento Pub/Sub pubblico di NYC Taxi Tycoon genera da 2000 a 2500 aggiornamenti simulati di corse in taxi al secondo, fino a 8 Mb o più al secondo. La il controllo del flusso integrato in Pub/Sub rallenta il messaggio di un sottoscrittore valutano automaticamente se Pub/Sub rileva una coda crescente di messaggi non confermati. Di conseguenza, potresti notare una elevata variabilità della frequenza di messaggi tra diverse stazioni di lavoro, connessioni di rete e codice di elaborazione front-end.
Elaborazione efficace dei messaggi nel browser
Dato l'elevato volume di messaggi in arrivo tramite lo stream WebSocket, devi prestare attenzione a scrivere il codice frontend che elabora questo stream.
Ad esempio, potresti creare dinamicamente elementi HTML per ogni messaggio. Tuttavia, con la frequenza di messaggi prevista, l'aggiornamento della pagina per ogni messaggio potrebbe bloccare la finestra del browser. Allocazioni frequenti della memoria derivanti da dinamicamente
la creazione di elementi HTML prolunga la durata della garbage collection, diminuendo
un'esperienza utente positiva. In breve, non vuoi chiamare document.createElement()
per
arriva ogni secondo ciascuno dei circa 2000 messaggi.
L'approccio di questo tutorial per la gestione di questo flusso denso di messaggi è il seguente:
- Calcola e aggiorna continuamente un insieme di metriche relative ai flussi in tempo reale, mostrare la maggior parte delle informazioni sui messaggi osservati sotto forma di valori aggregati.
- Utilizza una dashboard basata su browser per visualizzare un piccolo campione di singoli messaggi su una pianificazione predefinita, mostrando solo gli eventi di consegna e ritiro in tempo reale.
La figura seguente mostra la dashboard creata nell'ambito di questo tutorial.
La figura mostra una latenza dell'ultimo messaggio di 24 millisecondi
di quasi 2100 messaggi al secondo. Se i percorsi di codice critici per l'elaborazione
di ogni singolo messaggio non vengono completati in tempo, il numero di messaggi
osservati al secondo diminuisce con l'aumento della latenza dell'ultimo messaggio.
Il campionamento dei viaggi viene eseguito utilizzando l'API JavaScript setInterval
impostata su un ciclo ogni tre secondi, il che impedisce al frontend di creare un numero enorme di elementi DOM nel corso della sua vita. (La stragrande maggioranza di questi
sono comunque praticamente non osservabili con velocità superiori ai 10 al secondo.)
La dashboard inizia a elaborare gli eventi a metà dello stream, quindi
già in corso vengono riconosciuti come nuovi dalla dashboard, a meno che non siano stati
mai visti prima. Il codice utilizza un array associativo per memorizzare ogni corsa osservata,
indicizzato dal valore ride_id
e rimuove il riferimento a una determinata corsa
quando il passeggero è stato fatto scendere. Corse su un percorso o "ritiro" stato
aggiungere un riferimento a quell'array a meno che (nel caso di "inroute") la corsa non abbia
osservato in precedenza.
Installare e configurare il server WebSocket
Per iniziare, crea un'istanza Compute Engine da utilizzare come server WebSocket. Dopo aver creato l'istanza, installa gli strumenti di cui avrai bisogno in un secondo momento.
In Cloud Shell, imposta la zona Compute Engine predefinita. L'esempio seguente mostra
us-central1-a
, ma puoi utilizzare qualsiasi zona.gcloud config set compute/zone us-central1-a
Crea un'istanza Compute Engine denominata
websocket-server
nella zona predefinita:gcloud compute instances create websocket-server --tags wss
Aggiungi una regola firewall che consenta il traffico TCP sulla porta
8000
a qualsiasi istanza contrassegnata comewss
:gcloud compute firewall-rules create websocket \ --direction=IN \ --allow=tcp:8000 \ --target-tags=wss
Se utilizzi un progetto esistente, assicurati che la porta TCP
22
sia e aprirli per consentire la connettività SSH all'istanza.Per impostazione predefinita, la regola firewall
default-allow-ssh
è attivata nella rete predefinita. Tuttavia, se tu o il tuo amministratore avete rimosso il valore predefinito in un progetto esistente, la porta TCP22
potrebbe non essere aperta. Se hai creato un nuovo progetto per questo tutorial, la regola è attiva per impostazione predefinita e non devi fare nulla.Aggiungi una regola firewall che consenta il traffico TCP sulla porta
22
a qualsiasi istanza contrassegnata comewss
:gcloud compute firewall-rules create wss-ssh \ --direction=IN \ --allow=tcp:22 \ --target-tags=wss
Connettiti all'istanza mediante SSH:
gcloud compute ssh websocket-server
Al comando del terminale dell'istanza, passa all'account
root
in modo che che puoi installare il software:sudo -s
Installa gli strumenti
git
eunzip
:apt-get install -y unzip git
Installa il programma binario
websocketd
sull'istanza:cd /var/tmp/ wget \ https://github.com/joewalnes/websocketd/releases/download/v0.3.0/websocketd-0.3.0-linux_386.zip unzip websocketd-0.3.0-linux_386.zip mv websocketd /usr/bin
Installa Node.js e il codice del tutorial
In un terminale sull'istanza, installa Node.js:
curl -sL https://deb.nodesource.com/setup_10.x | bash - apt-get install -y nodejs
Scarica il repository di codice sorgente del tutorial:
exit cd ~ git clone https://github.com/GoogleCloudPlatform/solutions-pubsub-websockets.git
Modifica le autorizzazioni su
pulltop
per consentire l'esecuzione:cd solutions-pubsub-websockets chmod 755 pulltop/pulltop.js
Installa le dipendenze di
pulltop
:cd pulltop npm install sudo npm link
Verifica che il pulltop possa leggere i messaggi
Nell'istanza, esegui
pulltop
sull'argomento pubblico:pulltop projects/pubsub-public-data/topics/taxirides-realtime
Se
pulltop
funziona, viene visualizzato uno stream di risultati come il seguente:{"ride_id":"9729a68d-fcde-484b-bc32-bf29f5188628","point_idx":328,"latitude" :40.757360000000006,"longitude":-73.98228,"timestamp":"2019-03-22T20:03:51.6 593-04:00","meter_reading":11.069151,"meter_increment":0.033747412,"ride_stat us":"enroute","passenger_count":1}
Premi
Ctrl+C
per interrompere lo stream.
Stabilire il flusso di messaggi verso websocketd
Ora che hai stabilito che pulltop
può leggere l'argomento Pub/Sub, puoi avviare il processo websocketd
per iniziare a inviare messaggi al browser.
Acquisire i messaggi degli argomenti in un file locale
Per questo tutorial, acquisirai lo stream di messaggi che ottieni da pulltop
e la scrivi in un file locale. La cattura del traffico dei messaggi in un file locale aggiunge un requisito di archiviazione, ma disaccoppia anche il funzionamento del processo websocketd
dai messaggi degli argomenti Pub/Sub in streaming. Acquisizione in corso...
le informazioni a livello locale consentono
a scenari in cui potresti voler
interrompere il flusso di dati di Pub/Sub (ad esempio per regolare i parametri di controllo del flusso)
ma non forzare il ripristino
ai client WebSocket attualmente connessi. Quando il flusso di messaggi viene ristabilito,
websocketd
ripristina automaticamente il flusso di messaggi verso i client.
Nell'istanza, esegui
pulltop
sull'argomento pubblico e reindirizza nel filetaxi.json
locale. Il comandonohup
indica il sistema operativo per mantenere in esecuzione il processopulltop
se ti disconnetti o chiudi o nel terminale.nohup pulltop \ projects/pubsub-public-data/topics/taxirides-realtime > \ /var/tmp/taxi.json &
Verifica che i messaggi JSON vengano scritti nel file:
tail /var/tmp/taxi.json
Se i messaggi vengono scritti nel file
taxi.json
, l'output viene simile al seguente:{"ride_id":"9729a68d-fcde-484b-bc32-bf29f5188628","point_idx":328,"latitude" :40.757360000000006,"longitude":-73.98228,"timestamp":"2019-03-22T20:03:51.6 593-04:00","meter_reading":11.069151,"meter_increment":0.033747412,"ride_sta tus":"enroute","passenger_count":1}
Passa alla cartella web dell'app:
cd ../web
Avvia
websocketd
per iniziare a trasmettere in streaming i contenuti del file locale utilizzando WebSockets:nohup websocketd --port=8000 --staticdir=. tail -f /var/tmp/taxi.json &
Il comando
websocketd
viene eseguito in background. Lo strumentowebsocketd
consuma l'output del comandotail
e trasmette in flusso ogni elemento come Messaggio WebSocket.Controlla i contenuti di
nohup.out
per verificare che il server sia stato avviato correttamente:tail nohup.out
Se tutto funziona correttamente, l'output è simile al seguente:
Mon, 25 Mar 2019 14:03:53 -0400 | INFO | server | | Serving using application : /usr/bin/tail -f /var/tmp/taxi.json Mon, 25 Mar 2019 14:03:53 -0400 | INFO | server | | Serving static content from : .
Visualizzazione dei messaggi
I singoli messaggi relativi alle corse pubblicati nell'argomento Pub/Sub hanno una struttura simile a questa:
{ "ride_id": "562127d7-acc4-4af9-8fdd-4eedd92b6e69", "point_idx": 248, "latitude": 40.74644000000001, "longitude": -73.97144, "timestamp": "2019-03-24T00:46:08.49094-04:00", "meter_reading": 8.40615, "meter_increment": 0.033895764, "ride_status": "enroute", "passenger_count": 1 }
In base a questi valori, calcola diverse metriche per l'intestazione della dashboard. I calcoli vengono eseguiti una volta per evento di corsa in entrata. I valori includono quanto segue:
- Latenza dell'ultimo messaggio. Il numero di secondi tra il timestamp dell'evento dell'ultima corsa osservata e l'ora corrente (derivata dall'orologio del sistema che ospita il browser web).
- Gite attive. Il numero di corse attualmente in corso. Questo numero
può crescere rapidamente e il numero diminuisce quando un valore
ride_status
didropoff
. - Frequenza dei messaggi. Il numero medio di eventi di corsa elaborati al secondo.
- Importo totale misurato. La somma dei metri di tutte le corse attive. Questo numero diminuisce quando le corse vengono ritirate.
- Numero totale di passeggeri. Il numero di passeggeri su tutte le corse. Questo numero diminuisce man mano che le corse vengono completate.
- Numero medio di passeggeri per corsa. Il numero totale di corse, diviso per il numero totale di passeggeri.
- Quantità media a consumo per passeggero. L'importo totale misurato diviso per il numero totale di passeggeri.
Oltre alle metriche e ai singoli campioni di corsa, quando un passeggero ricevuto o consegnato, la dashboard mostra una notifica di avviso sopra griglia di campioni delle corse.
Ottieni l'indirizzo IP esterno dell'istanza attuale:
curl -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip; echo
Copia l'indirizzo IP.
Sul computer locale, apri un nuovo browser web e inserisci l'URL:
http://$ip-address:8000
.Vedrai una pagina che mostra la dashboard per questo tutorial:
Fai clic sull'icona del taxi in alto per aprire una connessione allo stream e iniziare a elaborare i messaggi.
Le singole corse vengono visualizzate con un campione di nove corse attive che viene visualizzato ogni tre secondi:
Puoi fare clic sull'icona del taxi in qualsiasi momento per avviare o interrompere lo stream WebSocket. Se la connessione WebSocket viene interrotta, l'icona diventa rossa e gli aggiornamenti delle metriche e le singole corse vengono interrotti. Per riconnetterti, fai clic sul di nuovo l'icona taxi.
Prestazioni
Il seguente screenshot mostra il monitoraggio delle prestazioni degli Strumenti per sviluppatori di Chrome mentre la scheda del browser elabora circa 2100 messaggi al secondo.
Poiché l'invio dei messaggi avviene con una latenza di circa 30 ms, l'utilizzo della CPU media è di circa l'80%. L'utilizzo della memoria viene mostrato con un minimo di 29 MB, con 57 MB allocati in totale e che aumentano e diminuiscono liberamente.
Esegui la pulizia
Rimuovi regole firewall
Se hai utilizzato un progetto esistente per questo tutorial, puoi rimuovere le regole del firewall che hai creato. È buona norma ridurre al minimo le porte aperte.
Elimina la regola firewall che hai creato per consentire il traffico TCP sulla porta
8000
:gcloud compute firewall-rules delete websocket
Se hai anche creato una regola firewall per consentire la connettività SSH, elimina il regola firewall per consentire il protocollo TCP sulla porta
22
:gcloud compute firewall-rules delete wss-ssh
Elimina il progetto
Se non vuoi utilizzare di nuovo questo progetto, puoi eliminarlo.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Passaggi successivi
- Scopri di più su Pub/Sub e sul protocollo WebSockets
- Aggiungi la tua chiave API di Google Maps Platform a
cabdash.js
per geolocalizzare le corse di salita e discesa. - Esplora le architetture di riferimento, i diagrammi e le best practice su Google Cloud. Dai un'occhiata al nostro Centro architetture cloud.