Kiến trúc Kafka hiện đại: Thành phần, luồng dữ liệu và mô hình vận hành
Kiến trúc Kafka hiện đại không chỉ xoay quanh việc Producer gửi dữ liệu và Consumer nhận dữ liệu. Trong một hệ thống thực tế, Kafka cần tổ chức dữ liệu theo topic, chia nhỏ bằng partition, lưu trữ trên broker, sao chép để chịu lỗi và quản lý trạng thái cluster bằng KRaft.
Bài viết này Bizfly Cloud sẽ giúp bạn hiểu các thành phần chính trong kiến trúc Kafka, cách luồng dữ liệu di chuyển bên trong hệ thống và những điểm cần lưu ý khi vận hành Kafka ở môi trường production.
Kiến trúc Kafka hiện đại là gì?
Kiến trúc Kafka hiện đại là cách Apache Kafka tổ chức các thành phần bên trong để ghi, lưu trữ, sao chép và phân phối dữ liệu dạng sự kiện theo thời gian thực. Nếu bài Kafka là gì giúp người đọc hiểu tổng quan Kafka dùng để làm gì, thì bài viết này đi sâu hơn vào cấu trúc vận hành bên trong Kafka.
Apache Kafka không nên được hiểu đơn giản như một hàng đợi tin nhắn truyền thống. Theo Apache, Kafka là một nền tảng event streaming phân tán, dùng cho data pipeline hiệu năng cao, streaming analytics, data integration và các ứng dụng quan trọng trong doanh nghiệp Apache Kafka.
Điểm quan trọng của Kafka nằm ở việc dữ liệu không chỉ được gửi từ nơi này sang nơi khác. Kafka lưu dữ liệu dưới dạng log sự kiện, cho phép nhiều hệ thống cùng đọc, xử lý lại dữ liệu trong thời gian còn retention và mở rộng theo chiều ngang khi khối lượng dữ liệu tăng.

