Q

Quản trị viên

Là một lập trình viên yêu công nghệ, thích viết blog để chia sẻ kiến thức, kinh nghiệm lập trình và những điều thú vị trong thế giới tech.

2312 bài viết · Website
Lập trình Go 22/09/2026 9 phút

HTTP/2 multiplexing trong Go: nhiều request song song trên một kết nối, xóa head-of-line blocking

HTTP/2 chia mỗi request thành một stream độc lập chạy song song trên cùng một kết nối TCP, xóa head-of-line blocking của HTTP/1.1. Đo thật trong Go 1.23: 20 request trên một kết nối xong 54ms với HTTP/2 so với 1,136 giây với HTTP/1.1 — nhanh hơn 21 lần.

Cơ sở dữ liệu 22/09/2026 5 phút

pg_stat_user_tables trong PostgreSQL: tìm bảng thiếu index qua seq scan

pg_stat_user_tables đếm mỗi bảng bị quét tuần tự hay dùng index bao nhiêu lần. Bài này đo thật: một bảng 1 triệu dòng bị 20 truy vấn quét tuần tự đọc 20 triệu dòng, thêm index thì về 0 seq scan. Và vì sao 100% seq scan trên bảng nhỏ lại hoàn toàn bình thường. PostgreSQL 16.

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

Backpressure: vì sao hàng đợi 'không giới hạn' là quả bom RAM chờ nổ

Khi bên sản xuất nhanh hơn bên tiêu thụ và hàng đợi không giới hạn, công việc dồn đống tới khi hết RAM. Bài này chạy thật trong Go: hàng đợi không giới hạn phình lên gần 4GB trong nửa giây, còn hàng đợi có giới hạn (bounded channel cap 100) chặn nguồn lại — producer tự chậm khớp consumer, RAM ổn định. Giải thích backpressure và khi nào chặn, khi nào từ chối.

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

Cache stampede: khi cache hết hạn, 1000 request cùng đấm xuống DB — và singleflight gộp về 1

Cache là lá chắn cho database, nhưng đúng khoảnh khắc một key nóng hết hạn, hàng nghìn request cùng miss và cùng lao xuống nguồn — đó là cache stampede, thứ có thể quật sập DB ngay cả khi mọi thứ 'đang chạy tốt'. Bài này đo thật trong Go: 1000 goroutine cùng miss 1 key gọi nguồn 1000 lần; thêm singleflight, con số về đúng 1; và một cache LRU với truy cập lệch đạt hit rate 32.2%.

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.