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.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 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ũ

Last updated