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

Continuous profiling trong Go: hồ sơ CPU/bộ nhớ từ dịch vụ đang chạy thật

Benchmark cục bộ chỉ đo cái bạn nghĩ là nóng; điểm nóng production thường ở chỗ bất ngờ với tải và dữ liệu thật. net/http/pprof phơi endpoint để thu hồ sơ từ dịch vụ đang chạy mà không dừng nó. Đo thật trong Go: thu CPU profile 3 giây từ service live, pprof chỉ đúng hàm nóng 100% CPU.

Cơ sở dữ liệu 22/09/2026 6 phút

Ép kiểu ngầm định làm mất index trong PostgreSQL: hàm ẩn quanh cột

So sánh cột với sai kiểu dữ liệu khiến PostgreSQL chèn ép kiểu — và nếu nó ép vế cột, index chết. Đo thật: int8 so với numeric literal chạy Seq Scan 55 ms so với 0,04 ms; hướng ép quyết định tất cả. Cách đọc EXPLAIN để phát hiện và cách sửa. PostgreSQL 16.

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

CSRF: vì sao cookie xác thực không đủ, và token chặn request giả mạo từ site khác

Trình duyệt tự động đính kèm cookie cho mọi request tới một domain — kể cả request do một trang độc khác kích hoạt. Đó là gốc rễ của CSRF: nếu server chỉ dựa vào cookie, kẻ tấn công khiến trình duyệt nạn nhân tự gửi request hợp lệ. Bài này tái hiện thật trong Go: một bank chỉ dựa cookie bị chuyển tiền (số dư 1000→900) từ request cross-site; thêm CSRF token, cùng request đó bị chặn (403, số dư không đổi). Cookie xác thực AI gửi; token xác thực request đến TỪ ĐÂU.

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.

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

Delivery semantics trong Kafka: at-most-once, at-least-once, exactly-once — và vì sao acks=0 lại chậm hơn

Message của bạn có thể bị mất, bị trùng, hoặc được ghi đúng một lần — ba kịch bản này do acks và idempotence quyết định. Bài này giải thích cơ chế từng mức rồi đo thật throughput theo acks trên lab, kèm hai phát hiện trung thực: trên single-node acks=all gần như acks=1 về độ bền, và acks=0 (gửi rồi quên) lại CHẬM hơn acks=1 — ngược hẳn trực giác. Idempotent producer thì gần như miễn phí.

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

Hiệu năng streaming gRPC: vì sao một stream nhanh gấp 61 lần 50.000 unary call, và flow control giữ cho khỏi tràn

Khi cần gửi nhiều message, chọn một stream hay nhiều unary call tạo ra khác biệt khổng lồ. Bài này đo thật trong go-lab: gửi 50.000 message qua 50.000 unary call riêng lẻ mất 2,06 giây (24k msg/s), còn qua một server-stream chỉ 33,6 mili-giây (1,49 triệu msg/s) — nhanh gấp 61 lần. Giải thích vì sao per-call overhead giết hiệu năng, và HTTP/2 flow control điều tiết backpressure thế nào để stream không làm tràn bộ nhớ.