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
Hệ thống 22/09/2026 6 phút

Latency và percentile p99: vì sao "trung bình 0.1ms" vẫn có khách phải chờ 6ms

Báo cáo 'latency trung bình 0.133ms' nghe tuyệt — nhưng nó nói dối về trải nghiệm thật. Bài này đo thật 100.000 thao tác: p50 chỉ 0.003ms, mà p99 lên tới 6.121ms — mean giấu đuôi 46 lần, và 98% request thực ra nhanh hơn cả con số trung bình. Cách tính p50/p95/p99 bằng sort + nearest-rank, và vì sao SLO phải dùng percentile chứ không phải mean.

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

Quicksort, mergesort hay sort.Ints? Đo thật bốn cách sắp xếp và ba điều bất ngờ

O(n²) chậm hơn O(n log n) — ai cũng biết. Nhưng đo thật trong go-lab cho thấy nhiều thứ sách không nói: insertion sort O(n²) lại NHANH HƠN quicksort tự viết ở N=1.000; quicksort tự viết thua mergesort vì cấp phát bộ nhớ; và sort.Ints của thư viện chuẩn (introsort) đánh bại mọi bản tự viết. Cài đặt quan trọng ngang độ phức tạp.

Công cụ 22/09/2026 6 phút

git bisect: tìm commit gây lỗi trong 5 lần thay vì 30 — và cách để máy tự làm

Một tính năng vừa hỏng mà bạn không biết commit nào gây ra, giữa hàng trăm commit. Dò tuần tự là ác mộng. git bisect tìm nhị phân: mỗi lần chia đôi số commit khả nghi. Bài này đo thật trên 31 commit — bisect tìm ra thủ phạm chỉ sau 5 lần kiểm thử, và git bisect run để máy tự chạy hết bằng một script.

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

Pub/Sub và Streams trong Redis: hai cách nhắn tin dễ nhầm, khác nhau căn bản ở chỗ giữ hay vứt message

Redis có hai cơ chế nhắn tin trông giống nhau nhưng khác nhau một trời một vực. Pub/Sub là loa phát thanh — ai đang nghe thì nghe, phát trước khi ai subscribe là mất luôn. Streams là sổ ghi bền — lưu lại, đọc lại, phát lại, có consumer group chia việc như Kafka thu nhỏ. Bài này đo thật trong redis-lab: PUBLISH khi không subscriber trả về 0 (mất), XADD rồi XRANGE đọc lại được, và consumer group chia entry cho c1/c2 với XACK theo dõi.

Web 22/09/2026 6 phút

HTTP/1.1 vs HTTP/2: multiplexing nhiều luồng trên một kết nối — đo thật

HTTP/1.1 gửi request tuần tự trên mỗi kết nối, nên response chậm chặn hết phần sau (head-of-line blocking) — trình duyệt phải mở tới 6 kết nối để lách. HTTP/2 chia message thành frame nhị phân, đan xen nhiều luồng trên một kết nối. Bài này đo thật bằng nginx và curl: thương lượng giao thức, log server xác nhận, và multiplexing nhanh hơn khi tải nhiều tài nguyên.