Bài viết mới nhất

Tổng 2300 bài
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 10 phút

Tail latency WebSocket dưới 10.000 kết nối đo thật: 50 client không đọc làm hub không deadline đứng hẳn, deadline 1 giây đẩy p99 lên 2 giây, cấp phát 1 KB mỗi client đẩy p99 từ 45 lên 115 ms dù GC chỉ dừng 2 ms, GOGC 400 làm p99.9 tệ hơn

Server Go fan-out 100 vòng 1 KB tới 10.000 client, 1.000.000 mẫu độ trễ mỗi lần chạy, đo p50, p99, p99.9, max trước và sau từng cách sửa. Nền: p99.9 59 ms. 50 client không đọc với shard không write deadline: hub đứng ở vòng 22, 1.169 mẫu trễ 20 giây. Thêm deadline 1 giây: p99 2.016 ms, max 5.039 ms. Kênh riêng từng client: p99.9 50 ms. Cấp phát bản sao 1 KB cho từng client cộng rác nền 100 MB/s: GC dừng tổng 2,3 ms nhưng p99 115 ms, p99.9 148 ms. GOGC 400: p99 71 nhưng p99.9 251 ms và RSS 870 MB. Bỏ cấp phát trong đường nóng: p99.9 49 ms. GOMAXPROCS 2: p50 34,9 thay vì 20,4 ms.

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

Tổng kết sê-ri WebSocket và realtime đo thật: khung bốn câu hỏi để chọn polling, SSE hay WebSocket, sáu thứ không được bỏ qua dù chọn gì, và checklist vận hành với từng con số đã đo trong 11 phần, từ 27 KB mỗi kết nối tới p99.9 59 ms

Phần cuối gom 11 phần thành khung bốn câu hỏi: dữ liệu đổi bao lâu một lần, chiều lên có dày không, mất một thông điệp thì sao, bao nhiêu kết nối trên bao nhiêu máy. Mỗi nhánh có số đã đo: polling 1 giây 486 ms và 8,4 KB mỗi phút, SSE và WebSocket 0,3 ms và 1,3 KB, 27 KB RSS mỗi kết nối, Redis thêm 0,4 ms, ring buffer 100 KB cho mọi client, session 83 KB mỗi client. Sáu thứ bắt buộc dù chọn gì: write deadline, cô lập goroutine ghi, ping pong, số thứ tự, không cấp phát trong đường nóng, cấu hình proxy. Checklist vận hành ba nhóm: giới hạn hệ thống, timeout và nhịp, chỉ số phải theo dõi.

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

Contract testing đo thật: provider đổi API năm lần — test provider xanh 5/5, test consumer với mock xanh 5/5, hợp đồng consumer-driven bắt đúng 4/4 phá vỡ và nêu đúng consumer bị ảnh hưởng, snapshot toàn bộ phản hồi bắt 4/4 nhưng báo oan thêm 1

Provider trả GET /orders/{id}, hai consumer billing và notifier mỗi bên cần ba trường khác nhau. Provider đổi API năm cách: đổi tên total_cents, thêm currency, status thành số, bỏ created_at, id thành chuỗi. Test của provider xanh cả năm vì họ sửa test theo; test của consumer với mock xanh cả năm vì mock đóng băng hình dạng cũ. Hợp đồng suy từ struct của consumer, kiểm ở CI của provider, bắt đúng bốn phá vỡ, nói rõ billing hay notifier bị ảnh hưởng, im lặng với thay đổi thêm trường. Snapshot toàn bộ bắt bốn nhưng báo oan với trường thêm vô hại; e2e bắt như hợp đồng nhưng cần mã cả hai bên.

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

Livelock và starvation trong Go: khi goroutine bận rộn mà không tiến, hoặc bị bỏ đói

Deadlock làm mọi goroutine đứng; livelock làm chúng bận rộn mà không tiến; starvation bỏ đói số ít. Đo thật: mẫu nhường nhau hiếm khi livelock trên runtime Go (1,03x lãng phí), nhưng starvation lộ 12x mất cân bằng dù Go mutex chống đói hoàn toàn. Cách phát hiện và tránh. Go 1.23.

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

Fault injection đo thật với Toxiproxy: timeout 1 giây thua latency 300 ms vì một lượt gọi PostgreSQL là 5 lượt phản hồi, retry nâng 69% lên 98,5% với reset nhưng 0/50 với phản hồi cụt, bão retry ×4 tải mà 0% thành công, breaker 22 chờ còn 7

Đặt Toxiproxy giữa client Go và PostgreSQL rồi tiêm năm kiểu lỗi: chậm, treo, reset, cắt phản hồi, tắt hẳn. Latency 300 ms chiều về đánh bại timeout 1.000 ms vì một lượt gọi là khoảng 5 lượt phản hồi, đo 536 ms khi latency 100 ms. Không timeout thì treo quá 20 giây; tắt hẳn thì refused sau 0,3 ms. Reset 30% kết nối: retry 0/1/3 cho 69/94/98,5%; phản hồi cụt 200 byte: 0/50 dù retry 3, tốn 20 giây. Bão retry 50 client: jitter hạ đỉnh từ 50 xuống 20 lượt mỗi 100 ms nhưng vẫn 0% thành công. Breaker 5 lỗi/2 giây: 7 timeout thay vì 22, hồi sau 0,43 giây. Kèm netem loss 20%: p99 3,1 giây.