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

Tổng 2300 bài
Lập trình 22/09/2026 6 phút

HTTP/2 multiplexing: 300 request song song trên đúng một kết nối

HTTP/1.1 chỉ chạy một request tại một thời điểm trên mỗi kết nối (head-of-line blocking), nên phải mở nhiều kết nối để làm việc song song. HTTP/2 đan xen nhiều stream trên một kết nối. Bài này chạy thật trong Go: 300 request song song qua HTTP/2 mở 0 kết nối mới (dùng lại 1 kết nối), còn HTTP/1.1 mở 221 — và HTTP/2 nhanh gấp gần 4 lần. Kèm lý do vì sao vẫn cần HTTP/3.

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

Chẩn đoán mạng: khi 'mạng chậm', tách một request ra là biết ngay lỗi ở tầng nào

Khép lại loạt Mạng: khi ai đó nói 'mạng chậm', đừng đoán mò — tách một request thành DNS, TCP, TLS, TTFB rồi nhìn phần nào lớn nhất. Bài này chạy thật bằng httptrace: một request tới coffeecode.vn cho thấy DNS+TCP+TLS chỉ ~8ms nhưng TTFB tận 2015ms — nghĩa là mạng hoàn toàn ổn, server mới là thủ phạm. Kèm cây chẩn đoán triệu chứng → tầng → công cụ nối lại cả 12 phần.

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

Rate limiting: cho phép burst nhưng giữ tốc độ bền vững đúng ngưỡng

Traffic dồn dập làm quá tải hệ hoặc bị lạm dụng — rate limiting chặn phần vượt ngưỡng. Bài này chạy thật trong Go: token bucket giới hạn 100/s cho cụm 100 request đầu qua ngay (burst) rồi giữ đúng 100 req/s bền vững; đo được 1000 request tức thì chỉ 100 qua, và 3 giây liên tục cho qua chính xác 100 req/s. Giải thích token bucket vs leaky bucket và khi nào dùng cái nào.

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

Circuit breaker: khi service phụ thuộc chết, đừng gọi mãi — hãy ngắt mạch

Một service phụ thuộc lỗi liên tục mà ta cứ gọi = chờ timeout mãi, tốn tài nguyên, kéo sập cả caller (cascading failure). Circuit breaker ngắt mạch: sau vài lỗi, nó chặn ngay mọi call, trả lỗi nhanh thay vì chờ. Bài này chạy thật trong Go: 20 call tới service chết chỉ 5 chạm thật, 15 bị chặn ~0ms, tổng 1,02s thay vì 4000ms; rồi tự hồi phục qua half-open khi service sống lại.

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

Retry đúng cách: exponential backoff và jitter để không tự gây bão

Thử lại khi lỗi thoáng qua là đúng — nhưng retry ngay và đều của nhiều client cùng lúc tạo 'bão retry' đánh sập service đang gượng dậy. Bài này chạy thật trong Go: retry với exponential backoff (100/200/400ms), và đo sức mạnh của jitter — 50 client cùng lỗi, không jitter thì cả 50 dội cùng một cửa sổ 20ms, có jitter thì đỉnh chỉ còn 5, cắt tải retry ~10 lần.

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

Timeout và context: đặt hạn cho mọi thao tác, và cái bẫy rò rỉ goroutine

Không đặt hạn thì một thao tác treo giữ luồng mãi, tài nguyên cạn dần. Bài này chạy thật trong Go: context timeout 200ms khiến thao tác 2 giây trả về sau 209ms với DeadlineExceeded; và đo cái bẫy quan trọng — 100 goroutine không nghe ctx.Done() vẫn rò rỉ dù đã cancel, còn 100 goroutine có nghe thì thoát sạch. Timeout chỉ có tác dụng nếu hàm thực sự tôn trọng context.