WebSockets rispetto alla chiamata Ajax per l'evento pianificato?

0

Introduzione

Ho valutato i vantaggi e gli svantaggi dell'uso di WebSockets rispetto a una chiamata Ajax per un evento che si verificherà ogni x numero di secondi (in questo caso 5). Inizierò spiegando lo scenario.

I clienti aziendali desiderano aggiornamenti "in tempo reale" su una pagina Web in base ai dati contenuti in un database. Questo database risiede in un ambiente murato (applicazione di terze parti) e l'unico modo per accedere a questi dati è tramite un'API REST fornita.

Opzione 1

Il mio pensiero iniziale era che potevamo semplicemente fare una richiesta Ajax ogni minuto per aggiornare la pagina web con i dati più recenti ottenuti dall'API, ma il cliente commerciale desidera questi dati non appena viene aggiornato e insiste che un intervallo di un minuto è troppo lungo. Ok, è comprensibile.

Il mio prossimo pensiero è stato quello di eseguire la chiamata Ajax ogni cinque secondi, ma ho subito capito che questo potrebbe avere un grave sovraccarico delle prestazioni. Se 1000 utenti hanno questa pagina web aperta tutto il giorno a guardare l'aggiornamento dei dati, ciò comporterebbe 1000*(60/5)*60*24 (number_of_users * (seconds_per_minute / refresh_rate) * minutes_in_hour * hours_in_days) o 17,280,000 di richieste aggiuntive al giorno, insieme a ciascuna che richiede una chiamata all'API per ottenere le informazioni.

Sono molte richieste. E una quantità eccezionale di chiamate API che si traducono in letture del database. Per superare le chiamate API eccessive, è possibile implementare una soluzione di caching che leggerebbe dal database al refresh_rate (5 secondi) e salvare i risultati in qualcosa di simile a Redis, da cui le richieste Ajax potevano quindi leggere. Ciò rimuoverebbe la variabile number_of_users dall'equazione precedente.

TLDR chiamata Ajax:

  • 17.280.000 richieste http al giorno
  • 17.280 chiamate api al giorno
  • veloce e facile da implementare
  • non introduce un server WebSocket sul nostro attuale stack software

Opzione 2

Bene, quindi se si decide che la soluzione Ajax è troppo overhead extra allora WebSockets. L'utilizzo di WebSockets sembra un approccio logico per risolvere questo dilemma.

Invece di dover effettuare una richiesta http ogni cinque secondi su un server web, i client possono creare un'istanza di una connessione WebSocket al caricamento della pagina e ricevere gli aggiornamenti alla stessa velocità con cui il server può inviarli.

Il server WebSocket può eseguire il polling dell'API ogni 5 secondi per le modifiche (eliminando la necessità di una soluzione di memorizzazione nella cache come descritto nell'opzione 1) e inviare queste modifiche a tutti i client connessi.

TLDR WebSocket:

  • chiamata singola al server per istanziare la connessione, il server quindi spinge le modifiche a tutti i peer connessi
  • non è necessario il livello di memorizzazione nella cache
  • introduce un server WebSocket nel nostro stack

Conclusione

Sembra che l'Opzione 2 sia la strada da percorrere, tuttavia, come menzionato sopra, ciò richiederà un'ulteriore applicazione per vivere sul nostro stack che dovrà essere pensata, progettata e supportata. Quindi sembrerebbe che la mia vera domanda sia davvero:

Preferiresti consentire 17,3 milioni di chiamate http alla tua infrastruttura o progettare un server WebSocket?

PS

Il server WebSocket dovrebbe essere implementato in Java o C # in quanto queste sono le tecnologie di back-end consentite per la nostra organizzazione (senza Node.js).

    
posta nullReference 28.06.2018 - 18:02
fonte

2 risposte

0

Non vedrai un'enorme differenza.

