~/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.