0

Apache Avro là gì? Định dạng dữ liệu tối thượng cho Hệ thống Phân tán và Kafka

Khi xây dựng các hệ thống xử lý dữ liệu lớn (Big Data) hoặc kiến trúc hướng sự kiện (Event-Driven Architecture) với Kafka, việc trao đổi dữ liệu bằng JSON thông thường sẽ bộc lộ điểm yếu chí mạng về hiệu năng và băng thông [cite: x]. Đó là lúc Apache Avro xuất hiện như một giải pháp cứu cánh [cite: x].

Dưới đây là bức tranh toàn cảnh về Apache Avro, cơ chế hoạt động và lý do tại sao nó là tiêu chuẩn vàng trong các luồng truyền tải dữ liệu tốc độ cao [cite: x].


1. Apache Avro là gì?

Apache Avro là một hệ thống tuần tự hóa dữ liệu (Data Serialization System) được phát triển dưới sự bảo trợ của Apache Software Foundation [cite: x]. Nhiệm vụ chính của nó là chuyển đổi các cấu trúc dữ liệu phức tạp (Object, Array, Record) trong ứng dụng thành một định dạng nhị phân (Binary) nhỏ gọn để truyền qua mạng hoặc lưu trữ xuống đĩa cứng, sau đó có thể phục hồi lại (Deserialize) một cách nguyên vẹn [cite: x].

Điểm khác biệt cốt lõi của Avro so với JSON hay XML là nó hoạt động dựa trên Schema (lược đồ) [cite: x].


2. Cơ chế hoạt động: Sự kết hợp giữa JSON và Binary

Avro sử dụng hai định dạng để hoàn thành công việc của mình [cite: x]:

  • Định nghĩa cấu trúc (Schema) bằng JSON: Bạn sử dụng cú pháp JSON dễ đọc để khai báo cấu trúc dữ liệu (tên trường, kiểu dữ liệu là string, int, hay boolean...) [cite: x].
  • Lưu trữ dữ liệu bằng Nhị phân (Binary): Khi dữ liệu thực tế được sinh ra, Avro sẽ nén nó thành một chuỗi nhị phân cực kỳ nhỏ gọn [cite: x]. Nó không lưu trữ tên trường (keys) vào trong dữ liệu thực tế như JSON, mà chỉ lưu các giá trị (values) [cite: x].

Ví dụ một Schema Avro cơ bản:

{
  "type": "record",
  "namespace": "com.example",
  "name": "User",
  "fields": [
    {"name": "id", "type": "int"},
    {"name": "username", "type": "string"},
    {"name": "email", "type": ["null", "string"], "default": null}
  ]
}

3. Tại sao Avro lại vượt trội hơn JSON?

A. Kích thước siêu nhỏ gọn (Compact Size)

Trong JSON, mỗi tin nhắn đều phải chứa cả tên key và value (vd: {"id": 101, "username": "admin"}) [cite: x]. Nếu bạn gửi 1 triệu tin nhắn, bạn đang gửi đi gửi lại chữ "id" và "username" 1 triệu lần [cite: x].

Với Avro, nhờ có Schema lưu riêng, payload gửi qua mạng chỉ chứa các bit nhị phân đại diện cho 101admin [cite: x]. Điều này giúp giảm từ 60% đến 80% kích thước gói tin, tiết kiệm băng thông và dung lượng đĩa khổng lồ [cite: x].

B. Tốc độ mã hóa/giải mã (Serialization/Deserialization) cực nhanh

Vì dữ liệu là dạng nhị phân thô, CPU không phải tốn thời gian phân tích cú pháp (parsing) các chuỗi ký tự ngoặc nhọn {}, dấu phẩy hay dấu ngoặc kép như khi đọc JSON [cite: x]. Tốc độ đọc/ghi của Avro nhanh hơn gấp nhiều lần [cite: x].

C. Tính năng Schema Evolution (Tiến hóa cấu trúc dữ liệu)

Đây là "vũ khí tối thượng" của Avro [cite: x]. Trong vòng đời dự án, database của bạn sẽ luôn thay đổi (thêm cột mới, xóa cột cũ) [cite: x]. Avro hỗ trợ Schema Evolution, cho phép bạn thay đổi Schema mà không làm hỏng các ứng dụng cũ đang đọc dữ liệu [cite: x]:

  • Backward Compatibility (Tương thích ngược): Code mới có thể đọc được dữ liệu cũ [cite: x].
  • Forward Compatibility (Tương thích xuôi): Code cũ vẫn có thể đọc được dữ liệu mới sinh ra [cite: x].

4. Avro và Apache Kafka: "Cặp bài trùng" không thể tách rời

Khi bạn dùng Kafka để xử lý hàng triệu message mỗi giây (ví dụ: Debezium CDC Payload như đã nhắc ở bài trước), dùng JSON sẽ làm Kafka bị thắt cổ chai về băng thông (Network IO) [cite: x].

Để giải quyết bài toán này, kiến trúc chuẩn mực thường kết hợp Avro với Confluent Schema Registry [cite: x]:

  1. Producer (Nguồn phát): Trước khi gửi tin nhắn vào Kafka, nó sẽ gửi JSON Schema lên Schema Registry để lưu trữ, nhận lại một Schema ID [cite: x]. Sau đó, nó nén dữ liệu thành Avro nhị phân, đính kèm Schema ID và ném vào Kafka [cite: x].
  2. Kafka Broker: Chỉ đóng vai trò vận chuyển các gói tin nhị phân siêu nhỏ, hoạt động cực kỳ nhẹ nhàng [cite: x].
  3. Consumer (Nguồn nhận): Nhận gói tin nhị phân từ Kafka, đọc Schema ID, lên Schema Registry tải Schema tương ứng về, và giải mã (Deserialize) lại thành dữ liệu gốc để xử lý [cite: x].

Tổng kết

Apache Avro không phải là công cụ dành cho việc con người đọc trực tiếp (như JSON dùng cho REST API) [cite: x]. Nó là chuẩn mực dành cho giao tiếp giữa máy với máy (Machine-to-Machine) trong các hệ thống Big Data, Microservices và Event-Driven [cite: x].

Việc làm chủ Avro và Schema Registry là bước tiến bắt buộc để xây dựng một hệ thống xử lý luồng dữ liệu thời gian thực có khả năng mở rộng (scalable) và bền vững (resilient) [cite: x].


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.