Lesson 48 — WebSocket & Streaming (Visualization)

Ba module tương tác: (1) so sánh dòng message của Long polling / SSE / WebSocket; (2) handshake nâng cấp HTTP → WS từng bước; (3) chat broadcast nhiều client qua hub. Mở README (nút 📖 góc phải) để đọc lý thuyết đầy đủ.

1. So sánh dòng message — Long polling / SSE / WebSocket

Long polling

Mỗi event = 1 HTTP request mới
ClientServer

SSE

1 connection giữ mãi, server đẩy 1 chiều
ClientServer

WebSocket

Full-duplex, hai chiều đồng thời
ClientServer
Quan sát: Long polling tốn 1 request setup + headers cho mỗi event (gói xanh dương đi lên trước mỗi gói xanh lá). SSE chỉ 1 request đầu, sau đó server đẩy thẳng. WebSocket cả 2 chiều cùng bay — client gửi typing indicator trong khi server đẩy message.

2. WebSocket handshake — nâng cấp HTTP → WS

Trạng thái: chế độ HTTP request/response
① Client gửi HTTP request kèm header UpgradeGET /ws HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13
② Server tính Accept = base64(SHA1(key + GUID))key = dGhlIHNhbXBsZSBub25jZQ== GUID = 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 → Sec-WebSocket-Accept = s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
③ Server trả 101 Switching ProtocolsHTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
④ Bỏ HTTP — chuyển sang frame protocol full-duplexFIN | opcode=0x1 (text) | MASK | len | payload... opcode: 0x1 text · 0x2 binary · 0x8 close · 0x9 ping · 0xA pong
💡 Giống đi qua cửa kiểm an sân bay: dùng giấy tờ HTTP để vào (bước ①–③). Sau status 101 bạn ở khu miễn thuế — di chuyển tự do bằng frame, không show giấy tờ HTTP nữa (bước ④).

3. Chat broadcast — hub-and-spoke nhiều client

Hub
sở hữu map
register · unregister
broadcast
Chỉ goroutine Hub đụng vào map clients → không cần mutex. Khi 1 client gửi, message đi vào broadcast channel; Hub phát vào send channel (buffered) của từng client. Nếu buffer client đầy (client chậm) → Hub drop client đó thay vì block cả hệ thống. Bấm 🐌 để xem Carol bị drop.