Offset & Record
Last updated
Last updated
Offset là một số nguyên duy nhất đại diện cho vị trí của một record trong một partition của topic.
Có thể xem Offset tương tự như là primary key
Offset được tạo ra sau khi record được ghi vào partition
Offset là 1 số nguyên tăng dần và bắt đầu từ 0
Trong Kafka, việc tìm kiếm một Record dựa trên Offset có độ phức tạp là O(1)
Khi producer gửi record đến Kafka, record được gán một offset tăng dần trong partition.
Consumer đọc record từ partition bằng cách theo dõi offset của record cuối cùng đã đọc (commit offset).
Mỗi record trong partition có một offset duy nhất.
Offset giúp consumer theo dõi tiến trình đọc dữ liệu, đảm bảo không bỏ sót hoặc đọc trùng lặp record.
Kafka lưu trữ offset trong một topic đặc biệt gọi là __consumer_offsets.
Record tương tự như là 1 message/event
Records are immutable (một khi đã ghi vào patition thì không thể thay đổi được)
Một record (hay còn gọi là message) trong một topic có các thuộc tính chính sau đây:
Key:
Tuỳ chọn, không cần duy nhất
Dùng để nhóm các record có liên quan (ví dụ nhóm các record cùng 1 order vào 1 partition để đảm bảo thứ tự xử lý các event)
Có thể là nhiều loại data type khác nhau (string, integer, json…)
Value:
Là thành phần quan trọng nhất: Mô tả chi tiết về event
Tuỳ chọn, có thể null
Có thể là nhiều loại data type khác nhau (string, integer, json…)
Timestamp:
Thời gian mà record được tạo ra hoặc được gửi đến Kafka.
Timestamp có thể được chỉ định bởi producer hoặc nếu không thì khi gửi vào Broker sẽ được tự động gán bởi broker.
Độ chính xác ở milisecond
Partition: Số hiệu của partition mà record được gửi đến trong topic (được xác định tự động nếu không chỉ định key hoặc partition cụ thể).
Offset:
Một số duy nhất trong partition, đánh dấu vị trí của record trong luồng dữ liệu. Offset được gán bởi Kafka broker.
64-bit signed integer
Headers: Một tập hợp các cặp key-value tùy chọn (từ Kafka 0.11.0 trở lên), cho phép thêm metadata bổ sung vào record.
❓Có trường hợp nào hai offset liền kề trong Kafka không phải là hai số nguyên liên tiếp không?
Trong Kafka, offset là số nguyên tăng dần và liên tiếp trong một partition. Hai offset kế nhau luôn là hai số nguyên liên tiếp (ví dụ: 5, 6, 7).
Tuy nhiên, trong một số trường hợp đặc biệt như log compaction (giữ lại bản ghi mới nhất cho mỗi key) hoặc xóa record thủ công, một số offset có thể bị "thiếu". Ví dụ: sau khi xóa, bạn có thể thấy offset 5, 7, 8 (thiếu 6), nhưng các offset còn lại vẫn liên tiếp.
Tóm lại: Offset thường liên tiếp, nhưng có thể bị gián đoạn trong các tình huống đặc biệt.
❓Kafka lưu trữ offset của consumer ở đâu?
Offset của consumer không được lưu trữ trong chính consumer mà được lưu trữ tập trung trong Kafka, cụ thể là trong một topic nội bộ có tên là __consumer_offsets.
__consumer_offsets là một topic hệ thống được Kafka tạo ra để theo dõi tiến trình tiêu thụ (offset) của từng consumer group đối với từng partition của các topic mà họ đăng ký (subscribe).
Mỗi khi một consumer trong một consumer group đọc một record từ một partition, nó sẽ commit (ghi nhận) offset hiện tại của mình lên topic __consumer_offsets. Điều này đảm bảo rằng nếu consumer bị crash hoặc khởi động lại, nó có thể tiếp tục từ vị trí offset đã commit cuối cùng.
❓Làm thế nào để quản lý offset khi có nhiều consumer group?
Khi có nhiều consumer group, Kafka quản lý offset một cách độc lập cho từng group. Điều này có nghĩa là mỗi consumer group có thể tiêu thụ cùng một topic nhưng giữ offset riêng biệt.
Kafka không can thiệp vào việc trùng lặp dữ liệu giữa các consumer group; mỗi group hoạt động độc lập.
❓Có thể thiết kế một topic mà dữ liệu chỉ được đọc 1 lần duy nhất?
mình chưa tìm hiểu xong câu này 😗