Về trang blog
Series: Kafka từ A-Z · Bài 1/6
Kafka là gì?
Tại sao mọi hệ thống lớn đều cần nó

Vấn đề mà Kafka sinh ra để giải quyết

Hãy tưởng tượng một hệ thống e-commerce. Khi user đặt hàng, cùng lúc bạn cần:

  • Gửi email xác nhận đơn hàng
  • Trừ tồn kho trong warehouse service
  • Tạo shipment trong logistics service
  • Ghi nhận doanh thu trong analytics
  • Gửi notification đến app

Cách thông thường: Order Service gọi thẳng API đến từng service. Đây là synchronous coupling — nếu Notification Service chậm 2 giây, cả order flow chậm 2 giây. Nếu Analytics Service down, order fail.

🔗
Tight Coupling
Một service down là cả flow bị ảnh hưởng
🐢
Synchronous Bottleneck
Phải chờ từng downstream service trả lời
📉
Lost Events
Service crash = mất event, không có cách replay
📈
Scale mismatch
Consumer mỗi service scale khác nhau nhưng producer không kiểm soát được

Kafka giải quyết tất cả bằng một ý tưởng đơn giản: thay vì gọi trực tiếp, producer ghi event vào log — consumer tự đọc khi ready. Decoupled hoàn toàn.

Kafka là gì — định nghĩa đúng nhất

Apache Kafka là một distributed event streaming platform — không phải message queue truyền thống (như RabbitMQ), không phải database, không phải cache. Cách gọi chính xác nhất: distributed commit log.

Định nghĩa core
Kafka là một append-only, immutable, ordered log được phân tán trên nhiều máy chủ. Producer ghi event vào cuối log. Consumer đọc từ bất kỳ vị trí nào trong log. Event không bị xóa ngay sau khi đọc — nó tồn tại theo retention policy (mặc định 7 ngày).

Điểm khác biệt lớn nhất với message queue: consumer tự quản lý vị trí đọc (offset). Kafka không biết và không quan tâm consumer đã đọc đến đâu — đó là trách nhiệm của consumer. Điều này cho phép replay event, thêm consumer mới đọc lại lịch sử, hoặc nhiều consumer group độc lập đọc cùng một topic.

Core concepts

Event / Record
Đơn vị dữ liệu cơ bản. Gồm: key, value, timestamp, và headers. Value thường là JSON/Avro/Protobuf. Ví dụ: {"order_id": 123, "status": "placed"}
Topic
Kênh logic để phân loại event. Tương tự như "table" trong database hoặc "folder" trong filesystem. Ví dụ: order-events, user-signups.
Partition
Một topic được chia thành nhiều partition — mỗi partition là một log độc lập. Đây là đơn vị song song hóa của Kafka. Nhiều partition = nhiều consumer đọc song song.
Offset
Vị trí của event trong một partition. Tăng dần từ 0. Consumer lưu offset để biết đã đọc đến đâu — cho phép resume sau crash hoặc replay từ đầu.
Broker
Một Kafka server. Cluster thường có 3+ broker. Mỗi broker lưu một số partition. Broker không push data — consumer tự poll.
Producer
Client ghi event vào topic. Producer chọn partition (theo key hash hoặc round-robin). Có thể configure durability qua acks.
Consumer
Client đọc event từ topic. Poll-based (không phải push). Tự quản lý offset. Nhiều consumer cùng group sẽ chia nhau các partition.
Consumer Group
Tập hợp consumer cùng group.id. Mỗi partition chỉ được đọc bởi một consumer trong group — đảm bảo không xử lý trùng.

Architecture tổng quan

Flow dữ liệu trong Kafka:

Producers
App, Service
DB, IoT...
write events
Kafka Cluster
Broker 1 · Broker 2 · Broker 3
Topics & Partitions
Replication
poll events
Consumers
Group A
Group B
Group C
ZooKeeper / KRaft
Cluster metadata, leader election, controller

ZooKeeper vs KRaft

Kafka cổ điển dùng ZooKeeper để quản lý metadata và leader election. Từ Kafka 3.3+, mode KRaft (Kafka Raft) cho phép chạy không cần ZooKeeper — đơn giản hơn cho việc setup và vận hành. Từ Kafka 4.0, ZooKeeper bị deprecated hoàn toàn.

Tip cho project mới
Luôn dùng KRaft mode cho project mới. ZooKeeper legacy chỉ cần thiết nếu bạn phải tích hợp với hệ thống Kafka cũ (pre-3.3). Bài 2 của series này sẽ dùng KRaft.

