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

Service discovery trong Go: đăng ký, health check TTL và round-robin

Địa chỉ cứng không co giãn: dịch vụ scale, chết, đổi IP thì client không biết. Service discovery giải bằng sổ đăng ký động — dịch vụ tự đăng ký và heartbeat, client tra để tìm bản sống. Bài dựng registry trong Go và đo thật: round-robin phân đều 3/3/3, health check loại bản chết, traffic tự né.

Kiến trúc hệ thống 22/09/2026 5 phút

Stack Overflow cân bằng tải với HAProxy: chia tải và tự loại máy chủ chết

Một máy chủ không chịu nổi tải, và máy chủ thì có lúc chết. HAProxy chia request ra nhiều backend và dùng health check tự loại backend hỏng mà không rớt request. Bài này dựng THẬT HAProxy + 3 backend: round-robin chia 4/4/4, giết một backend thì tự dồn 6/6 không lỗi 5xx, bật lại thì tự quay vào pool.

Web 22/09/2026 5 phút

Nginx reverse proxy: một cửa trước nhiều backend — đo round-robin và X-Forwarded

Reverse proxy đứng trước các server, thay mặt chúng trả lời client: cân bằng tải, kết thúc TLS, gom nhiều service sau một tên miền. Bài này dựng nginx proxy tới 3 backend, đo round-robin chia đúng 10/10/10 trên 30 request, và giải thích vì sao thiếu header X-Forwarded-* làm backend thấy sai IP và giao thức của client.

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

Load balancing phía client trong gRPC: vì sao LB kiểu HTTP/1 dồn hết vào một server, và round-robin chia đều thế nào

Đặt một load balancer thường trước gRPC là một bẫy: vì gRPC giữ một kết nối HTTP/2 lâu dài, LB mức kết nối (L4) ghim mọi request vào đúng một backend. Bài này đo thật trong go-lab: chạy 3 server, dùng client-side round-robin, gọi 300 RPC — chia gần như hoàn hảo 100/99/101 giữa ba server. Hiểu vì sao gRPC cần cân tải ở mức RPC (client-side hoặc proxy L7), không phải mức kết nối.

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

Load balancing phía client trong gRPC: rải request qua nhiều backend không cần proxy

gRPC giữ kết nối lâu dài, nên load balancer tầng kết nối không rải được từng request — gRPC tự cân bằng ở phía client. Bài này chạy thật với 3 server: chính sách mặc định pick_first dồn cả 300 request vào một server (2 server ngồi không); đổi sang round_robin thì 300 request rải đều 100/101/99. Đo bằng counter thật mỗi server. Client biết danh sách backend qua resolver và tự chọn — không cần proxy ở giữa.