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

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

Bulkhead: vì sao một API chậm kéo sập cả những endpoint chẳng liên quan gì tới nó

Con tàu Titanic chìm vì nước tràn từ khoang này sang khoang khác. Hệ thống của bạn cũng vậy: khi một phụ thuộc chậm (một API bên thứ ba treo), nó chiếm hết luồng dùng chung và làm chết đói cả những request nhanh chẳng liên quan. Bài này đo thật trong Go: pool dùng chung khiến request nhanh A chỉ 11/200 thành công (latency 46ms) khi request chậm B treo; tách pool riêng (bulkhead), A trở lại 200/200 với latency 2.6ms.

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

Graceful degradation: khi phụ thuộc chết, trả dữ liệu cũ có ích còn hơn trang trắng 500

Amazon từng nói: thà hiển thị gợi ý sản phẩm cũ hơn là để trang trắng. Đó là graceful degradation — khi một phụ thuộc chết hẳn, trả một phản hồi suy giảm nhưng vẫn có ích thay vì lỗi 500. Bài này đo thật trong Go: một handler phụ thuộc cứng chỉ đạt 25% thành công khi downstream chết; thêm fallback bằng stale cache, tỉ lệ thành công lên 100% (150/200 request được phục vụ bằng dữ liệu cũ đánh dấu rõ).

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

Chọn mẫu chịu tải nào? Cây quyết định và cách ghép 11 mẫu thành một pipeline sống sót

Loạt bài này đi qua 11 mẫu chịu tải, mỗi mẫu giải một vấn đề riêng. Bài tổng kết trả lời câu hỏi thực tế: gặp tình huống X thì dùng mẫu nào, và ghép chúng theo thứ tự nào? Kèm demo thật trong Go ghép bulkhead + circuit breaker + timeout + fallback: cùng một downstream ốm yếu, pipeline nâng tỉ lệ thành công người dùng từ 48% lên 100%, giảm tải xuống downstream từ 500 còn 73 lần gọi, và cắt latency từ 93.9ms xuống 13.3ms.

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

Structured logging với slog: vì sao log chuỗi tự do là món nợ kỹ thuật bạn trả lúc 3 giờ sáng

Lúc sự cố xảy ra, bạn không đọc log — bạn truy vấn nó. Và log chuỗi tự do (fmt.Printf) không truy vấn được: mỗi dòng một định dạng, muốn lọc phải viết regex. Bài này đo thật với log/slog của Go 1.23: cùng một sự kiện in ra chuỗi tự do và JSON có cấu trúc, rồi dùng jq lọc 1000 dòng log theo nhiều field (đếm ERROR theo service, tính latency trung bình). Kèm số đo chi phí thật — và một sự thật ngược đời: log chuỗi nhanh hơn slog gần 1.7 lần.

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

Counter và gauge với expvar: hai loại metric nền tảng, và vì sao đếm không atomic mất 80% dữ liệu

Log trả lời 'chuyện gì đã xảy ra với request này', metric trả lời 'hệ thống đang thế nào tổng thể'. Bài này đo thật hai loại metric cơ bản nhất bằng expvar của thư viện chuẩn Go: counter (tổng cộng dồn, chỉ tăng) và gauge (mức tức thời, lên xuống). Kèm một bằng chứng đanh thép về tính đồng thời: 50 goroutine cùng ++ một biến int thường làm mất 81.9% số đếm, trong khi expvar.Int (atomic) đếm đúng tuyệt đối.

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

Tối ưu throughput producer Kafka: batch, linger và nén — khi lz4 vừa nhanh hơn vừa nhỏ 24 lần

Producer Kafka mặc định đã nhanh, nhưng chỉnh đúng ba núm là tăng gấp đôi. Bài này đo thật trong lab: gom batch 128KB + linger 10ms cho throughput 2,25 lần (118 lên 266 MB/s) và độ trễ còn thấp hơn; nén lz4 vừa nhanh hơn không nén vừa nhỏ 24 lần trên đĩa, zstd nén tới 58 lần (26MB còn 460KB). Và vì sao đẩy batch quá to lại phản tác dụng.