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

Retention và log compaction trong Kafka: xoá theo tuổi hay giữ bản mới nhất mỗi key

Kafka giữ log nhưng không giữ mãi — cleanup.policy quyết định số phận dữ liệu. Bài này đo thật log compaction trong lab: một topic nhận 8 message cho 3 key, sau compaction chỉ còn value mới nhất mỗi key (user-A từ 4 bản 100/120/200/180 còn đúng 180), và offset được giữ nguyên không đánh số lại. Giải thích retention theo thời gian/dung lượng, vì sao broker quét định kỳ, và khi nào compaction biến topic thành một bảng key-value.

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

Replication và ISR trong Kafka: cách không mất dữ liệu khi broker chết, và vì sao single-node không demo nổi

Độ bền của Kafka đến từ replication — mỗi partition có nhiều bản sao trên nhiều broker, với ISR là tập bản sao đang theo kịp. Bài này đo thật trên lab single-node và dùng chính các giới hạn làm bằng chứng: RF=1 chỉ có một bản sao, thử RF=2 báo lỗi vì chỉ một broker, và một phát hiện trung thực về min.insync.replicas mà single-node không tái hiện nổi. Hiểu RF, ISR, min.insync.replicas và acks=all để cấu hình độ bền đúng trên cluster thật.

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

Serialization và tiến hoá schema trong Kafka: vì sao Avro nhỏ hơn JSON 2,4 lần và không làm vỡ consumer

Kafka chỉ chuyển byte — cách bạn mã hoá message quyết định băng thông, dung lượng và cả khả năng nâng cấp hệ thống. Bài này đo thật trong go-lab: cùng một bản ghi, JSON 88 byte, gob 115 byte, Avro chỉ 36 byte. Rồi chứng minh schema evolution bằng Avro resolution: thêm field có default đọc được dữ liệu cũ (channel lấy web), nhưng đổi kiểu double sang string bị từ chối ngay. Hiểu vì sao Schema Registry là bắt buộc khi nhiều team dùng chung topic.

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

Outbox pattern: ghi database và gửi Kafka mà không bao giờ lệch nhau, và vì sao dual-write là cái bẫy

Ghi đơn hàng vào database rồi gửi sự kiện lên Kafka nghe đơn giản, nhưng đó là hai thao tác trên hai hệ thống không có transaction chung — crash ở giữa làm chúng lệch nhau. Bài này đo thật trong pg-lab: outbox pattern ghi cả thay đổi nghiệp vụ lẫn sự kiện trong MỘT transaction (rollback thì cả hai biến mất), rồi relay đẩy 3 dòng outbox thành đúng 3 message trong Kafka. Hiểu vì sao dual-write luôn có khe hở mất đồng bộ.

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

Tổng kết sê-ri Kafka: khi nào nên dùng, khi nào đừng, và checklist vận hành đúc kết từ 11 bài đo thật

Mười một bài, hàng chục phép đo thật trên lab — giờ gộp lại thành thứ dùng được. Bài tổng kết này so Kafka với RabbitMQ và hàng đợi trên database để biết khi nào Kafka là đúng công cụ (và khi nào nó chỉ thêm gánh nặng), một cây quyết định có nên dùng Kafka không, và một checklist vận hành production ánh xạ về từng bài: partition, replication, acks, offset, lag, retention, compaction, schema, outbox.

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

gRPC cho backend từ con số 0: gọi hàm từ xa như hàm nội bộ, và Protobuf nhỏ hơn JSON 2 lần

gRPC không phải REST nhanh hơn — nó là một mô hình khác: định nghĩa dịch vụ trong .proto, protoc sinh code type-safe cho cả server lẫn client, chạy trên HTTP/2 với payload nhị phân Protobuf. Bài mở màn sê-ri dựng server+client gRPC thật bằng Go trong Docker, gọi một unary RPC, và đo thật: cùng message Order, Protobuf 41 byte so với JSON 88 byte, 1000 call hết 42ms (~23.800 call/giây localhost).