Ngoài câu trả lời được chấp nhận rất hữu ích, tôi muốn bổ sung thêm một số chi tiết
Phân vùng
Theo mặc định, Kafka sử dụng khóa của tin nhắn để chọn phân vùng của chủ đề mà nó viết. Điều này được thực hiện bởi một cái gì đó như
hash(key) % number_of_partitions
Nếu không có khóa nào được cung cấp, thì Kafka sẽ phân vùng dữ liệu ngẫu nhiên theo kiểu vòng tròn.
Đặt hàng
Như đã nêu trong câu trả lời đã cho, Kafka đảm bảo về việc sắp xếp các tin nhắn chỉ ở cấp độ phân vùng.
Giả sử bạn muốn lưu trữ các giao dịch tài chính cho khách hàng của mình trong một chủ đề Kafka với hai phân vùng. Các thông báo có thể trông giống như (key: value)
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": -1337}
null:{"customerId": 1, "changeInBankAccount": +200}
Vì chúng tôi chưa xác định khóa nên hai phân vùng có lẽ sẽ trông giống như
// partition 0
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": -1337}
Người tiêu dùng của bạn đọc chủ đề đó cuối cùng có thể cho bạn biết rằng số dư trên tài khoản là 600 tại một thời điểm cụ thể mặc dù điều đó không bao giờ đúng! Chỉ vì nó đã đọc tất cả các thư trong phân vùng 0 trước các thư trong phân vùng 1.
Với một khóa hợp lý (như customerId), điều này có thể tránh được vì việc chia thành phần sẽ như thế này:
// partition 0
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": -1337}
1:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
2:{"customerId": 2, "changeInBankAccount": +100}
Ghi nhật ký nén
Nếu không có khóa trong thư của bạn, bạn sẽ không thể đặt cấu hình chủ đề cleanup.policy
thành compacted
. Theo tài liệu "log compaction đảm bảo rằng Kafka sẽ luôn giữ lại ít nhất giá trị đã biết cuối cùng cho mỗi khóa thông báo trong nhật ký dữ liệu cho một phân vùng chủ đề."
Cài đặt hữu ích và tốt đẹp này sẽ không khả dụng nếu không có bất kỳ khóa nào.
Sử dụng các phím
Trong các trường hợp sử dụng thực tế, chìa khóa của thông điệp Kafka có thể có ảnh hưởng rất lớn đến hiệu suất và sự rõ ràng của logic kinh doanh của bạn.
Ví dụ, một khóa có thể được sử dụng tự nhiên để phân vùng dữ liệu của bạn. Vì bạn có thể kiểm soát người tiêu dùng của mình đọc từ các phân vùng cụ thể, điều này có thể đóng vai trò như một bộ lọc hiệu quả. Ngoài ra, khóa có thể bao gồm một số dữ liệu meta về giá trị thực của thông báo giúp bạn kiểm soát quá trình xử lý tiếp theo. Các khóa thường là giá trị nhỏ hơn và do đó sẽ thuận tiện hơn khi phân tích cú pháp một khóa thay vì toàn bộ giá trị. Đồng thời, bạn có thể áp dụng tất cả các tuần tự hóa và đăng ký lược đồ như đã thực hiện với giá trị của bạn cũng bằng khóa.
Lưu ý, cũng có khái niệm Header có thể dùng để lưu trữ thông tin, xem tài liệu hướng dẫn .