Bài 2: Mổ xẻ Topic — Bí mật của tốc độ (Partitions & Offsets)
Để Kafka có thể xử lý hàng triệu tin nhắn mỗi giây, một Topic không bao giờ đứng nguyên một khối. Nó được băm nhỏ ra.
1. Partition (Phân vùng) là gì?
Khi bạn tạo ra một Topic, Kafka sẽ chia Topic đó thành nhiều phần nhỏ hơn gọi là Partition.
Hãy tưởng tượng Topic là một con đường cao tốc:
- Nếu con đường chỉ có 1 làn xe (1 Partition), các xe (tin nhắn) phải nối đuôi nhau đi rất chậm.
- Nếu bạn mở rộng thành đường 4 làn xe (4 Partitions), số lượng xe có thể lưu thông cùng lúc tăng lên gấp 4 lần.
Nhờ có Partition, nhiều Consumer có thể cùng lúc đọc dữ liệu từ một Topic (mỗi Consumer đọc một Partition khác nhau) mà không bị "giẫm chân" lên nhau. Đây chính là chìa khóa để Kafka mở rộng theo chiều ngang (Scale-out).
2. Offset (Chỉ mục) là gì?
Khi một Message được Producer gửi vào một Partition, nó sẽ được Kafka "đóng dấu" cho một số thứ tự tăng dần. Số thứ tự này gọi là Offset.
- Tin nhắn đầu tiên vào Partition 0 sẽ có Offset là 0.
- Tin nhắn tiếp theo vào Partition 0 sẽ có Offset là 1, 2, 3... và cứ thế tăng mãi.
Đặc điểm sống còn của Offset:
- Offset là duy nhất trong một Partition.
- Nó giống như số thứ tự bạn bốc khi đi ngân hàng. Nhờ có Offset, Consumer biết được mình đã đọc đến tin nhắn nào. Nếu Consumer bị sập, khi khởi động lại, nó chỉ cần tìm đúng cái Offset cuối cùng nó đã đọc và đọc tiếp.
3. Ba "Luật bất thành văn" của Kafka bạn phải nhớ
Là một Backend Developer, đây là những điểm bạn cần lưu ý kỹ để không thiết kế sai logic:
- Dữ liệu không bao giờ bị xóa ngay: Khác với các hệ thống Message Broker truyền thống (như RabbitMQ) thường xóa tin nhắn ngay sau khi Consumer đọc xong. Kafka lưu dữ liệu vào ổ cứng (Append-only log) và giữ lại trong một khoảng thời gian cấu hình trước (ví dụ: 7 ngày), bất kể đã có ai đọc hay chưa.
- Tính bất biến (Immutable): Tin nhắn một khi đã được ghi vào Partition thì không thể bị sửa đổi. Bạn không thể "update" một tin nhắn có Offset = 2
- hứ tự chỉ được đảm bảo trong CÙNG một Partition: Kafka đảm bảo tin nhắn gửi trước sẽ được nhận trước, nhưng điều này chỉ đúng đối với các tin nhắn nằm trong cùng một Partition. Nếu bạn đọc dữ liệu từ toàn bộ Topic (gồm nhiều Partition), thứ tự các tin nhắn nhận được có thể bị xáo trộn.
Bài toán thực tế: Giả sử bạn có hệ thống giao dịch ngân hàng. Bạn muốn các tin nhắn cập nhật số dư của cùng một tài khoản (VD: Tài khoản A nạp 100k, rồi rút 50k) phải được xử lý đúng thứ tự.
All Rights Reserved