Lập trình 22/09/2026 9 phút

Server-Sent Events đo cạnh WebSocket: Last-Event-ID nối lại mất 0 sự kiện mà không viết dòng client nào, HTTP/2 gom 300 stream vào 2 kết nối TCP, proxy đệm 4 KB giữ sự kiện 6,6 giây, và chiều ngược qua POST tốn gấp đôi một echo WebSocket

Server Go phục vụ SSE qua HTTP/1.1 và h2c, kèm hai proxy và WebSocket echo. Rút cáp 3 giây giữa stream 200 sự kiện mỗi giây: có Last-Event-ID mất 0, không có mất 704, bằng ring buffer tự viết ở phần 8. 100 stream qua HTTP/1.1 là 100 kết nối TCP và 208 goroutine, qua h2c là 1 kết nối và 110 goroutine; 300 stream h2c tự chia 2 kết nối vì Go giới hạn 250 stream mỗi kết nối. ReverseProxy của Go chuyển SSE tức thì, 0,4 ms; proxy đệm 4 KB dồn 68 sự kiện thành một cụm sau 10 giây. POST rồi nhận echo mất 0,112 ms so với 0,064 ms của WebSocket; mỗi sự kiện SSE tốn 28 byte framing so với 2 đến 6 byte.

Lập trình 22/09/2026 11 phút

TLS termination ở đâu, đo thật: với keep-alive TLS trong app tốn thêm 0 µs đo được, hop qua proxy tốn gấp 3,7 lần CPU và cộng 0,12 ms, mã hoá lại 64 KB qua sidecar chậm gấp 6,5 lần, còn khi mỗi request là một kết nối mới thì proxy gom hết bắt tay

Bốn topology cùng một app Go: plaintext, TLS trong app, proxy kết thúc TLS rồi plaintext vào app, và proxy mã hoá lại. Keep-alive 64 kết nối 256 byte: app plaintext 31 µs CPU mỗi request, app TLS 29 µs, qua proxy thêm 110 µs ở proxy và p50 từ 0,35 lên 1,83 ms. Body 64 KB: TLS trong app thêm 22 µs, mã hoá lại qua proxy tốn 143 cộng 300 µs và p50 7,79 ms. Kết nối mới mỗi request: TLS trong app 353 µs, qua proxy app còn 52 µs vì bắt tay dồn về proxy. Một kết nối tuần tự: hop loopback cộng 0,12 ms; netem 1 ms RTT cho hop nội bộ đẩy p50 từ 0,21 lên 1,65 ms. Kèm ALPN h2 so với h1.