Kiến trúc Kafka là một hệ thống truyền phát sự kiện phân tán
Tổng quan luồng dữ liệu trong kiến trúc Kafka
Có thể hình dung luồng dữ liệu trong Kafka theo thứ tự:
Producer → Topic → Partition → Broker → Consumer Group → Consumer
Ví dụ, trong hệ thống thương mại điện tử, khi khách hàng tạo đơn hàng, ứng dụng order service có thể phát sinh sự kiện order_created. Sự kiện này được Producer gửi vào một Topic, chẳng hạn orders. Topic này được chia thành nhiều Partition để Kafka có thể ghi và đọc dữ liệu song song. Các Partition được lưu trên nhiều Broker trong Kafka Cluster. Sau đó, những hệ thống như kho, thanh toán, CRM, email hoặc data warehouse có thể đọc dữ liệu từ Topic đó theo nhu cầu riêng.
Điểm mạnh của kiến trúc này là hệ thống tạo đơn hàng không cần kết nối trực tiếp tới tất cả hệ thống phía sau. Order service chỉ cần gửi event vào Kafka. Mỗi hệ thống còn lại tự đọc event theo nhóm xử lý riêng. Nhờ đó, Kafka giúp giảm phụ thuộc giữa các ứng dụng, đồng thời hỗ trợ tốt hơn cho mô hình event-driven architecture và data pipeline thời gian thực.
Các mô hình sử dụng Kafka trong thực tế
Apache Kafka là một nền tảng đáp ứng được đa dạng nhu cầu triển khai. Cùng Bizfly Cloud khám phá ba kiến trúc Kafka phổ biến: Hệ thống Pub-Sub/Pub-Sub Systems, Stream Processing Pipelines và Log Aggregation Architectures.
1. Pub-Sub system
Trong hệ thống pub-sub, các publisher sẽ đẩy các message vào các topic và consumer sẽ subscribe các topic đó để nhận message. Kiến trúc của Kafka rất phù hợp với pub-sub system nhờ khả năng xử lý khối lượng dữ liệu lớn và truyền tải tin nhắn ổn định cao.
Các thành phần chính:
- Publishers: Các ứng dụng gửi dữ liệu đến các Kafka topic.
- Topics: Các kênh logic mà publisher gửi dữ liệu đến và consumer đọc dữ liệu từ đó.
- Consumers: Các ứng dụng subscribe các topic và xử lý dữ liệu.
- Consumer Groups: Các nhóm consumer cân tải khi đọc dữ liệu từ các topic.
Một ví dụ thực tế về hệ thống pub-sub sử dụng Kafka có thể kể đến new feed, trong đó nhiều source new (producer) đăng bài viết lên một topic và nhiều user application khác nhau (consumer) subscribe để nhận cập nhật theo thời gian thực.
2. Stream Processing Pipelines
Stream Processing Pipelines sẽ tham gia vào các công việc bao gồm: liên tục thu nhận, xử lý và chuyển đổi dữ liệu trong thời gian thực. Khả năng xử lý luồng high throughput của Kafka, kết hợp với tích hợp với các framework xử lý luồng dữ liệu như Apache Flink và Apache Spark giúp Kafka trở nên lý tưởng để xây dựng các pipeline như vậy.
Các thành phần chính:
- Producers: Các ứng dụng gửi luồng dữ liệu thô đến các topic Kafka.
- Topic: Các channel lưu trữ dữ liệu thô trước khi xử lý.
- Stream Processors: Các ứng dụng hoặc framework tiêu thụ dữ liệu thô, sau đó xử lý và tạo ra dữ liệu đã được chuyển đổi.
- Sink Topics: Các topic để lưu trữ dữ liệu đã xử lý để phục vụ cho các lần sử dụng sau.
3. Kiến trúc tổng hợp log/Log Aggregation
Log Aggregation sẽ xử lý các công việc: thu thập dữ liệu nhật ký từ nhiều nguồn khác nhau, tập trung các dữ liệu về một mối, và sau đo cấp dữ liệu cho phân tích. Độ bền và khả năng mở rộng của Kafka khiến nó trở thành lựa chọn tuyệt vời cho các hệ thống tổng hợp nhật ký.
Các thành phần chính:
- Log Producers: Các ứng dụng hoặc dịch vụ tạo ra dữ liệu log.
- Log Topics: Các topic Kafka nơi lưu trữ dữ liệu log.
- Log Consumers: Các ứng dụng đọc dữ liệu log để phân tích hoặc lưu trữ trong một hệ thống tập trung.
Một ví dụ thực tế về kiến trúc Log Aggregation sử dụng Kafka có thể kể đến ứng dụng microservices, trong đó mỗi microservice tạo ra logs. Các log này được gửi đến các topic Kafka và một hệ thống ghi log tập trung để phân tích và giám sát.
4. CDC và đồng bộ dữ liệu
Kafka cũng thường được dùng trong kiến trúc Change Data Capture. Khi dữ liệu trong database thay đổi, event thay đổi có thể được ghi vào Kafka để đồng bộ sang search engine, cache, data warehouse hoặc các microservice khác. Với mô hình này, Kafka đóng vai trò trung gian giúp tách database chính khỏi các hệ thống tiêu thụ dữ liệu phía sau.
Kiến trúc của Kafka hỗ trợ nhiều ứng dụng thực tế, trong đó có các hệ thống pub-sub, các pipeline xử lý stream và kiến trúc log aggregation. Khả năng xử lý các luồng dữ liệu thông lượng cao, cùng với khả năng chịu lỗi và horizontal scale giúp Kafka trở thành một công cụ mạnh mẽ khi xây dựng các ứng dụng data-driven ổn định và sẵn sàng mở rộng.
Các thành phần cốt lõi trong kiến trúc Kafka
Trong kiến trúc Kafka hiện đại, các thành phần quan trọng gồm:
| Thành phần | Vai trò |
|---|---|
| Producer | Ứng dụng gửi dữ liệu hoặc event vào Kafka |
| Topic | Kênh logic dùng để phân loại dữ liệu theo từng nhóm sự kiện |
| Partition | Phần chia nhỏ của Topic, giúp Kafka xử lý song song |
| Broker | Máy chủ Kafka chịu trách nhiệm lưu trữ và phục vụ dữ liệu |
| Kafka Cluster | Tập hợp nhiều Broker cùng vận hành |
| Consumer | Ứng dụng đọc dữ liệu từ Kafka |
| Consumer Group | Nhóm Consumer cùng xử lý dữ liệu từ một hoặc nhiều Topic |
| Offset | Vị trí của từng record trong Partition |
| Replication | Cơ chế sao chép dữ liệu giữa nhiều Broker |
| KRaft | Cơ chế quản lý metadata và điều phối cluster trong Kafka hiện đại |
Các thành phần này không hoạt động tách rời. Producer cần biết ghi dữ liệu vào Topic nào. Topic được chia thành Partition. Partition được phân bổ trên Broker. Consumer đọc dữ liệu theo Consumer Group và theo dõi tiến độ bằng Offset. Replication giúp dữ liệu không phụ thuộc vào một Broker duy nhất. KRaft quản lý metadata và trạng thái cluster thay cho ZooKeeper trong Kafka hiện đại.

