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

Web 22/09/2026 5 phút

Range request: cách tua video, tải tiếp file dở và tải song song hoạt động

Vì sao kéo thanh tua video nhảy ngay tới giữa phim mà không tải lại từ đầu? Vì sao tải file 2GB đứt mạng rồi nối tiếp được? Câu trả lời là Range request. Bài này dựng nginx thật phục vụ một file, đo bằng curl: 206 Partial Content, Content-Range, suffix range, lỗi 416, và ghép hai phần lại md5 khớp file gốc.

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

Reservoir sampling: lấy mẫu ngẫu nhiên đều từ luồng mà không biết độ dài

Làm sao lấy ngẫu nhiên 1000 dòng từ một log đang chảy, khi bạn không biết nó sẽ dài bao nhiêu và không thể giữ hết trong RAM? Algorithm R làm được với một lượt duyệt và bộ nhớ O(k). Bài này tự cài và đo thật: chạy 200.000 lần, mọi phần tử — đầu hay cuối luồng — đều được chọn với xác suất k/N (lệch tối đa 0.18 điểm phần trăm). Cơ chế, vì sao đều, và ứng dụng.

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

Tối ưu JSON trong Go: cắt một nửa số lần cấp phát mà không đổi định dạng

Phần 1 đo được encoding/json tốn nhiều cấp phát, nhất là khi giải mã. Bài này giữ nguyên JSON nhưng tối ưu cách dùng: json.Encoder/Decoder ghi đọc thẳng io tránh []byte trung gian, và json.RawMessage hoãn giải mã phần chưa cần. Đo thật: Encoder cắt 50% số lần cấp phát khi ghi 1000 object, RawMessage giảm 61% cấp phát khi chỉ cần field ngoài, Decoder streaming giảm 32% bộ nhớ đổi lấy ~10% thời gian.

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

Kafka cho backend từ con số 0: vì sao nó là cuốn sổ ghi, không phải hàng đợi — và nửa triệu message/giây trên một node

Nhiều người tưởng Kafka là một message queue nhanh hơn. Hiểu vậy là bỏ lỡ điểm cốt lõi: Kafka là một append-only log — message không bị xoá sau khi đọc, nhiều consumer đọc độc lập, và đọc lại được từ đầu. Bài mở màn sê-ri dựng broker KRaft single-node thật trong Docker, produce/consume, chứng minh log không mất bằng cách consume hai lần, và đo throughput thật: 527.983 bản ghi/giây (50 MB/giây) trên đúng một node.