Serialization
Serialization là gì?

Serialization là quá trình chuyển đổi một object hoặc cấu trúc dữ liệu trong bộ nhớ thành một định dạng có thể lưu trữ hoặc truyền tải (ví dụ: byte stream, JSON, XML).
Deserialization là quá trình ngược lại, chuyển đổi dữ liệu đã được serialized trở lại thành object ban đầu.
Trong Kafka, dữ liệu (message) được truyền đi dưới dạng byte arrays (byte[]), do đó, Serialization/Deserialization (SerDe) là một phần quan trọng để đảm bảo dữ liệu được xử lý chính xác giữa Producer và Consumer.
Tại sao cần Serialization trong Kafka?
Kafka lưu trữ và truyền tải dữ liệu dưới dạng bytes.
Các ứng dụng thường làm việc với các object (String, JSON, Avro, Protobuf, ...), nên cần chuyển đổi qua lại giữa object và byte stream.
Serialization không chỉ ảnh hưởng đến hiệu suất truyền tải dữ liệu mà còn tác động trực tiếp đến hiệu quả lưu trữ trong Kafka.
Producer cần serialize dữ liệu trước khi gửi vào Kafka.
Consumer cần deserialize dữ liệu nhận được từ Kafka để sử dụng.
Serialization và Compression
Dưới đây là bảng so sánh chi tiết giữa hai khái niệm này trong bối cảnh Kafka:
| Tiêu Chí | Serialization | Compression |
| Mục Đích | Chuyển đổi object → byte[] để Kafka hiểu | Giảm kích thước dữ liệu để tiết kiệm băng thông/lưu trữ |
| Khi Nào Dùng | Bắt buộc với mọi message | Tuỳ chọn (khi cần tối ưu) |
| Ví Dụ | JSON → byte[], Avro → byte[] | Gzip, Snappy, Zstd nén byte[] |
| Vị Trí Xử Lý | Ứng dụng/Kafka client | Có thể ở client hoặc broker |
| Ảnh Hưởng CPU | Trung bình (tuỳ format) | Cao (đặc biệt với Gzip/Zstd) |
| Kết Quả | Dữ liệu Kafka-ready | Dữ liệu đã serialized + nhỏ hơn |
Format Serialization
| Format | Đặc Điểm | Ưu Điểm | Nhược Điểm | Kích Thước VD ({"id":1}) | Tốc Độ | Phù Hợp |
| String | Plain text UTF-8 | Đơn giản, human-readable | Không có schema, kém hiệu quả | ~8-10 bytes | Nhanh | Logs, text message |
| JSON | Text-based schema-less | Linh hoạt, hỗ trợ đa ngôn ngữ | Kích thước lớn, không type-safe | ~15-20 bytes | Trung bình | REST APIs, web apps |
| Avro | Binary + Schema | Schema evolution, compact size | Cần Schema Registry | ~6-8 bytes | Nhanh | Data pipelines, Hadoop |
| Protobuf | Binary + Schema | Hiệu suất cao, versioning | Cần compile .proto | ~5-7 bytes | Rất nhanh | gRPC, microservices |
| Thrift | Binary + Schema | Đa ngôn ngữ | Phức tạp triển khai | ~7-9 bytes | Nhanh | Cross-service |
| MessagePack | Binary JSON | Nhỏ hơn JSON | Không có schema | ~10-12 bytes | Nhanh | Mobile apps |
| Kryo | Java binary | Tốc độ cực cao | Khó versioning | ~4-5 bytes | Rất nhanh | High-performance Java |
| XML | Text markup | Human-readable | Cồng kềnh, chậm | ~30-40 bytes | Chậm | Legacy systems |
Configuration
Cấu hình
key.serializervàvalue.serializerở ProducerCấu hình
key.deserializervàvalue.deserializerở ProducerDeserializer phải tương thích với Serializier.
Trường hợp 1: Tương thích
// Producer (Serializer)
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
// Consumer (Deserializer)
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
✅ Hoạt động tốt vì cùng sử dụng UTF-8 để chuyển đổi String ↔ byte[]
Trường hợp 2: Không tương thích
// Producer: Dùng JSON
props.put("value.serializer", "org.springframework.kafka.support.serializer.JsonSerializer");
// Consumer: Lại dùng String
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
❌ Lỗi runtime vì:
Producer gửi JSON bytes (ví dụ:
{"id":1})Consumer cố đọc như UTF-8 String → Kết quả bị sai
Tiêu Chí Chọn Format
Hiệu Suất (Performance)
Kích Thước Dữ Liệu (Data Size)
Khả Năng Mở Rộng (Schema Evolution)
Khả Năng Debug (Human Readability)
Hệ Sinh Thái (Ecosystem Support)
Bảo Mật (Security)
Tiêu Chí Lựa Chọn Theo Use Case
| Use Case | Format Khuyên Dùng | Lý Do |
| IoT Devices | Protobuf/MessagePack | Nhỏ gọn, hiệu suất cao |
| Data Pipelines | Avro | Schema evolution + Hadoop |
| Microservices | Protobuf | Kết hợp tốt với gRPC |
| Web APIs | JSON | Dễ debug + JavaScript |
| High-frequency Trading | Protobuf/Kryo | Ultra-low latency |
| Legacy Systems | XML/CSV | Tương thích hệ thống cũ |