Kiến trúc Apache Kafka gồm 4 thành phần cốt lõi
Các API của Kafka
Kafka cung cấp một số API để tương tác với hệ thống:
- API Producer: Cho phép các ứng dụng gửi các luồng dữ liệu đến các topic trong cụm Kafka. API này xử lý việc tuần tự hóa dữ liệu và logic phân vùng.
- API Consumer: Cho phép các ứng dụng đọc các luồng dữ liệu từ các topic. API quản lý độ lệch của dữ liệu được đọc, đảm bảo rằng mỗi bản ghi chỉ được xử lý đúng một lần.
- API Streams: Một thư viện Java phục vụ xây dựng các ứng dụng xử lý dữ liệu theo thời gian thực, cung cấp khả năng chuyển đổi và tổng hợp data event mạnh mẽ.
- API Connector: Cung cấp một framework để kết nối Kafka với các hệ thống bên ngoài. Các source connector sẽ import dữ liệu từ các hệ thống bên ngoài vào các topic Kafka, trong khi các sink connector sẽ export dữ liệu từ các topic Kafka sang các hệ thống bên ngoài.
Tương tác trong kiến trúc Kafka
- Từ Producers đến Kafka Cluster: Các Producer gửi dữ liệu đến Kafka Cluster. Dữ liệu được publish đến các topic cụ thể, sau đó được chia thành các partition và phân phối trên các broker.
- Từ Kafka Cluster đến Consumers: Consumers đọc dữ liệu từ Kafka Cluster. Chúng subscribe các topic và tiêu thụ dữ liệu từ các partition được chỉ định cho mình. Consumer groups đảm bảo tải được cân bằng và mỗi partition chỉ do một consumer trong nhóm xử lý.
- Từ ZooKeeper đến Kafka Cluster: ZooKeeper điều phối và quản lý Kafka Cluster. Nó theo dõi metadata của cluster, quản lý cấu hình broker và xử lý việc chọn leader cho các partition.
Mối quan hệ giữa các partitions, offsets và consumer groups trong một hệ thống sử dụng Kafka:

