javascript - U stvarnom vremenu s Node.js: WebSocket + ispitivanje na strani poslužitelja nasuprot ispitivanju na strani klijenta


Razvijam aplikaciju koja prikazuje podatke u stvarnom vremenu (grafikone itd.) iz Redisa. Ažurirani podaci dolaze u Redis vrlo brzo (u milisekundama). Stoga bi imalo smisla prikazivati ažuriranja što je češće moguće (dokle god ljudsko oko može primijetiti promjenu).

Tehnološki stack:

  • Node.js kao web poslužitelj
  • Redis koji drži podatke
  • JavaScript/HTML (AngularJS) kao klijent

Trenutno imam ispitivanje na strani klijenta (GET zahtjevi prema Node.js serveru svake sekunde koji upituje Redis za ažuriranja).

Postoji li prednost u obavljanju ispitivanja na strani poslužitelja, i izlaganju ažuriranja putem WebSocket-a? Ipak, svaka WebSocket veza će zahtijevati zasebno Node.js ispitivanje (setInterval) budući da se upiti klijenata mogu razlikovati. Ali se ne očekuje da će biti više od 100 WebSocket veza.

Koje su prednosti/nedostaci između ova dva pristupa?

Odgovor #1

Ako sam ispravno razumio vaše pitanje: imate manje od 100 korisnika koji će koristiti vaš resurs istovremeno, i želite saznati što bi mogao biti bolji način da im dajete ažuriranja:

  • klijenti traže ažuriranja putem zahtjeva za vremensko ograničenje (1 po sekundi)
  • server prati klijente i kad god dođe do ažuriranja, izdaje im ažuriranje.

Mislim da najbolja rješenja ovise o podacima koje imate i koliko je važno za korisnike da dobiju te podatke.

Odabrao bih klijentsku stranu ako:

  • ljudi ne mare ako su njihovi podaci malo zastarjeli
  • tijekom ove 1 sekunde bilo bi približno više od 1 ažuriranja
  • Nemam vremena mijenjati kod

Odabrao bih serversku stranu ako:

  • važno je imati ažurirane podatke i korisnici ne mogu podnijeti kašnjenja
  • ažuriranja nisu tako česta (ako na primjer imamo ažuriranja samo jednom u minuti, samo 1 od 60 zahtjeva s klijentske strane bi bilo korisno. A ovdje će server izdati samo jedno ažuriranje)

Jedna dobra stvar je što node.js već ima izvrsnu socket.io biblioteku za ovu svrhu.