Mục đích của việc nhắn tin dựa trên cặp giá trị / khóa của Kafka là gì? [đóng cửa]


97

Tất cả các ví dụ của Kafka | các nhà sản xuất hiển thị ProducerRecordcặp khóa / giá trị của không chỉ là cùng một loại (tất cả các ví dụ đều hiển thị <String,String>), mà còn cùng một giá trị . Ví dụ:

producer.send(new ProducerRecord<String, String>("someTopic", Integer.toString(i), Integer.toString(i)));

Nhưng trong các tài liệu của Kafka, tôi dường như không thể tìm thấy khái niệm khóa / giá trị (và mục đích / tiện ích cơ bản của nó) được giải thích ở đâu. Trong nhắn tin truyền thống (ActiveMQ, RabbitMQ, v.v.), tôi luôn gửi tin nhắn theo một chủ đề / hàng đợi / trao đổi cụ thể. Nhưng Kafka là nhà môi giới đầu tiên có vẻ như yêu cầu các cặp khóa / giá trị thay vì chỉ một thông điệp chuỗi ole.

Vậy tôi hỏi: Mục đích / hữu ích của việc yêu cầu nhà sản xuất gửi cặp KV là gì?

Câu trả lời:


94

Kafka sử dụng sự trừu tượng của một bản ghi phân tán bao gồm các phân vùng . Chia nhật ký thành các phân vùng cho phép mở rộng hệ thống.

Các phím được sử dụng để xác định phân vùng trong nhật ký mà thông báo được nối vào. Trong khi giá trị là trọng tải thực của tin nhắn. Các ví dụ thực sự không phải là rất "tốt" về vấn đề này; thường thì bạn sẽ có một kiểu phức tạp làm giá trị (như kiểu tuple hoặc JSON hoặc tương tự) và bạn sẽ trích xuất một trường làm khóa.

Xem: http://kafka.apache.org/intro#intro_topicshttp://kafka.apache.org/intro#intro_producers

Nói chung, khóa và / hoặc giá trị cũng có thể là null. Nếu khóa là nullmột phân vùng ngẫu nhiên sẽ được chọn. Nếu giá trị là nullnó, nó có thể có ngữ nghĩa "xóa" đặc biệt trong trường hợp bạn bật log-compaction thay vì chính sách lưu giữ log cho một chủ đề ( http://kafka.apache.org/documentation#compaction ).


2
Và đáng chú ý, các khóa cũng đóng một phần liên quan trong API phát trực tuyến của Kafka, với KStreamKTable- xem tại đây .
reim

12
Các phím có thể được sử dụng để xác định phân vùng, nhưng đó chỉ là chiến lược mặc định của nhà sản xuất. Cuối cùng, nhà sản xuất sẽ chọn phân vùng nào để sử dụng.
gvo

@gvo Chìa khóa có nhiều công dụng hơn không?
leoconco

1
Nó có thể được sử dụng để chỉ giữ một phiên bản của thông báo cho mỗi khóa, như đã đề cập trong liên kết nén nhật ký. Tôi không biết về các trường hợp sử dụng khác.
gvo

2
Nếu bạn chỉ định partitiontham số, nó sẽ được sử dụng và khóa sẽ bị "bỏ qua" (hoặc khóa học, khóa sẽ vẫn được ghi vào chủ đề). - Điều này cho phép bạn phân vùng tùy chỉnh ngay cả khi bạn có khóa.
Matthias J. Sax

17

Bổ sung muộn ... Chỉ định khóa để tất cả các thư trên cùng một khóa đi đến cùng một phân vùng là rất quan trọng để có thứ tự xử lý thư phù hợp nếu bạn có nhiều người tiêu dùng trong một nhóm người tiêu dùng về một chủ đề.

Nếu không có khóa, hai thông báo trên cùng một khóa có thể đi đến các phân vùng khác nhau và được những người tiêu dùng khác nhau trong nhóm xử lý không theo thứ tự.


-1

Một trường hợp sử dụng thú vị khác

Chúng tôi có thể sử dụng thuộc tính khóa trong các chủ đề của Kafka để gửi user_ids và sau đó có thể kết nối người tiêu dùng để tìm nạp các sự kiện phát trực tuyến (các sự kiện được lưu trữ trong các thuộc tính giá trị). Điều này có thể cho phép bạn xử lý bất kỳ lịch sử tối đa nào của chuỗi sự kiện của người dùng để tạo các tính năng trong mô hình học máy của bạn.

Tôi vẫn phải tìm hiểu xem điều này có khả thi hay không. Sẽ tiếp tục cập nhật câu trả lời của tôi với các chi tiết khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.