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).