Hình ảnh miêu tả mối quan hệ giữa các partitions, offsets và consumer
Partitions: Có 3 partition (Partition 0, 1 và 2), mỗi partition lưu trữ các record với các offset duy nhất (0–6), cho biết vị trí của record.
Consumer groups: Ba consumer, mỗi consumer được gán cho một partition:
- Consumer 1 → Partition 0, bắt đầu từ offset 4
- Consumer 2 → Partition 1, bắt đầu từ offset 2
- Consumer 3 → Partition 2, bắt đầu từ offset 3
Data Flow: Mỗi consumer đọc từ partition được gán cho mình bắt đầu từ offset đã cho, đảm bảo tất cả các record được group xử lý chính xác một lần.
Các Framework của Apache Kafka
Kafka là một nền tảng truyền dữ liệu phân tán có thể được mở rộng và tích hợp với nhiều framework khác nhau để mở rộng khả năng và tích hợp với các hệ thống khác. Một số framework quan trọng trong hệ sinh thái Kafka bao gồm:
- Kafka Connect: Một công cụ trong hệ sinh thái Kafka cho phép tích hợp dữ liệu giữa Kafka và các hệ thống bên ngoài như database hoặc file system với độ ổn định cao và khả năng mở rộng tốt. Công cụ cung cấp các connector tích hợp sẵn để đơn giản hóa quá trình di chuyển dữ liệu vào và ra khỏi Kafka.
- Kafka Streams: Một client-side library để xây dựng các ứng dụng xử lý và phân tíchdữ liệu trong các topic Kafka. Công cụ cung cấp các API dễ sử dụng cho các tác vụ như lọc, kết hợp và tổng hợp streaming data.

Kafka Streams làMột thư viện máy khách Java nhẹ để xây dựng các ứng dụng xử lý luồng thời gian thực
- Schema Registry (một phần của Confluent Platform) là một dịch vụ tập trung quản lý các lược đồ Avro cho các Kafka message, đảm bảo các producer và consumer sử dụng các định dạng dữ liệu tương thích trong quá trình tuần tự hóa và giải tuần tự hóa.

