0
0
Lập trình
NM

Dữ liệu được lưu trữ trong Kafka: So sánh JSON và Avro

Đăng vào 2 tháng trước

• 3 phút đọc

Giới thiệu

Nếu bạn mới làm quen với Kafka, có thể bạn đã tự hỏi: "Khi một producer gửi một bản ghi, Kafka thực sự lưu trữ gì trên đĩa? Là JSON? Avro? Hex? Bytes?" Bài viết này sẽ giúp bạn hiểu rõ hơn về cách lưu trữ dữ liệu trong Kafka, cùng với những so sánh chi tiết giữa JSON và Avro.

Nguyên tắc cơ bản: Kafka lưu trữ Bytes

Đầu tiên, cần phải làm rõ:

Kafka không biết và cũng không quan tâm đến JSON, Avro, Protobuf, POJOs hay unicorns 🦄. Nó chỉ làm việc với mảng byte (byte[]).

  • Producer gửi: byte[] key, byte[] value
  • Broker ghi vào log: byte[]
  • Consumer đọc: byte[]

Tất cả các định dạng khác (JSON, Avro, Protobuf, String) chỉ là một định dạng tuần tự được xây dựng phía trên.


Tuần tự hóa và Mã hóa

Hai thuật ngữ thường được nhắc đến:

  • Tuần tự hóa = chuyển đổi một đối tượng trong bộ nhớ (như một Java POJO) thành định dạng có thể lưu trữ/truyền tải.
  • Mã hóa = ánh xạ các ký tự thành byte (ví dụ, UTF-8 cho văn bản).

👉 JSON sử dụng cả hai. Avro là tuần tự hóa thuần túy.


Dữ liệu thực sự được lưu trữ như thế nào

Trường hợp 1: JSON trong Kafka

Giả sử có một Java POJO: User{name="Lucky", age=30}

Các bước

  1. Tuần tự hóa thành chuỗi JSON
Copy
{
"name":"Lucky",
"age":30
}
  1. Mã hóa chuỗi bằng UTF-8 → bytes

[0x7B, 0x22, 0x6E, 0x61, ...]

(Dưới dạng hex: 7B 22 6E 61 6D 65 22 3A 22 4C )

  1. Producer gửi mảng byte trên đến Kafka.
  2. Kafka lưu trữ byte thô trong log của nó.

Khi bạn xxd tệp log Kafka, bạn sẽ thấy bản dump hex đó.

👉️ Điểm cần lưu ý

JSON → văn bản → mã hóa UTF-8 → byte → Kafka.
Nó dễ đọc nhưng cồng kềnh và chậm hơn để phân tích.

Trường hợp 2: Avro trong Kafka

Cùng một POJO: User{name="Lucky", age=30}

Các bước

  1. Tuần tự hóa trực tiếp thành định dạng nhị phân Avro

    • Các giá trị trường được mã hóa dưới dạng byte gọn gàng theo schema Avro.
    • Ví dụ đầu ra (đơn giản hóa): [0x08, 0x4C, 0x75, 0x63, 0x6B, 0x79, 0x3C]
  2. Producer gửi mảng byte đến Kafka

  3. Kafka lưu trữ byte thô trong log của nó.

Không có bước “chuỗi” trung gian hoặc mã hóa UTF-8.

👉️ Điểm cần lưu ý

Avro → nhị phân gọn gàng → byte → Kafka.
Nó hiệu quả, dựa trên schema, và nhanh hơn để giải mã.


JSON vs Avro: So sánh từng bước

Bước JSON Avro
Tuần tự hóa POJO → văn bản JSON POJO → nhị phân Avro
Mã hóa Cần UTF-8 (văn bản → byte) Không cần (đã ở dạng nhị phân)
Kích thước Lớn hơn (ví dụ, {"name":"Lucky"}) Nhỏ hơn, gọn gàng
Đọc được Dễ đọc Không dễ đọc
Bắt buộc schema Tùy chọn Chặt chẽ (thông qua schema Avro)

Kết luận

Khi mọi người hỏi “Kafka lưu trữ JSON hay Avro?”, câu trả lời thực sự là:

👉 Không cái nào cả. Kafka lưu trữ byte thô.
👉 JSON/Avro/Protobuf chỉ là hợp đồng giữa producer và consumer.

Vì vậy, lần tới khi bạn thấy một bản dump hex Kafka như:

Copy
7B 22 6E 61 6D 65 22 3A 22 4C 75 63 6B 79 22 7D

…bạn sẽ biết: đó chỉ là dữ liệu của bạn, được mã hóa và tuần tự hóa, đang nằm trong log của Kafka chờ đợi consumer tiếp theo.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào