# Kafka Introduction

***

## Giới thiệu <a href="#heading-gioi-thieu" id="heading-gioi-thieu"></a>

Apache Kafka is a distributed event streaming platform. Kafka được thiết kế để xử lý và truyền dữ liệu quy mô lớn theo thời gian thực. Không chỉ đơn thuần là một hệ thống trung gian truyền messages, Kafka cung cấp một framework mạnh mẽ cho event streaming, cho phép thu thập, lưu trữ và xử lý dữ liệu hiệu quả trên các hệ thống phân tán.

Kafka được phát triển bởi LinkedIn vào năm 2010 và sau đó trở thành một dự án mã nguồn mở dưới sự quản lý của Apache Software Foundation vào năm 2011.

Kafka có thể hoạt động như một message broker thông thường và có các tính chất vượt trội hơn như:

* high-throughput data streaming: Kafka được tối ưu hóa để xử lý hàng triệu thông điệp mỗi giây, rất phù hợp cho các ứng dụng cần thu thập và phân tích dữ liệu lớn ngay lập tức.
* long-term data retention: Khác với các hệ thống trung gian thông thường xóa thông điệp sau khi gửi, Kafka lưu giữ dữ liệu trong các bản ghi (log) trong một khoảng thời gian có thể tùy chỉnh (vài ngày, vài tuần hoặc thậm chí vô thời hạn), cho phép người dùng truy xuất hoặc xử lý lại dữ liệu khi cần.

## Response và Event <a href="#heading-response-va-event" id="heading-response-va-event"></a>

Trước khi đi tiếp, chúng ta cần làm rõ hai khái niệm quan trọng trong lĩnh vực xử lý dữ liệu: **response** (phản hồi) và **event** (sự kiện), vì chúng đóng vai trò nền tảng để hiểu cách Kafka hoạt động khác biệt so với các hệ thống truyền thống.

* **Response (Phản hồi):** Response là dữ liệu được gửi đến một client cụ thể – thường là bên đã đưa ra yêu cầu (request). Nó mang tính chất **đồng bộ** (synchronous), nghĩa là client gửi yêu cầu và chờ đợi phản hồi từ server. Nội dung của response có thể **thay đổi theo thời gian** tùy thuộc vào yêu cầu hoặc trạng thái hệ thống tại thời điểm đó. Ví dụ, khi bạn yêu cầu thông tin đơn hàng từ một API, server trả về dữ liệu đơn hàng hiện tại – đó là response. Mô hình này thường là "one-to-one", tập trung vào giao tiếp trực tiếp giữa hai bên.
* **Event (Sự kiện):** Ngược lại, event là một **sự việc đã xảy ra** – một thực tế kinh doanh (business fact) cố định và **không thể thay đổi** (immutable). Ví dụ, "đơn hàng #123 được tạo" là một sự kiện, và nó có giá trị đối với nhiều dịch vụ khác nhau (như hệ thống kho, thanh toán, hoặc phân tích). Event hoạt động theo kiểu **bất đồng bộ** (asynchronous): nó được ghi nhận và phát tán (thường qua các topic trong Kafka) mà không cần biết trước ai sẽ xử lý hoặc khi nào. Điều này tạo ra mô hình "one-to-many", nơi nhiều consumers có thể tận dụng cùng một sự kiện theo cách riêng của mình.

| Tiêu chí          | Response                               | Event                                             |
| ----------------- | -------------------------------------- | ------------------------------------------------- |
| Định nghĩa        | Kết quả trả về từ một yêu cầu cụ thể.  | Một sự việc xảy ra, được ghi nhận và phát tán.    |
| Tính chất         | Đồng bộ (synchronous).                 | Bất đồng bộ (asynchronous).                       |
| Mô hình hoạt động | Request-Response"                      | Event-driven                                      |
| Tính linh hoạt    | Ít linh hoạt, chỉ phục vụ bên yêu cầu. | Linh hoạt, nhiều consumer có thể xử lý khác nhau. |

## **Events and event streaming** <a href="#heading-events-and-event-streaming" id="heading-events-and-event-streaming"></a>

Event là một bản ghi ghi lại một cái gì đó đã xảy ra. Dữ liệu sự kiện mô tả cái gì đã diễn ra, khi nào, và ai có liên quan tới nó.

**Event streaming** là một khái niệm cốt lõi trong Apache Kafka, tập trung vào việc xử lý và truyền tải dữ liệu dưới dạng các sự kiện (events) theo thời gian thực. Để hiểu rõ hơn, chúng ta cần phân biệt các yếu tố chính liên quan đến event streaming.

* **Streaming:** Streaming đề cập đến một **luồng dữ liệu liên tục** (continuous flow of data) được truyền tải và xử lý trong thời gian thực. Trong Kafka, dữ liệu này chính là các sự kiện – những thực tế đã xảy ra, chẳng hạn như "người dùng thêm sản phẩm vào giỏ hàng" hay "thiết bị gửi tín hiệu nhiệt độ".
* **Event Streaming:** Event streaming không chỉ đơn thuần là truyền dữ liệu, mà còn bao gồm cách tổ chức và quản lý các sự kiện trong một hệ thống phân tán. Cụ thể, nó bao gồm:
  * Cách đưa sự kiện vào và ra (How to get events in/out): Producers gửi sự kiện vào các topic của Kafka, trong khi consumers lấy sự kiện từ đó để xử lý. Quá trình này diễn ra bất đồng bộ, không phụ thuộc vào yêu cầu trực tiếp.
  * Cách lưu trữ sự kiện (How to store events): Kafka lưu trữ các sự kiện trong các log phân tán, cho phép giữ dữ liệu trong thời gian dài (có thể tùy chỉnh) thay vì xóa ngay sau khi gửi như các hệ thống trung gian truyền thống.
  * Thứ tự của sự kiện (Ordering of events): Kafka đảm bảo các sự kiện trong cùng một partition của topic được giữ nguyên thứ tự, điều này rất quan trọng cho các ứng dụng cần xử lý dữ liệu theo trình tự thời gian.

