0

Bài 7: Kafka Ecosystem — Đứng trên vai người khổng lồ

Thay vì tự cặm cụi viết code xử lý từng luồng dữ liệu, Kafka cung cấp sẵn các bộ công cụ chuyên dụng để giải quyết những bài toán kinh điển trong kiến trúc Backend.

1. Kafka Connect: "Vận chuyển" dữ liệu không cần viết code

Vấn đề: Giả sử trong một hệ thống thương mại điện tử, bạn cần đồng bộ liên tục dữ liệu từ Database chính (MySQL) sang hệ thống tìm kiếm (Elasticsearch) để người dùng search sản phẩm cho nhanh.

Nếu dùng cách cũ, bạn phải tự viết một ứng dụng Consumer:

  1. Đọc dữ liệu từ Kafka.
  2. Viết code chuyển đổi định dạng (Transform).
  3. Viết code chèn vào Elasticsearch.
  4. Xử lý lỗi rớt mạng, retry, lưu log...

Giải pháp với Kafka Connect:

Kafka Connect là một công cụ giúp bạn kết nối Kafka với các hệ thống bên ngoài chỉ bằng file cấu hình (JSON) mà không cần viết một dòng code logic nào. Nó chia làm 2 loại:

  • Source Connector (Đưa dữ liệu VÀO Kafka): Ví dụ nổi tiếng nhất là Debezium. Nó ngầm theo dõi Database (CDC - Change Data Capture). Mỗi khi có một dòng dữ liệu INSERT/UPDATE/DELETE trong MySQL, Debezium tự động biến nó thành một Message và bắn thẳng vào Kafka theo thời gian thực (Real-time).
  • Sink Connector (Lấy dữ liệu TỪ Kafka ra ngoài): Tự động hút dữ liệu từ Topic và ghi thẳng vào Elasticsearch, MongoDB, hay các hệ thống Data Warehouse.

Ưu điểm: Khả năng chịu lỗi có sẵn, tự động scale. Bạn chỉ tập trung vào việc thiết kế kiến trúc thay vì ngồi code ba cái hàm kết nối DB

2. Kafka Streams: Xử lý dữ liệu "Trạng thái" (Stateful) thời gian thực

Vấn đề: Nếu Consumer bình thường chỉ xử lý từng tin nhắn rời rạc (Stateless), thì điều gì xảy ra nếu bạn có những bài toán cần "nhớ" lại quá khứ?

Ví dụ, trong hệ thống quản lý thu phí tự động (AFC) hoặc ga tàu điện, bạn có một luồng sự kiện quẹt thẻ. Bài toán đặt ra là:

  1. TÍnh tổng số khách đi qua một cổng cụ thể trong vòng 5 phút vừa qua.
  2. Ghép nối (Join) sự kiện "Khách quẹt thẻ vào ga A" với sự kiện "Khách quẹt thẻ ra ga B" để tự động tính tiền vé.

Nếu tự viết Consumer, bạn sẽ phải tự dựng một Database tạm (như Redis) để lưu giữ trạng thái, tự quản lý thời gian (Windowing), và đối mặt với hàng tá rắc rối nếu server bị sập giữa chừng.

Giải pháp với Kafka Streams: Kafka Streams là một thư viện mạnh mẽ cho phép bạn xử lý dữ liệu phức tạp ngay trên luồng (Stream Processing) với tốc độ mili-giây.

  • Stateful Processing: Nó hỗ trợ sẵn việc lưu trữ trạng thái. Bạn có thể dễ dàng thực hiện các phép toán Gom nhóm (Aggregations), Đếm (Counting), hoặc Ghép nối (Joins) nhiều stream với nhau.
  • Windowing: Chia cắt dòng thời gian thành các khung cửa sổ (ví dụ: mỗi 5 phút, 10 phút) để thống kê chính xác theo thời gian thực.
  • Local State Store: Nó ngầm sử dụng cơ sở dữ liệu siêu tốc (RocksDB) nhúng trực tiếp vào ứng dụng để lưu trạng thái, giúp truy xuất cực nhanh và tự động phục hồi nếu ứng dụng rớt mạng.

Tóm tắt sự khác biệt

Tiêu chí Producer / Consumer tiêu chuẩn Kafka Connect Kafka Streams
Mục đích chính Tự do lập trình logic nghiệp vụ (Gửi email, trigger API...) Chuyển dữ liệu giữa Kafka và các Datastore (DB, Elasticsearch) Xử lý, biến đổi, thống kê dữ liệu phức tạp (Join, Filter, Map)
Cách dùng Tự viết code 100% Chỉ cần viết file cấu hình JSON Dùng thư viện Kafka Streams (viết code nghiệp vụ)
Quản lý trạng thái Không hỗ trợ sẵn (Stateless) Không áp dụng Hỗ trợ mạnh mẽ (Stateful, Windowing)

Đến đây, bạn đã có trong tay bộ vũ khí hoàn chỉnh để xây dựng một kiến trúc Event-Driven thực thụ.

Tuy nhiên, khi làm việc với hệ thống yêu cầu độ tin cậy tuyệt đối, làm sao để chắc chắn Consumer sẽ luôn xử lý thành công, hay làm sao quản lý cấu trúc tin nhắn không bị thay đổi lộn xộn giữa các nhóm phát triển?

Bạn có muốn bước sang Bài 8: Thiết kế Schema Registry và Xử lý lỗi (Dead Letter Queue) để học cách xây dựng hệ thống "bất bại" trong thực tế không?


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí