Kafka: topic, partition, offset và consumer group qua ví dụ từng bước
Mục tiêu bài học
- Mô tả được bốn khái niệm lõi của Kafka: topic, partition, offset, consumer group.
- Giải thích được producer gán record vào partition như thế nào và hệ quả lên thứ tự xử lý.
- Tính được cách consumer group chia partition khi scale, kể cả trường hợp consumer dư.
- Đọc được offset commit như một con trỏ vị trí, tách bạch với câu hỏi "dữ liệu còn hay bị xóa".
Ôn nhanh
Bài trước chốt một câu: BullMQ là hàng đợi công việc trên Redis, mỗi job được giao cho đúng một worker rồi bị xóa khi xong; Kafka là log sự kiện phân tán, record được giữ lại và nhiều consumer group đọc độc lập. Nhớ đúng một câu đó là đủ để đi tiếp: BullMQ giao việc, Kafka ghi log.
Lý thuyết
Topic: chỉ là cái tên
Topic là tên logic, ví dụ don-hang. Bản thân topic không lưu gì cả. Dữ liệu thật nằm trong các partition bên trong nó.
Partition: log append-only, đơn vị song song hóa
Mỗi partition là một log chỉ ghi thêm. Record mới luôn nối vào cuối, không sửa, không chèn giữa. Trong Kafka, đơn vị lưu trữ và song song hóa thực sự là {{c1::_____}}, còn topic chỉ là tên gom chúng lại.
Mỗi record trong một partition được gán một {{c2::_____}} tăng dần, và offset chỉ có ý nghĩa trong phạm vi partition đó. Partition 0 có offset 0,1,2 và partition 1 cũng có offset 0,1,2.
Đây là cạm bẫy lớn nhất với người mới: Kafka chỉ đảm bảo thứ tự trong một partition. Giữa các partition không có thứ tự nào cả.
Producer chọn partition thế nào
- Có key:
partition = hash(key) % số partition. Mọi record cùng key luôn vào {{c5::_____}}. - Key null: producer xoay vòng (round-robin) hoặc dính theo batch (sticky), mỗi record một partition khác nhau.
Nghĩa là chọn key chính là một quyết định kiến trúc. Muốn mọi event của một khách hàng được xử lý đúng thứ tự thì key phải là mã khách hàng.
Offset: con trỏ, không phải dấu "đã xóa"
Sign in to view the full content of this lesson. Sign in