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

MessagePack: JSON nhị phân — nhưng đo thật cho thấy nó không nhỏ như bạn tưởng

MessagePack được quảng cáo là JSON nhị phân gọn hơn. Đúng, nhưng đo thật cho con số khiêm tốn hơn kỳ vọng: cùng một đơn hàng, MessagePack mặc định chỉ nhỏ hơn JSON 1,08 lần, bật compact ints được 1,25 lần — còn xa Protobuf (~2 lần). Lý do lộ ra khi nhìn byte: MessagePack vẫn lưu tên field trong map. Điểm mạnh thật của nó là giải mã nhanh ~2,4 lần JSON và đổi đúng một dòng code.

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

CBOR: người anh em chuẩn hóa của MessagePack, và vì sao IETF cần thêm một định dạng

CBOR (RFC 8949) gần như MessagePack: nhị phân, tự mô tả, cùng ý tưởng byte format. Vậy sao IETF lại chuẩn hóa thêm một định dạng? Bài này đo thật: cùng đơn hàng, CBOR 339 byte nhỏ hơn cả MessagePack 392 và JSON 440, mã hóa nhanh nhất trong ba. Nhưng khác biệt lớn nhất là CBOR có tag ngữ nghĩa và là chuẩn IETF — nền tảng của WebAuthn, COSE, CWT, IoT.

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

Varint và ZigZag: vì sao số -1 tốn 10 byte, và mẹo đưa nó về 1 byte

Varint là kỹ thuật nền tảng khiến Protobuf và CBOR gọn: số nhỏ tốn ít byte. Nhưng nó có một cái bẫy đo được: mọi số ÂM trong varint thuần đều tốn 10 byte, kể cả -1. ZigZag sửa điều đó bằng cách ánh xạ đan xen âm-dương. Bài này đo thật số byte bằng Go: -1 từ 10 byte xuống 1, -1000 từ 10 xuống 2 — và giải thích công thức.

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

Nén + serialize: sự thật bất ngờ khi bạn gzip một JSON và một Protobuf

Protobuf nhỏ hơn JSON ~2 lần — ai cũng biết. Nhưng nếu bạn vốn đã gzip dữ liệu trước khi gửi thì sao? Bài này đo thật 1000 đơn hàng: JSON nén gzip xuống 11,6 lần, Protobuf chỉ 5,1 lần (vì đã gọn, ít phần lặp). Kết quả bất ngờ: JSON+gzip (33KB) không chỉ nhỏ hơn Protobuf thô (188KB) mà còn nhỏ hơn cả Protobuf+gzip — nén xóa gần hết lợi thế kích thước của Protobuf.

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

Schema evolution: thêm field mà không làm sập dịch vụ đang chạy phiên bản cũ

Trong hệ phân tán, code cũ và mới chạy song song lúc triển khai — dữ liệu phải đọc chéo được cả hai chiều. Bài này chạy thật bằng Protobuf: code mới ghi 4 field, code cũ đọc vẫn lấy được 2 field và bỏ qua field lạ không crash; code cũ ghi 2 field, code mới đọc field mới nhận default. Và một cái bẫy đo được: đổi kiểu field làm mất dữ liệu âm thầm. Kèm luật an toàn vs nguy hiểm.

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

Zero-copy serialization: đọc một field trong 0,25 nano giây, không cấp phát

JSON và Protobuf phải giải mã cả bản ghi thành struct trước khi đọc một field — lãng phí khi bạn chỉ cần vài field trong message lớn. Zero-copy (FlatBuffers, Cap'n Proto) đọc thẳng field từ buffer bằng offset, không giải mã, không cấp phát. Bài này đo thật bằng Go: đọc một trường mất 0,25 ns và 0 lần cấp phát, so với 1524 ns và 9 lần khi phải unmarshal cả bản ghi — nhanh hơn khoảng 6000 lần.