Skip to content

Text/JSON vs Binary trong Kafka

Trong các hệ thống microservices hiện đại, Kafka đóng vai trò trung tâm trong việc truyền tải sự kiện, đồng bộ dữ liệu, và xử lý bất đồng bộ (async workflow).
Một trong những quyết định quan trọng khi thiết kế kiến trúc streaming là chọn định dạng message: dùng Text/JSONhay Binary (Avro/Protobuf/MessagePack/byte array)?

Bài viết này phân tích sâu mục đích, ưu – nhược điểm của từng loại, và gợi ý cách chọn phù hợp cho từng loại hệ thống.

1. Message Text/JSON – Khi nào và tại sao nên dùng?

Message dạng text hoặc JSON là lựa chọn phổ biến nhất hiện nay trong microservices, không chỉ vì dễ đọc mà còn vì độ linh hoạt cao.

Mục đích chính

  • Dễ debug
  • Dễ tích hợp với nhiều công nghệ
  • Không cần schema registry
  • Dễ dàng mở rộng và thay đổi payload

 Ưu điểm

1) Human-readable

Bạn có thể mở log Kafka, copy JSON event ra và hiểu ngay nội dung.
Điều này đặc biệt hữu ích cho team vận hành, QA và developer mới.

2) Linh hoạt, thay đổi dễ dàng

Không cần build lại toàn bộ hệ thống nếu payload thay đổi.

Ví dụ: thêm "source" hoặc "metadata" vào event → service khác vẫn có thể bỏ qua nếu không cần.

3) Tương thích tốt giữa nhiều ngôn ngữ

JSON là “ngôn ngữ chung” của hệ thống phân tán.
Python, Java, Go, Node.js… đều hỗ trợ native.

4) Dễ test & replay

Bạn chỉ cần một file .json là có thể replay event vào Kafka.

Nhược điểm

1) Tốn dung lượng hơn

Vì là text nên JSON thường lớn hơn 30–60% so với binary.

2) Parse chậm hơn

Mất thêm CPU khi convert từ text → object.

3) Không có schema strict

Dễ bị lỗi kiểu dữ liệu: string, number, null không đúng format.

4) Không phù hợp high-throughput rất lớn

Khi hệ thống đẩy hàng trăm nghìn message/giây, JSON bắt đầu trở nên đắt đỏ.

2. Message Binary – Tại sao nhiều hệ thống lớn dùng Avro/Protobuf?

Binary serialization như Protobuf, Avro, Thrift, MessagePack nhắm đến hiệu năng và tính nhất quán dữ liệu.

Mục đích chính

  • Giảm kích thước event
  • Tăng tốc độ serialize/deserialize
  • Bắt lỗi dữ liệu từ sớm (schema validation)
  • Tối ưu hệ thống throughput rất lớn

Ưu điểm

1) Hiệu năng vượt trội

Binary format nhanh hơn JSON từ 2–10 lần tuỳ use-case.

2) Payload nhỏ hơn đáng kể

  • JSON: { "id": "12345", "status": "OK" } → ~40 bytes
  • Protobuf: chỉ khoảng ~12 bytes

Giảm cost cho:

  • Kafka disk (log retention)
  • Network bandwidth
  • Consumer throughput

3) Schema strict & versioning mạnh mẽ

Protobuf / Avro hỗ trợ:

  • Backward compatibility
  • Forward compatibility
  • Kiểm tra kiểu từ producer → tránh event rác

4) Phù hợp high-volume real-time

Những hệ thống đẩy hàng trăm nghìn message/giây như:

  • Payment real-time
  • Market data feed
  • Fraud detection
  • IoT stream ingest
  • Logs/metrics pipeline

… gần như đều dùng binary.

Nhược điểm

1) Không đọc trực tiếp được

Message hiển thị dạng byte → khó debug nếu không decode.

2) Yêu cầu thêm tooling

  • Schema Registry
  • Plugin build (Avro plugin, Protobuf compiler)
  • Tool decode binary

3) Tích hợp khó hơn JSON

Các ngôn ngữ cần lib tương ứng.

4) Tăng độ phức tạp vận hành

Team mới sẽ gặp khó khăn trong troubleshooting.

3. Bảng so sánh tổng hợp Text/JSON vs Binary

Tiêu chíJSONBinary (Protobuf/Avro)
Khả năng đọc (debug)⭐⭐⭐⭐⭐
Hiệu năng⭐⭐⭐⭐⭐⭐⭐
Kích thước messageLớnNhỏ
Linh hoạt thay đổiRất linh hoạtPhụ thuộc schema
Dễ tích hợp hệ thống⭐⭐⭐⭐⭐⭐⭐
Yêu cầu schema registryKhông
Độ phức tạpThấpCao
Phù hợp choMicroservices thông thườngHigh-throughput systems

4. Khi nào nên chọn JSON?

JSON phù hợp khi:

  • Payload phức tạp và thay đổi thường xuyên
  • Đội ngũ cần xem log dễ dàng
  • Tốc độ không quá lớn (< 50K msg/s)
  • Hệ thống phong phú ngôn ngữ (Java, Node.js, Go…)

Use-case điển hình:

  • Notification service (email, push, SMS)
  • User activity tracking
  • Order events của business
  • Audit logs
  • Workflow orchestration

5. Khi nào nên chọn Binary?

Nên dùng binary khi:

  • Cần hiệu năng cao
  • Cần schema strict
  • Dữ liệu lớn, event nhiều
  • Throughput cực cao
  • Chi phí Kafka quan trọng

Use-case điển hình:

  • Payment processing event
  • Banking transaction pipeline
  • Market tick data
  • Fraud detection (real-time ML features)
  • Ad clickstream
  • IoT device event stream

6. Lời khuyên thực chiến: Định dạng nào cho hệ thống Notification Retry?

Trong hệ thống notification gồm:

  • Producer gửi event async
  • Consumer xử lý → retry scheduler nếu failed

👉 JSON gần như là lựa chọn tốt nhất, vì:

  • Payload linh hoạt (SMS/email/push template khác nhau)
  • Dễ debug khi xử lý lỗi
  • Dễ phân tích log retry
  • Không cần schema cứng

Bạn chỉ nên dùng Binary nếu:

  • Notification volume > 100k msg/s
  • Nội dung tương đối chuẩn hoá (template-based)
  • Hệ thống đa phần nằm trong nhà (internal microservices)

Kết luận

Không có lựa chọn “tốt nhất cho mọi trường hợp”.
Bạn nên chọn dựa trên đặc tính hệ thốngmục tiêu vận hành, và độ phức tạp chấp nhận được.

✔ JSON = dễ dùng, linh hoạt, debug đơn giản

✔ Binary = hiệu năng, tối ưu, quy mô lớn

Nếu system của bạn ưu tiên tốc độ phát triển & dễ bảo trì → JSON
Nếu system của bạn ưu tiên performance & throughput → Binary

Published inKafka

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *