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 11 phút

Metrics với Prometheus client trong Go: counter, gauge, histogram và chi phí đo

Trace chẩn đoán một request; metrics trả lời hệ thống có khỏe không. Bài mổ xẻ ba loại metric Prometheus trong Go, vì sao histogram hơn hẳn trung bình, và đo thật chi phí: mọi thao tác 0 cấp phát, nhưng WithLabelValues tra cứu nhãn tốn 24 ns mỗi lần — cache handle về 1.7 ns.

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

Tổng kết Thiết kế API: gom 11 phép đo vào một endpoint — 2.000 request tới origin còn 6, 8,5 MB qua dây còn 28 KB, p99 từ 30 ms xuống 1,7 ms

Phần cuối sê-ri gom các bài học đã đo vào đúng một endpoint danh sách — keyset, chỉ trường cần, ETag, Cache-Control với stale-while-revalidate, gzip, Vary — rồi đặt cạnh bản viết trong năm phút dưới cùng lưu lượng: 20 client song song, 2.000 request, 70% lật trang đầu và 30% nhảy tới trang 5.000. Kết quả: request tới origin từ 2.000 xuống 93 khi cache lạnh và 6 khi ấm, byte qua dây từ 8,5 MB xuống 27,7 KB, p99 từ 30,12 ms xuống 1,68 ms. Không có thư viện mới, chỉ sáu header và một mệnh đề WHERE. Kèm khung quyết định cho từng chủ đề và checklist rà soát API trước khi lên production.

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

Consensus với Raft trong Go: bầu leader và nhân bản log qua đa số

Khóa Redis có thể sai khi failover. Raft giải bài toán đồng thuận: nhiều node thống nhất một log lệnh dù có node chết, miễn đa số còn sống. Bài dựng cụm 3 node hashicorp/raft thật trong Go: đo bầu leader, nhân bản log đồng nhất, và failover — leader chết thì cụm tự bầu leader mới ở term cao hơn.

Kiến trúc hệ thống 22/09/2026 6 phút

Stripe idempotency key: vì sao retry thanh toán không tính tiền bạn hai lần

Mạng chập chờn khiến client retry — và với thanh toán, retry ngây thơ nghĩa là tính tiền hai lần. Stripe giải bằng Idempotency-Key: lưu kết quả lần đầu, request trùng key trả lại kết quả cũ mà không thực thi lại. Bài này dựng THẬT trên Redis bằng Lua atomic và đo: có idempotency trừ tiền 1 lần, không có thì 5 lần.

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

Phát hiện rò rỉ goroutine sản xuất trong Go: số goroutine tăng mãi không giảm

Goroutine kẹt vĩnh viễn (chờ channel không ai gửi) không thoát và GC không dọn được — mỗi request rò một cái, số goroutine tăng mãi tới khi hết RAM. Đo thật trong Go: 1000 request rò 1000 goroutine (NumGoroutine 1→1001 không giảm), và pprof goroutine chỉ đúng chỗ kẹt tại một dòng code.