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

Event sourcing trong Go: lưu chuỗi sự kiện thay vì trạng thái, và snapshot cứu tốc độ

Event sourcing lưu chuỗi sự kiện bất biến thay vì trạng thái hiện tại; trạng thái được dựng lại bằng replay. Đo thật trong Go 1.23: dựng lại số dư tài khoản từ chuỗi sự kiện, truy vết lịch sử tại mọi thời điểm, và snapshot làm việc dựng lại nhanh hơn replay đầy đủ khoảng 1443 lần.

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

Dashboard nhanh lúc vắng, chậm giờ cao điểm: tìm nút thắt dưới tải đồng thời

Một truy vấn chạy 25 mili giây khi test một mình lại thành 266 mili giây khi 32 người cùng mở dashboard. Bài này đo thật sự suy giảm theo số client, chẩn đoán bằng wait_event, và một cách sửa bất ngờ: tắt parallel query giúp nhanh 1,7 lần dưới tải cao. PostgreSQL 16.

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

Hàng đợi chạy cục bộ và toàn cục trong Go: vì sao mỗi P có queue riêng 256 slot

Bộ lập lịch Go không dùng một hàng đợi chung. Mỗi P giữ hàng đợi cục bộ lock-free tối đa 256 goroutine, cộng một hàng đợi toàn cục có khoá cho phần tràn. Đo thật bằng schedtrace: local queue không bao giờ vượt 256, global phình tới hàng vạn nhưng không bị bỏ đói. Go 1.23.

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

Allocator ba tầng của Go: mcache, mcentral, mheap và vì sao cấp phát nhỏ không cần khoá

Go cấp phát bộ nhớ qua ba tầng như tcmalloc: mcache mỗi P không khoá, mcentral có khoá, mheap khoá heap. Đo thật: cấp đối tượng nhỏ song song còn nhanh hơn một luồng (mcache per-P), cấp lớn song song chậm gấp 3 vì tranh khoá mheap. Và tiny allocator gộp đối tượng nhỏ. Go 1.23.

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

Protobuf wire format: giải mã từng byte để hiểu vì sao nó gọn và field number là hợp đồng

Bài trước đo được protobuf gọn hơn JSON 63% nhưng chưa nói vì sao. Bài này mổ xẻ từng byte: serialize {id:1001, name:abc, big:7} ra 11 byte rồi giải mã thủ công — 08 là tag field 1, e907 là varint 1001, a001 là tag field 20 tốn 2 byte. Đo thật varint co giãn theo giá trị (id 5 tốn 2 byte, id 10 tỷ tốn 6 byte), và vì sao wire chỉ chứa số field nên đổi tên không phá nhưng đổi field number thì phá.