Bene, il sondaggio consumerà molta più larghezza di banda semplicemente dalle intestazioni delle richieste a meno che non si utilizzino tecniche come il polling lungo, in cui il server non risponde alle richieste immediatamente ma attende fino a quando non sono disponibili nuovi dati o scade un certo timeout ( nel qual caso il cliente inizia la richiesta successiva). Ciò consente aggiornamenti istantanei, proprio come Websockets.

La differenza è che i websocket possono inviare più messaggi in entrambe le direzioni utilizzando la stessa connessione, mentre con il polling lungo il server può fornire solo una risposta per connessione. Connessione qui significa richiesta HTTP, anche se le connessioni TCP e TLS sottostanti potrebbero essere riutilizzate. Il polling lungo è di poco conto se il tuo server web si basa su un loop di eventi, ma è problematico nei server web a thread singolo per richiesta.

Ma a parte questo, non c'è davvero un'enorme differenza. In entrambi i casi, il server dovrà gestire un numero elevato di connessioni aperte simultanee. Nel caso di polling senza polling lungo, avrai meno connessioni simultanee ma impiegheresti più tempo a rispondere a tutte le richieste, il che comunque non sarà molto se gli eventi possono essere memorizzati nella cache.

È probabile che la cache sia una normale struttura di dati in memoria che persiste tra le richieste. Non deve essere un server cache esterno.

Quindi, crea semplicemente la cosa più semplice che funzioni per te. Sia Java che C # hanno un ecosistema di librerie molto maturo, quindi è probabile che siano disponibili buone implementazioni. Quando c'è un problema, considera il refactoring per usare una soluzione più elaborata e più performante. La mia ipotesi è che il polling lungo andrà bene, a meno che i client in genere ricevano più messaggi al minuto, oa meno che non si abbiano più connessioni di quelle che il tuo server web principale può gestire comodamente.

    
risposta data 28.06.2018 - 18:40
fonte
1

È passato un po 'di tempo da quando ho giocato con i websockets (server: java) e averli sistemati e lavorato non era poi così difficile. Le sfide che ho avuto noi più sul lato client. Tornerò su questo. Non dovresti aver bisogno di un server aggiuntivo. Puoi aggiungerlo in un server web esistente.

Websockets sembrerebbe essere una buona idea qui, ma se probabilmente introdurrebbe qualche nuovo problema. Una cosa che non capisco è che se stai usando websockets, perché sondare sul server? Sarebbe più sensato che l'API pubblicasse eventi che sarebbero poi tradotti in chiamate websocket.

Eviterei di provare a inviare il payload dei dati attraverso il websocket. Invece emetti un piccolo messaggio che dice al client che c'è qualcosa da ottenere dal server. La ragione per cui dico questo ha a che fare con le sfide sul cliente. Per prima cosa, non dovresti costruire questo intorno all'idea che il cliente sarà sempre attivo e in ascolto. Se qualcuno chiude il proprio browser o chiude il proprio laptop, non lo ascolta. La prima cosa che il cliente deve fare è essere in grado di ottenere lo stato attuale delle cose e / o gli eventi che sono stati persi. Fai questo con normali chiamate Ajax.

Ora che hai il modo in cui il cliente si può raddrizzare, la prossima sfida è mantenere il client connesso. Quello che vidi quando lavoravo con le web socket era che non sarebbero rimasti aperti a tempo indeterminato. È necessario avere una sorta di procedura di ri-connessione sul client che coinvolgerà di nuovo rimanere intrappolati.

Un'alternativa qui sarebbe quella di aggiungere un'ultima modifica alle intestazioni sulla risposta ajax. Quindi puoi utilizzare la logica If-Modifed-Since o creare HEAD chiamate per verificare gli aggiornamenti in base a ETag o Last-Modified senza dover scaricare il payload ogni volta. C'è ancora un sacco di chattiness però.

    
risposta data 28.06.2018 - 18:31
fonte

Leggi altre domande sui tag