Serialization
Last updated
Last updated
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.
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.
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
Đặ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
Cấu hình key.serializer
và value.serializer
ở Producer
Cấu hình key.deserializer
và value.deserializer
ở Producer
Deserializer phải tương thích với Serializier.
✅ Hoạt động tốt vì cùng sử dụng UTF-8 để chuyển đổi String ↔ byte[]
❌ 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
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)
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ũ