Dữ liệu không
đứng yên.
Kafka cũng vậy.
Khám phá Apache Kafka từ con số 0 bằng ẩn dụ dễ hiểu, sơ đồ trực quan và một phòng lab nơi chính bạn điều khiển luồng dữ liệu.
Apache Kafka là một nền tảng event streaming phân tán giúp hệ thống ghi nhận, lưu giữ và xử lý luồng sự kiện ở quy mô lớn. Khác hàng đợi xóa ngay khi nhận, event log của Kafka cho phép nhiều nhóm độc lập đọc lại bản ghi khi chúng vẫn còn được lưu.
EVENT STREAMING
Khi hệ thống lớn dần,
kết nối trực tiếp trở thành gánh nặng.
Trong monolith, nhiều nghiệp vụ nằm trong một ứng dụng. Khi tách thành nhiều dịch vụ, một đơn hàng mới có thể phải gọi thanh toán, kho, email, analytics… Kafka giúp các dịch vụ giao tiếp qua sự kiện thay vì phải gọi trực tiếp từng nơi.
Point-to-Point / Đồng bộ
- Mỗi dịch vụ phải biết địa chỉ của nhiều dịch vụ khác.
- Gọi đồng bộ có thể làm request chậm hoặc lỗi dây chuyền.
- Thêm dịch vụ mới → phải sửa phía phát sự kiện.
Event-Driven Architecture
- Producer chỉ công bố OrderCreated vào Topic.
- Mỗi Consumer Group xử lý với tốc độ và offset riêng.
- Thêm dịch vụ mới mà không cần thay Producer.
Phân biệt: Monolith là cách tổ chức ứng dụng, còn point-to-point là kiểu giao tiếp. Một hệ thống microservices vẫn có thể dùng point-to-point; Kafka không tự động giải quyết mọi vấn đề và đổi lại là chi phí vận hành cùng tính nhất quán bất đồng bộ.
Bên trong hộp đen Kafka.
Hãy nhớ chuỗi cốt lõi: Producer ghi record vào một partition của topic trên broker; Consumer đọc theo offset và quản lý tiến độ theo group.
Broker
Máy chủ Kafka lưu các partition, phục vụ yêu cầu ghi/đọc. Cluster thường có nhiều broker để phân tán dữ liệu và nhân bản.
Ví như chi nhánh bưu điện.Topic
Tên luồng sự kiện logic, ví dụ orders.events. Producer ghi vào topic; consumer subscribe topic.
Partition
Đơn vị chia nhỏ topic thành các log. Record có thứ tự trong partition; nhiều partition cho phép song song.
Ví như ngăn thư có đánh số.Producer
Ứng dụng tạo và gửi record (key, value, timestamp). Key thường quyết định partition để cùng key giữ thứ tự cục bộ.
Ví như người gửi thư.Consumer
Ứng dụng chủ động poll() record và xử lý. Đọc record không xóa record khỏi Kafka.
Consumer Group
Các consumer chung group.id chia nhau partition. Tại một thời điểm, mỗi partition được gán cho tối đa một consumer trong group.
Offset
Chỉ số tăng từ 0 trên từng partition. Committed offset đánh dấu vị trí đọc kế tiếp của group; có thể dùng để đọc lại.
Ví như dấu trang trong sổ.KRaft / ZooKeeper
KRaft dùng quorum controller quản lý metadata theo cơ chế Raft. ZooKeeper là cơ chế cũ; Kafka 4.0+ chỉ hỗ trợ KRaft.
Ví như bộ phận điều hành bưu cục.Bảo đảm thứ tự trong một partition, không phải giữa các partition.
Consumer có thể đọc lại dữ liệu còn trong thời hạn lưu trữ bằng cách đổi offset.
Replica trên nhiều broker tăng khả năng chịu lỗi; sơ đồ lab không mô phỏng nhân bản.
Bạn là Kafka engineer.
Gửi sự kiện, chọn chiến lược phân partition, kéo dữ liệu về Consumer Group rồi quan sát offset và lag.
Producer
orders.events
Consumer Group
Chuyển sang Key hash, gửi 3 lần với key order-1001: cả 3 sẽ vào cùng partition.
Consume trong billing-service, rồi đổi sang analytics-service: group mới có offset độc lập.
Có 3 partition và 4 consumers → một consumer sẽ không nhận partition nào.
Giới hạn mô phỏng: Đây là mô hình trong bộ nhớ của trình duyệt, không có Kafka broker thật, mạng, replica, transaction hay rebalance protocol thực. Round-robin được chọn để dễ học (không đại diện mặc định của mọi Kafka client); Key hash dùng FNV-1a minh họa, không phải thuật toán partitioner mặc định của Kafka Java. Nút Consume giả lập xử lý thành công và commit offset tức thì.
Kafka ngoài đời thực.
Bốn mẫu ứng dụng phổ biến. Mỗi card là một luồng event có thể gặp trong hệ thống sản phẩm thật.
Thanh toán & đơn hàng
Khi đơn hàng được tạo, hệ thống phát OrderCreated. Billing, Inventory và Notifications đọc độc lập; mỗi nhóm theo dõi tiến độ riêng.
{"type":"OrderCreated",
"orderId":"1001","amount":299000}Thu thập log tập trung
Nhiều máy chủ đẩy log về một topic. Một nhóm consumer lưu vào hệ thống tìm kiếm; nhóm khác tạo cảnh báo lỗi theo thời gian thực.
{"service":"api-gateway",
"level":"ERROR","status":503}Tracking hành vi người dùng
Website phát ProductViewed, AddedToCart… Pipeline đẩy về kho dữ liệu để tính funnel và phân tích trải nghiệm.
{"type":"ProductViewed",
"userId":"u42","productId":"p9"}Xử lý dữ liệu thời gian thực
Kafka Streams/Flink đọc giao dịch liên tục, tổng hợp theo cửa sổ 1 phút, phát cảnh báo khi vượt ngưỡng rủi ro.
{"accountId":"a7","amount":5000,
"eventTime":"2026-10-12T10:00:00Z"}Chạm tay vào code thực.
Ba ví dụ tối giản để nối từ mô phỏng đến một cluster Kafka thật. Website này vẫn hoạt động offline mà không cần cài bất cứ thư viện nào.
# Cần: pip install confluent-kafka
from confluent_kafka import Producer
producer = Producer({"bootstrap.servers": "localhost:9092"})
# Cùng key thường đi vào cùng một partition
producer.produce(
topic="orders.events",
key="order-1001",
value='{"type":"OrderCreated","orderId":"1001"}'
)
producer.flush() # Chờ gửi xong trước khi thoát# Cần: pip install confluent-kafka
from confluent_kafka import Consumer
consumer = Consumer({
"bootstrap.servers": "localhost:9092",
"group.id": "billing-service",
"auto.offset.reset": "earliest",
"enable.auto.commit": False,
})
consumer.subscribe(["orders.events"])
try:
while True:
msg = consumer.poll(1.0)
if msg is None:
continue
if msg.error():
print(msg.error())
continue
print(msg.partition(), msg.offset(), msg.value())
# Sau khi xử lý nghiệp vụ thành công:
consumer.commit(message=msg, asynchronous=False)
finally:
consumer.close()# Chạy trên máy đã cài Kafka và khởi động broker
# 1. Tạo topic với 3 partitions
bin/kafka-topics.sh --create \
--topic orders.events --partitions 3 \
--replication-factor 1 --bootstrap-server localhost:9092
# 2. Mở producer console, nhập theo dạng key:value
bin/kafka-console-producer.sh \
--topic orders.events --bootstrap-server localhost:9092 \
--property parse.key=true --property key.separator=:
# Sau đó nhập: order-1001:{"type":"OrderCreated"}
# 3. Ở terminal khác, đọc bằng consumer group
bin/kafka-console-consumer.sh \
--topic orders.events --bootstrap-server localhost:9092 \
--group demo-group --from-beginning \
--property print.key=trueCác snippet Python cần thư viện confluent-kafka và Kafka chạy ở localhost:9092; lệnh CLI cần bộ cài Kafka. Đây là ví dụ học tập, chưa có retry, schema validation hay production security.
Bạn đã nắm vững chưa?
Kiểm tra nhanh 4 câu. Chọn đáp án để thấy giải thích ngay — không có áp lực điểm số.
Hãy quay lại playground, thử thay key, group và số consumer. Khả năng dự đoán chính xác luồng message là dấu hiệu bạn đã thực sự hiểu Kafka.