Xin chào, lại là mình - Đức Phúc, anh chàng hơn 6 năm trong nghề vẫn nghèo technical nhưng thích viết Blog để chia sẻ kiến thức bản thân học được trong quá trình “cơm áo gạo tiền” đây. Các bạn có thể theo dõi mình thêm qua một số nền tảng bên dưới nhé:
- Linkedin: https://www.linkedin.com/in/phuc-ngo-728433346
- Viblo: https://viblo.asia/u/NHDPhucIT
- Patreon: https://www.patreon.com/felix_ngo
- Facebook: https://www.facebook.com/DucPhucIT
Ở bài viết này, chúng ta sẽ đi vào những khái niệm cơ bản đầu tiên trong Kafka gồm
- Topics
- Partitions
- Offsets
Trước tiên, bạn có thể xem hình sau biểu thị 3 khái niệm trên và mối quan hệ giữa chúng nhé. Chúng ta sẽ giải thích dựa trên hình ảnh này
Nào, cùng nhau phân tích thôi
1. Topic
Thành phần đầu tiên chúng ta nhắc đến sẽ là Topic
Topic là 1 luồng dữ liệu riêng biệt trong Kafka Cluster. Kafka Cluster có thể chứa nhiều Topic. Nó có thể được đặt tên như: Topic A, Topic B, Topic C,…, bất cứ tên gì bạn muốn. Tên Topic cũng chính là
key
để phân biệt các Topic với nhau.
Chúng ta cũng có thể xem những Topic này như những Table trong Database. Tuy nhiên, với Topic, nó sẽ không có sự ràng buộc về dữ liệu với nhau vì chúng ta có thể gửi bất kì thông tin gì đến Topic mà không cần phải kiểm tra dữ liệu. Dữ liệu đó có thể là JSON, Avro, Text file, Binary,…
Thứ tự những message được gửi vào Topic gọi là Luồng Dữ liệu (Data Stream), đó cũng là lý do vì sao Kafka được gọi là Data Stream Platform.
Điểm khác biệt tiếp theo giữa Topic và Database, là chúng ta không thể truy vấn (query) thông tin bên trong chúng. Thay vào đó, chúng ta có 2 khái niệm khác:
- Producer: Gửi thông tin vào Topic
- Consumer: Đọc thông tin từ Topic
Chúng ta sẽ đi sâu vào 2 khái niệm này ở những bài sau nhé
2. Partition
Như vậy ta đã hiểu tổng quan về Topic, vậy Partition thì sao?
Partition là những phân vùng được chia nhỏ từ Topic. Một Topic có thể chứa số lượng Partition tuỳ ý.
Như hình minh hoạ ở trên, bạn sẽ thấy
- Topic A được chia thành 4 partitions
- Topic B được chia thành 3 partitions
- Topic C được chia thành 2 partitions
Khi gửi message đến Topic, nó sẽ được chuyển đến những phân vùng này một cách ngẫu nhiên trừ khi chúng ta cung cấp cho nó 1 key để nó xác định Partition được gửi đến (chúng ta sẽ thảo luận vấn đề này ở bài sau). Những message này cũng được sắp xếp theo thứ tự cho mỗi Partition.
Kafka Topic có đặc trưng là không thể thay đổi (immutable). Nghĩa là khi dữ liệu đã được gửi đến Partition, nó sẽ không thể thay đổi được nữa (bao gồm cả chỉnh sửa hay xoá dữ liệu). Những dữ liệu này sẽ được lưu giữ trong Kafka một thời gian (chúng ta có thể thiết lập khoảng thời gian này), sau đó, chúng sẽ tự biến mất.
Những message được gửi đến sẽ kèm id
của nó, và nó sẽ tăng dần. Đây cũng chính là khái niệm tiếp theo mà chúng ta tìm hiểu: Offset
3. Offset
Okay, hãy nhìn vào những Partition trong Topic C dưới đây
Ta có thể thấy, mỗi Partition có những Offset của chính nó, được đánh dấu tăng dần. Mỗi Offset như vậy sẽ đại diện cho 1 message mà ta gửi đến Partition
Một điều cực kỳ quan trọng cần lưu ý, là những Offset này hoàn toàn riêng biệt cho mỗi Partition. Điều này có nghĩa là Offset i
trong Partition C1
sẽ khác với Offset i
trong Partition C2
. Nó cũng đồng nghĩa rằng thứ tự Message sẽ có ý nghĩa theo mỗi Partition, chứ không đảm bảo thứ tự giữa các Partition với nhau.
Điều quan trọng tiếp theo là những Offset này sẽ không được tái sử dụng ngay cả khi message trước đó đã bị xoá khỏi nó bởi Kafka, nó sẽ vẫn tiếp tục tăng lên khi có message mới được gửi đến.
4. Tổng kết
Như vậy, ở bài viết này, chúng ta đã nắm được 3 khái niệm cực kỳ quan trọng trong Kafka là: Topics, Partitions và Offsets, cũng như mối quan hệ, đặc trưng của chúng.
Hãy ghi nhớ những nội dung này để chúng ta tiếp tục ở các bài sau nhé. Nó sẽ xuất hiện xuyên suốt series về Kafka này.
Hẹn gặp lại các bạn ở bài viết tiếp theo.
Một lần nữa, đừng quên connect với mình để cùng trao đổi nhé
- Linkedin: https://www.linkedin.com/in/phuc-ngo-728433346
- Viblo: https://viblo.asia/u/NHDPhucIT
- Patreon: https://www.patreon.com/felix_ngo
- Facebook: https://www.facebook.com/DucPhucIT