Preskoči na sadržaj

~/projekat

Real-time distribuirani chat sistem

Distribuirani real-time chat sistem dizajniran za proučavanje horizontalne skalabilnosti, WebSocket sinhronizacije stanja i custom connection load balancing-a.

  • React
  • Go
  • WebSocket
  • Redis Pub/Sub
  • Docker

Uloga: Lični projekat · Godina: 2024 - 2025 · Status: isporučeno

ukratko: Chat sistem izgrađen da se prouči šta zapravo puca kad WebSocket saobraćaj mora da živi na više servera. Goroutine-ovi rukuju konekcijama, Redis pub/sub širi poruke između čvorova, mali prilagođeni load balancer stoji ispred. Zanimljiv deo nije chat; to je ono što prestaje da radi kad pređeš sa jednog čvora na dva.

Go backend, React klijent, Redis Pub/Sub za distribuciju između čvorova i Docker kontejnerizacija.

Sažetak

  • Uloga: Kreator / jedini programer (lični projekat)
  • Tehnologije: Go, React, WebSocket, Redis Pub/Sub, Docker
  • Izazov: Horizontalno skaliranje stateful WebSocket konekcija na više čvorova bez gubitka redosleda poruka ili praćenja konekcija.

Problem

Tradicionalne real-time aplikacije drže connection state u memoriji. Jednostavno na jednom čvoru, ali horizontalno skaliranje uvodi osnovni problem: fragmentacija stanja. Korisnik na Serveru A ne može direktno poslati poruku korisniku na Serveru B jer Server A nema uvid u aktivne connection handle-ove Servera B. Za robustan, skalabilan sistem, upravljanje konekcijama mora biti odvojeno od sloja distribucije poruka.

Ograničenja

  • Ograničenja standardnog hardvera: Sistem mora raditi u strogim memorijskim granicama po čvoru, bez resource-heavy framework slojeva.
  • Ograničenja WebSocket stanja: Aktivne TCP konekcije su stateful i persistent; ne mogu se deliti ili pomerati između fizičkih servera bez prekida veze.
  • Pouzdanost isporuke poruka: Poruke moraju stići ciljnim klijentima tačno jednom, bez duplih upisa ili gubitka zbog restarta čvora.

Tehničke odluke

  • Go za backend servise: Izabran zbog laganog concurrency modela. Goroutine-ovi omogućavaju hiljade konkurentnih konekcija sa malim memorijskim otiskom, bez callback/event loop-ova.
  • Redis Pub/Sub za magistralu poruka: Korišćen za laganu koordinaciju između instanci. Umesto sinhronizacije globalnih listi klijenata, Redis je stateless broker. Kad poruka stigne na Server A, broadcast-uje se na kanal, a Server B je čita i gura lokalnim klijentima.
  • Docker za orkestraciju: Svi servisi upakovani u lagane kontejnere za pouzdano testiranje skaliranja od jednog do više instanci lokalno.

Kompromisi i rezultati

  • Odvojeno slanje poruka naspram trenutne konzistentnosti: Izabrana eventualna konzistentnost preko pub/sub umesto mehanizama distribuiranog zaključavanja. Mala latencija pri visokom protoku, ali upravljanje konekcijama ostaje brzo i stabilno.
  • Rezultati: Uspešno verifikovano horizontalno skaliranje stateful konekcija bez curenja memorije. Goroutine otisak ispod 10KB po idle socket-u, visok konkurentni protok na standardnim instancama.