Một Schema Registry làmột kho lưu trữ tập trung quản lý và lưu trữ lược đồ
Quản lý Topic trong Kafka
Một trong những yếu tố cơ bản khi làm việc với Kafka là quản lý topic. Topic là các danh mục mà các producer gửi record đến và sau đó được các consumer nhận.
1. Tạo Topic
Để tạo một topic trong Kafka, bạn có thể sử dụng tập lệnh kafka-topics.sh, nằm trong Kafka distribution. Sau đây là một ví dụ để tạo một topic Kafka:
./bin/kafka-topics.sh --create --topic topic_name --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 Giải thích câu lệnh:
--create: Được sử dụng để tạo một topic mới.
--topic topic_name: Chỉ định tên của topic cần được tạo.
--bootstrap-server localhost:9092: Chỉ định máy chủ Kafka cần kết nối. Bạn có thể thay thế localhost:9092 bằng địa chỉ máy chủ thực tế của mình.
--replication-factor 1: Chỉ định hệ số replica cho chủ đề, cho biết số lượng bản sao của mỗi phân vùng cần được duy trì. Trong ví dụ này, nó được đặt là 1.
--partitions 1: Chỉ định số lượng partition cho topic. Trong ví dụ này, nó được đặt là 1.
2. Cấu hình Topic
Các topic Kafka có một số cấu hình để xác định hành vi. Nếu không cung cấp cấu hình topic cụ thể, các thuộc tính mặc định của máy chủ sẽ được sử dụng. Bạn có thể tạo một topic bằng công cụ "kafka-topic" và tùy chọn "--config". Chúng ta có thể sửa đổi cấu hình bằng công cụ "kafka-configs" và tùy chọn "--alter".
Ví dụ: Tạo cấu hình Topic
./bin/kafka-topics.sh --create --topic topic_name --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --config retention.ms=604800000 Ví dụ: Chỉnh sửa cấu hình
./bin/kafka-configs.sh --alter --entity-type topics --entity-name topic_name --add-config retention.ms=259200000 3. Partitions và Replication
Partition: Topic partitions là một khái niệm cơ bản trong Kafka, tại đây, dữ liệu được xử lý song song và phân phối giữa nhiều broker. Mỗi partition là một tập hợp các message được sắp xếp theo thứ tự và không thể thay đổi. Khi tạo một topic, bạn chỉ định số lượng phân vùng bằng cách sử dụng cờ --partitions flag
Replication: Kafka cho phép sao chép dữ liệu trên nhiều broker để đảm bảo tính sẵn sàng của dữ liệu và khả năng chịu lỗi. Mỗi partition có thể có một hoặc nhiều replica. Trong số các replica này, một bản đóng vai trò là leader và các replica khác đóng vai trò là follower. Leader xử lý tất cả các yêu cầu đọc và ghi cho partition, trong khi các follower sao chép dữ liệu. Nếu bản leader bị lỗi, một trong các bản follower sẽ được chọn làm leader mới. Sử dụng --replication-factor để chỉ định hệ số sao chép khi tạo topic.
Ví dụ: Tạo một Topic với Partition và Replication
./bin/kafka-topics.sh --create --topic topic_name --bootstrap-server localhost:9092 --replication-factor 3 --partitions 4 Ưu điểm của kiến trúc Kafka
- Tách biệt producer và consumer: Kafka tách biệt producer và consumer, cho phép chúng hoạt động độc lập, nhờ vậy mà dễ dàng mở rộng và quản lý hệ thống.
- Log được sắp xếp và có tính bất biến: Kafka duy trì thứ tự các record trong một partition và đảm bảo rằng các record là bất biến. Từ đó đảm bảo tính toàn vẹn và nhất quán của dữ liệu.
- Tính khả dụng cao: Cơ chế replication và fault tolerance của Kafka đảm bảo tính khả dụng và độ tin cậy cao cho dữ liệu.
Để trải nghiệm những ưu điểm mạnh mẽ của kiến trúc Kafka, bạn có thể truy cập tại: https://bizflycloud.vn/kafka
Bizfly Cloud Kafka được thiết lập sẵn sàng để triển khai ngay lập tức giúp developer dễ dàng sử dụng Apache Kafka để giao tiếp xử lý dữ liệu theo thời gian thực trong các hệ thống mà không cần phải quản lý hay cài đặt server. Các tài nguyên sẽ được tự động cung cấp và quản lý, mở rộng quy mô ứng dụng khi khối lượng streaming data thay đổi hoàn toàn tự động, không cần thao tác thủ công, giúp bạn tập trung tối đa thời gian, công sức cho phát triển sản phẩm, tính năng cốt lõi.
Câu hỏi thường gặp về kiến trúc Kafka
Kiến trúc Kafka hiện đại có còn dùng ZooKeeper không?
Với Kafka 4.0 trở lên, Kafka không còn dùng ZooKeeper mode. Apache Kafka 4.0 chỉ hỗ trợ KRaft mode và ZooKeeper mode đã bị loại bỏ Apache Kafka Upgrading. ZooKeeper chỉ còn phù hợp khi nói về các cluster Kafka cũ hoặc môi trường legacy.
Vì sao Kafka cần Partition?
Partition giúp Kafka mở rộng ghi và đọc dữ liệu song song. Một Topic có nhiều Partition có thể được phân bổ trên nhiều Broker, đồng thời cho phép nhiều Consumer trong cùng Consumer Group xử lý dữ liệu song song.
Kafka có đảm bảo không mất dữ liệu không?
Kafka có thể đạt độ bền dữ liệu cao nếu cấu hình đúng replication factor, acknowledgment, min.insync.replicas, retention và cơ chế xử lý lỗi ở Consumer. Tuy nhiên, không nên khẳng định Kafka tuyệt đối không mất dữ liệu trong mọi trường hợp, vì độ an toàn còn phụ thuộc vào cấu hình cluster và logic ứng dụng.
Kafka khác message queue truyền thống ở điểm nào?
Message queue truyền thống thường tập trung vào việc giao message từ producer đến consumer và xóa message sau khi xử lý. Kafka lưu event theo log có retention, cho phép nhiều Consumer Group đọc độc lập và có thể đọc lại dữ liệu trong thời gian còn lưu. Vì vậy, Kafka phù hợp hơn với event streaming, data pipeline và kiến trúc event-driven.
Khi nào nên dùng Kafka?
Kafka phù hợp khi hệ thống cần xử lý dữ liệu thời gian thực, nhiều hệ thống cùng tiêu thụ một luồng event, cần xây dựng data pipeline, log aggregation, CDC hoặc event-driven architecture. Nếu nhu cầu chỉ là gửi vài tác vụ nền đơn giản, một message queue truyền thống có thể dễ triển khai và vận hành hơn.




















