javascript - Realtid med Node.js: WebSocket + Server-side polling vs. Client-side polling
Jeg udvikler en applikation, der viser realtidsdata (diagrammer osv.) fra Redis. Opdaterede data kommer til Redis meget hurtigt (millisekunder). Så det ville give mening at vise opdateringer så ofte som muligt (så længe det menneskelige øje kan bemærke det).
Teknologistak:
- Node.js som en webserver
- Redis, der holder dataene
- JavaScript/HTML (AngularJS) som en klient
Lige nu har jeg klient-side polling (GET-anmodninger til Node.js-serveren hvert sekund, der forespørger Redis for opdateringer).
Er der en fordel ved i stedet at udføre server-side polling og eksponere opdateringer gennem WebSocket? Hver WebSocket-forbindelse vil dog kræve en separat Node.js polling (setInterval), da klientforespørgslerne kan være forskellige. Men det forventes ikke at have mere end 100 WebSocket-forbindelser.
Er der nogen fordele/ulemper mellem disse to tilgange?
Svar #1
Hvis jeg forstod dit spørgsmål korrekt: du har mindre end 100 brugere, der skal bruge din ressource samtidig, og du vil finde ud af, hvad der kan være en bedre måde at give dem opdateringer på:
- klienter anmoder om opdateringer gennem timeout-forespørgsel (1 pr. sekund)
- serveren holder styr på klienter, og når der er en opdatering, udsender den en opdatering til dem.
Jeg tror den bedste løsning afhænger af de data, du har, og hvor vigtigt det er for brugerne at få disse data.
Jeg ville vælge klient-side, hvis:
- folk er ligeglade med, om deres data er en smule forældet
- der ville være cirka mere end 1 opdatering i løbet af dette 1 sekund
- Jeg har ikke tid til at ændre koden
Jeg ville vælge server-side, hvis:
- det er vigtigt at have opdaterede data, og brugere kan ikke tolerere forsinkelser
- opdateringer sker ikke så ofte (hvis vi for eksempel kun har opdateringer én gang i minuttet, ville kun 1 ud af 60 klientforespørgsler være nyttig. Og her vil serveren bare udsende én opdatering)
En god ting er, at node.js allerede har et fremragende socket.io-bibliotek til dette formål.