Skip to main content

Command Palette

Search for a command to run...

Serialization

Published
4 min readView as Markdown

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íSerializationCompression
Mục ĐíchChuyển đổi object → byte[] để Kafka hiểuGiảm kích thước dữ liệu để tiết kiệm băng thông/lưu trữ
Khi Nào DùngBắt buộc với mọi messageTuỳ 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 clientCó thể ở client hoặc broker
Ảnh Hưởng CPUTrung bình (tuỳ format)Cao (đặc biệt với Gzip/Zstd)
Kết QuảDữ liệu Kafka-readyDữ liệu đã serialized + nhỏ hơn

Format Serialization

FormatĐặc ĐiểmƯu ĐiểmNhược ĐiểmKích Thước VD ({"id":1})Tốc ĐộPhù Hợp
StringPlain text UTF-8Đơn giản, human-readableKhông có schema, kém hiệu quả~8-10 bytesNhanhLogs, text message
JSONText-based schema-lessLinh hoạt, hỗ trợ đa ngôn ngữKích thước lớn, không type-safe~15-20 bytesTrung bìnhREST APIs, web apps
AvroBinary + SchemaSchema evolution, compact sizeCần Schema Registry~6-8 bytesNhanhData pipelines, Hadoop
ProtobufBinary + SchemaHiệu suất cao, versioningCần compile .proto~5-7 bytesRất nhanhgRPC, microservices
ThriftBinary + SchemaĐa ngôn ngữPhức tạp triển khai~7-9 bytesNhanhCross-service
MessagePackBinary JSONNhỏ hơn JSONKhông có schema~10-12 bytesNhanhMobile apps
KryoJava binaryTốc độ cực caoKhó versioning~4-5 bytesRất nhanhHigh-performance Java
XMLText markupHuman-readableCồng kềnh, chậm~30-40 bytesChậmLegacy systems

Configuration

  • Cấu hình key.serializervalue.serializer ở Producer

  • Cấu hình key.deserializervalue.deserializerở Producer

  • Deserializer 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 CaseFormat Khuyên DùngLý Do
IoT DevicesProtobuf/MessagePackNhỏ gọn, hiệu suất cao
Data PipelinesAvroSchema evolution + Hadoop
MicroservicesProtobufKết hợp tốt với gRPC
Web APIsJSONDễ debug + JavaScript
High-frequency TradingProtobuf/KryoUltra-low latency
Legacy SystemsXML/CSVTương thích hệ thống cũ