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.

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

Error model của gRPC: status code chuẩn và details có cấu trúc thay cho chuỗi lỗi mơ hồ

Trả về error là một chuỗi text thì client phải đoán xem có nên retry không, lỗi do input hay do server. gRPC có bộ status code chuẩn giải quyết điều đó. Bài này chạy thật: server trả InvalidArgument kèm details có cấu trúc (field nào sai), NotFound, và OK; client đọc code để quyết định tự động — retry với Unavailable, bỏ với InvalidArgument. Code là ngôn ngữ chung máy hiểu, hơn hẳn một dòng text.

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

Write-through vs write-back: đo thật write-back nhanh gấp 3, ghi DB ít đi 5 lần, và mất 19,4% dữ liệu khi chết

Bảy phần trước đều để cache đứng ngoài đường ghi. Bài này đưa nó vào thẳng đường ghi và đo trên Go + Redis + PostgreSQL với 20.000 lượt tăng bộ đếm: write-through tốn 0,125ms mỗi lượt và vẫn 20.000 lệnh ghi xuống database, nhưng đổi lại 100% hit khi đọc ngay sau đó (write-around chỉ 80,2%). Write-back gộp lô cho 0,038ms và chỉ 3.926 lệnh ghi — nhanh gấp 3, ít đi 5 lần. Cái giá đo được: cho tiến trình chết trước lúc dồn nốt thì 3.882 lượt mất trắng, 19,41%.

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

Đọc GODEBUG=schedtrace trong Go: giải mã trạng thái bộ lập lịch không cần thư viện

schedtrace là công cụ số một để nhìn vào bộ lập lịch Go. Bài này giải mã từng trường của một dòng SCHED thật, và theo dõi vòng đời một run qua bốn snapshot — từ lúc goroutine dồn vào hàng đợi cục bộ tới khi mọi core bận. Kèm cách đọc để chẩn đoán nút thắt. Go 1.23.

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

Rate limiting với Redis: fixed window, sliding window và token bucket — ba thuật toán, ba mức mượt

Giới hạn số request để chống lạm dụng là bài toán backend kinh điển, và Redis là công cụ lý tưởng nhờ các thao tác nguyên tử. Bài này đo thật trong redis-lab ba thuật toán: fixed window (INCR+EXPIRE, đơn giản nhưng burst ở ranh giới), sliding window (sorted set theo timestamp, mượt hơn, không burst), và token bucket (cho phép burst có kiểm soát). Với limit 5, cả hai đều cho 5 request qua và chặn request 6-7 — nhưng khác nhau ở độ chính xác quanh ranh giới cửa sổ.

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

Functional options nâng cao trong Go: closure làm cấu hình, tự validate, tương thích ngược

Functional options dùng closure làm tham số cấu hình, cho API mở rộng mà vẫn tương thích ngược. Đo thật trong Go 1.23: option tự validate và gộp lỗi tại constructor, chậm hơn config struct khoảng 6ns nhưng cùng một cấp phát, và closure không thoát heap khi dùng trực tiếp.

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

Middleware chain trong Go: xâu chuỗi xử lý HTTP bằng hàm bậc cao, gần như không tốn phí

Middleware trong Go là hàm func(http.Handler) http.Handler, xâu chuỗi được thành lớp xử lý HTTP kiểu củ hành. Đo thật trong Go 1.23: thứ tự thực thi vào-ra, middleware short-circuit dừng chuỗi, và một Chain combinator — 5 lớp middleware gần như không thêm chi phí vì chuỗi dựng một lần lúc khởi tạo.