Partition — bí mật sau scalability

Partition là khái niệm quan trọng nhất để hiểu Kafka. Mỗi topic order-events với 3 partitions trông như sau:

Topic: order-events (3 partitions)
Partition 0
0
1
2
3
4
Partition 1
0
1
2
Partition 2
0
1
2
3
Offset (P0)
Offset (P1)
Offset (P2)
Vị trí tiếp theo

Ordering guarantee: Thứ tự chỉ được đảm bảo trong cùng một partition. Nếu bạn cần tất cả event của một order theo đúng thứ tự, dùng order_id làm key — Kafka sẽ hash key và route tất cả event có cùng key về một partition.

Parallelism: Consumer group với 3 consumer + topic với 3 partition = mỗi consumer đọc đúng 1 partition song song. Thêm consumer thứ 4 → consumer thứ 4 idle (số consumer không thể vượt số partition).

Kafka vs RabbitMQ vs Redis Pub/Sub

Tiêu chí Kafka RabbitMQ Redis Pub/Sub
Mô hình Distributed log (pull) Message queue (push/pull) Pub/Sub (push, fire-and-forget)
Retention Lâu dài (7 ngày mặc định) Đến khi consumer ack Không lưu — mất nếu consumer offline
Replay Có — seek đến bất kỳ offset Không Không
Throughput Rất cao (triệu msg/s) Cao (100K msg/s) Cao nhưng không bền
Ordering Trong mỗi partition Trong queue (single consumer) Không đảm bảo
Multiple consumers Nhiều group độc lập Competing consumers (chia nhau) Nhiều subscriber nhận cùng msg
Độ phức tạp Cao — cần hiểu partition, offset Thấp — AMQP đơn giản Rất thấp
Best for Event streaming, audit log, CDC Task queue, RPC, routing phức tạp Realtime notification, simple fanout
Kafka không thay thế RabbitMQ
Kafka và RabbitMQ giải quyết vấn đề khác nhau. Kafka giỏi ở event streaming và log retention. RabbitMQ giỏi ở routing phức tạp và task queue có priority. Nhiều hệ thống dùng cả hai.

Use cases thực tế

🔄
Microservices Decoupling
Services giao tiếp qua Kafka thay vì gọi API trực tiếp. Order Service không cần biết có bao nhiêu downstream consumer.
📊
Real-time Analytics Pipeline
Stream clickstream / app events vào Kafka → Flink/Spark processing → dashboard realtime. LinkedIn dùng Kafka xử lý hàng nghìn tỷ event/ngày.
🗄️
Change Data Capture (CDC)
Debezium đọc binlog của MySQL/Postgres và stream mọi change vào Kafka. Sync database mà không cần polling.
📋
Audit Log
Mọi action của user ghi vào Kafka topic — immutable, có thể replay, không ai xóa được. Compliance-friendly.
🌊
Event Sourcing
State của hệ thống = tổng hợp tất cả events trong quá khứ. Kafka làm event store. Rebuild bất kỳ trạng thái nào bằng cách replay từ đầu.
🔃
Log Aggregation
Thu thập log từ hàng trăm service về một nơi. ELK stack, Splunk, Loki thường dùng Kafka làm buffer trung gian.

Khi nào KHÔNG nên dùng Kafka

  • Team nhỏ, cần ship nhanh — Kafka có operational overhead cao. RabbitMQ hoặc SQS đơn giản hơn nhiều.
  • Request-response / RPC — Kafka không phù hợp cho pattern "gửi rồi chờ response". Dùng HTTP/gRPC.
  • Dataset nhỏ, ít message — Setup Kafka cho vài nghìn message/ngày là over-engineering. PostgreSQL LISTEN/NOTIFY hoặc Redis đủ dùng.
  • Cần message routing phức tạp — Routing theo header, priority queue, dead-letter queue — RabbitMQ làm tốt hơn.
  • Latency cực thấp (< 1ms) — Kafka batch-oriented, latency thường 5-15ms. Nếu cần sub-ms thì cần giải pháp khác.
Cạm bẫy phổ biến
Kafka cluster cần ít nhất 3 broker để đảm bảo HA. Với 1 broker là dev/test only. Chi phí vận hành Kafka production không nhỏ — hãy cân nhắc managed service (Confluent Cloud, AWS MSK, Aiven) nếu không có team chuyên về Kafka.