## Các API Cốt Lõi của Apache Kafka <a href="#heading-cac-api-cot-loi-cua-apache-kafka" id="heading-cac-api-cot-loi-cua-apache-kafka"></a>

Apache Kafka cung cấp **năm API Java cốt lõi** để hỗ trợ quản lý cụm (cluster) và ứng dụng phía client, giúp xây dựng và quản lý các ứng dụng streaming mạnh mẽ. Các API này cho phép lập trình viên triển khai các thành phần tùy chỉnh, từ việc sản xuất và tiêu thụ dữ liệu, quản lý Kafka brokers và topics, đến xử lý luồng dữ liệu theo thời gian thực. Dưới đây là cái nhìn tổng quan về từng API và cách chúng được sử dụng:

* **Producer API:** API này cho phép ứng dụng gửi dữ liệu (sự kiện) vào các topic trong Kafka. Producer API chịu trách nhiệm đẩy các bản ghi (records) từ nguồn dữ liệu (như ứng dụng, cảm biến, hoặc cơ sở dữ liệu) đến hệ thống Kafka. Nó hỗ trợ các tính năng như gửi dữ liệu bất đồng bộ, đảm bảo độ tin cậy (durable delivery), và phân phối dữ liệu đến các partition cụ thể dựa trên khóa (key).
* **Consumer API:** Consumer API được sử dụng để đọc dữ liệu từ các topic trong Kafka. Nó cho phép ứng dụng đăng ký (subscribe) vào một hoặc nhiều topic và tiêu thụ các sự kiện theo thời gian thực hoặc truy xuất dữ liệu cũ từ log. Consumer có thể hoạt động đơn lẻ hoặc trong một nhóm (consumer group) để phân chia workload và xử lý dữ liệu song song.
* **Admin Client API:** API này cung cấp các công cụ để quản lý và giám sát cụm Kafka. Với Admin Client API, bạn có thể tạo, xóa, hoặc sửa đổi các topic, kiểm tra trạng thái của brokers, và thực hiện các tác vụ quản trị khác. Đây là lựa chọn lý tưởng để tự động hóa việc quản lý Kafka trong các ứng dụng hoặc script.
* **Connect API:** Connect API đơn giản hóa việc tích hợp Kafka với các hệ thống bên ngoài (như cơ sở dữ liệu, hệ thống tệp, hoặc message queue khác). Nó cung cấp một framework để xây dựng các **connectors** – các thành phần có thể nhập dữ liệu vào Kafka (source connectors) hoặc xuất dữ liệu ra ngoài (sink connectors) mà không cần viết nhiều mã phức tạp.
* **Kafka Streams API:** Đây là API dành cho **stream processing**, cho phép xử lý và phân tích dữ liệu trong luồng sự kiện theo thời gian thực. Kafka Streams API cung cấp các công cụ để thực hiện các phép tính như lọc (filtering), nhóm (grouping), hoặc tổng hợp (aggregation) trực tiếp trên dữ liệu từ Kafka topics, mà không cần phụ thuộc vào framework bên ngoài.

## Use cases <a href="#heading-use-cases" id="heading-use-cases"></a>

Apache Kafka không chỉ là một nền tảng event streaming mà còn là một công cụ linh hoạt, được ứng dụng trong nhiều kịch bản khác nhau. Dưới đây là các trường hợp sử dụng phổ biến của Kafka:

* **Message Broker (Mô hình Pub/Sub):** Kafka có thể hoạt động như một message broker theo mô hình **publish/subscribe** (pub/sub). Các producers "xuất bản" (publish) sự kiện vào các topic, trong khi các consumers "đăng ký" (subscribe) để nhận và xử lý chúng. Điều này giúp tách biệt các hệ thống, cho phép giao tiếp bất đồng bộ và đáng tin cậy giữa các ứng dụng.
* **Stream Processing:** Với Kafka Streams API hoặc tích hợp với các công cụ như Apache Flink, Kafka hỗ trợ xử lý luồng dữ liệu theo thời gian thực. Ví dụ, một hệ thống có thể sử dụng Kafka để phân tích hành vi người dùng, tính toán KPI, hoặc phát hiện gian lận ngay khi dữ liệu được gửi đến.
* **Log Aggregation:** Kafka thu thập và tổng hợp log từ nhiều nguồn (như server, ứng dụng, hoặc thiết bị) vào một nơi tập trung. Nhờ khả năng lưu trữ lâu dài và xử lý dữ liệu quy mô lớn, Kafka rất phù hợp để phân tích log, giám sát hệ thống, hoặc tạo báo cáo.
* **Log Shipping:** Kafka cho phép chuyển log hoặc dữ liệu sự kiện từ một hệ thống này sang hệ thống khác một cách hiệu quả. Ví dụ, dữ liệu log từ ứng dụng có thể được gửi qua Kafka đến các hệ thống lưu trữ như Elasticsearch hoặc Hadoop để phân tích sâu hơn.
* **Event-Driven Architecture (EDA):** Kafka là nền tảng lý tưởng cho kiến trúc hướng sự kiện (EDA), nơi các hệ thống phản ứng với các sự kiện thay vì chờ lệnh trực tiếp. Ví dụ, trong một ứng dụng thương mại điện tử, sự kiện "đơn hàng được đặt" có thể kích hoạt các hành động như kiểm tra kho, xử lý thanh toán, và gửi thông báo – tất cả đều hoạt động độc lập qua Kafka.
