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 Go 22/09/2026 10 phút

Đọc panic trace và runtime.Stack trong Go: mổ xẻ từng dòng để chẩn đoán crash

Panic trace không phải chữ đỏ đáng sợ mà là bản đồ đầy đủ để tìm bug. Bài này mổ xẻ từng phần: số hiệu goroutine, trạng thái [running]/[chan receive]/[sync.Mutex.Lock], ngăn xếp đọc từ đâu, tham số hex, tín hiệu SIGSEGV — và dùng runtime.Stack chụp mọi goroutine. Đo thật trong Go 1.23.

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

Cache-aside: mẫu cache phổ biến nhất, đo thật hit ratio leo từ 37,6% lên 95%

Cache-aside là mẫu cache gần như mọi hệ thống đều dùng: đọc cache trước, miss thì lấy từ database rồi điền vào. Bài này dựng nó bằng Go + Redis + PostgreSQL và đo thật: 20.000 request trên tập 1.000 sản phẩm, hit ratio leo từ 37,6% (mốc 1.000 request) lên 95%, và số truy vấn database đứng yên ở 1.000 — tiết kiệm 95% lượt chạm DB. Nói thẳng: query có index nên MISS chỉ chậm hơn HIT khoảng 4 lần, cái thắng lớn không nằm ở độ trễ một request. Kèm đo lỗi xuyên thủng cache: 200 id không tồn tại khiến 5.000/5.000 request đều chạm database.

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

Streaming JSON lớn trong Go: json.Decoder thay vì Unmarshal cả tệp

json.Unmarshal cần toàn bộ dữ liệu trong RAM rồi dựng mọi struct cùng lúc — bộ nhớ tỉ lệ với kích thước tệp, tệp GB làm sập app. json.Decoder đọc lười từng phần tử, giữ bộ nhớ hằng số. Đo thật trong Go: xử lý tệp JSON 41.6 MB, Unmarshal tốn +142.5 MB heap, streaming chỉ +2.3 MB — cùng kết quả.