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 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.

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

Load shedding: thà từ chối 38% để 62% được phục vụ nhanh, còn hơn tất cả cùng chậm

Khi tải vượt capacity, nhận hết vào hàng đợi khiến MỌI request chậm — p99 nổ. Load shedding từ chối bớt sớm (503) để phần được nhận vẫn nhanh. Bài này chạy thật trong Go: không shedding thì 2000 request có p99 = 4,8 giây (ai cũng khổ); có shedding thì 62% được phục vụ ở p99 = 21ms, 38% nhận 503 ngay. Giải thích khác biệt với backpressure và cách ưu tiên request quan trọng.

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

Command injection và path traversal: khi input biến thành lệnh shell hoặc thoát khỏi thư mục

Cùng gốc với SQL injection: khi input người dùng được ghép vào một lệnh shell, nó biến thành lệnh chạy trên server; khi được ghép vào đường dẫn file, ../ cho phép đọc file ngoài thư mục cho phép. Bài này tái hiện thật trong Go: shell nối chuỗi chạy lệnh thứ hai sau dấu chấm phẩy, còn exec.Command tách tham số coi input là một đối số vô hại; nối đường dẫn thô đọc được file bí mật ngoài baseDir, còn làm sạch + kiểm thuộc baseDir thì từ chối.