topic kafka , mô tả partition (producer, consumer , factor replication , offset)

Xin chào, đây là codeshow.
Trong lần này, chúng ta sẽ tìm hiểu về topic và partition trong kafka .
Để sử dụng kafka, bạn phải có topic.
Dựa trên topic này, producer publish thông điệp,
consumer đăng ký tin nhắn.
Chạy kafka để tạo topic .
Vui lòng tham khảo video trước để biết cài đặt môi trường.
Chạy devcontainers để thực hành kafka .
Chờ cho đến khi container chạy.
Khi container chạy xong, chúng ta sẽ mở docker desktop.
Thực thi shell trong container kafka .
Để tra cứu topic , hãy sử dụng option list topics kafka .

kafka-topics --bootstrap-server kafka:9092 --list

Tôi đã xác nhận rằng không có topic nào ngoại trừ các lược topic và giá offsets consumer theo schemas được tạo theo mặc định.
Tạo topic bằng option create của lệnh kafka- topics .

kafka-topics --bootstrap-server kafka:9092 --create --topic hello --partitions 1 --replication-factor 1

Tôi đã tạo topic có tên hello bằng lệnh topics kafka .
Tên của topic được chỉ định bằng cách sử dụng option name .
option factor replication là option để chọn số lượng bản sao dữ liệu partition cần tạo.
Tôi đặt giá trị factor bản sao bằng số nút kafka .
Giá trị cao hơn phát sinh chi phí sao chép phân vùng giữa các nút, điều này ảnh hưởng đến hiệu suất.
Thay vào đó, nếu giá trị nhỏ, dữ liệu có thể bị mất trong trường hợp lỗi kafka .
Giá trị từ 3 trở lên thường được khuyến nghị.

Để tham khảo, sẽ xảy ra lỗi nếu bạn đặt factor replication lớn hơn số nút kafka tại thời điểm create .

kafka-topics --bootstrap-server kafka:9092 --create --topic error --partitions 1 --replication-factor 4

Tôi sẽ giải thích partitions với một option khác.
partition là thông tin rất quan trọng trong kafka.
option partitions là thông tin đặt số lượng topic được chia thành.
Nếu producer publish 100 topic và topic này chỉ có 1 partition,
100 topic được xếp chồng lên nhau trong 1 partition.
Nếu consumer mất 1 phút để xử lý 1 topic.
Sẽ mất 100 phút để xử lý 100 topic .
Nếu bạn đặt partition thành 4, topic sẽ được xếp chồng lên nhau 25 trong mỗi 4 phân vùng.
Vì một partition có thể có nhiều nhất một consumer,
Bây giờ bạn có thể thêm 3 consumer nhiều như số lượng phân vùng tăng lên.
Thời gian xử lý có thể giảm 1/4 từ 100 phút xuống còn 25 phút.

Chúng tôi sẽ thực hành các nội dung cho đến nay bằng cách sử dụng shell.
Tôi sẽ thực hành producer và consumer về topic hello .
Chạy terminal trong container kafka .
Đặt producer ở bên trái và consumer ở bên phải.
Kết nối với kafka bằng lệnh producer console kafka .

kafka-console-producer --bootstrap-server kafka:9092 --topic hello 

producer được kết nối với broker kafka .

Kết nối với kafka bằng lệnh consumer console điều khiển kafka .
partition tăng tuần tự từ chỉ số 0.
Trong thực tế, vì size partition là 1 nên chỉ có thể sử dụng partition 0.
Nhập số partition 0 làm option .

kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 0

Nhập tin message hello cho producer .
Bạn có thể kiểm tra hello trong consumer .

Vì vậy, nhiều consumer có thể kết nối với một partition không?
Hãy chạy một terminal bổ sung và thêm consumer.

kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 0

consumer kết nối mà không có vấn đề.

Vậy điều gì sẽ xảy ra khi bạn publish một tin nhắn với tư cách là producer ?
Có hai kịch bản.

  1. Tin nhắn được gửi tuần tự, một lần theo thứ tự của consumer .
    Đây được gọi là phương pháp round robin .
  2. Tất cả các thông điệp được gửi đến tất cả consumer.
    Tên được gọi là broadcasting.

Nhập tin nhắn hello1 là producer để kiểm tra hoạt động.
Một thông báo hello1 xuất hiện trên cả hai consumer.
Nhập lại tin nhắn hello2 với tư cách là producer.
Một thông báo hello2 xuất hiện trên cả hai consumer.
Trong kafka , tất cả consumer được kết nối với cùng một partition sẽ nhận được tin nhắn thông qua broadcasting .

Để tham khảo, rabbit mq, một broker message khác, có thể kết nối nhiều worker với một queue .
Và với round robin, worker nhận được tin nhắn một cách tuần tự.
Phần này hoạt động khác với kafka nên những ai lần đầu trải nghiệm rabbit mq có thể bị nhầm lẫn.
rabbit mq tăng thông lượng bằng cách tăng size worker trong một queue ,
kafka tăng thông lượng bằng cách tăng size partition của một topic .

Trong bài tập này, chúng ta sẽ thay đổi số lượng partition.
Hãy tăng số lượng partition từ 1 lên 2.
Thoát khỏi producer bằng cách nhấn ctrl c.
Hãy tăng size partition lên 2 bằng option alter của lệnh topics kafka .

kafka-topics --bootstrap-server kafka:9092 --alter --partitions 2 --topic hello

Kiểm tra thông tin phân vùng bằng tùy chọn describe của topics kafka .

kafka-topics --bootstrap-server kafka:9092 --topic hello --describe

Để tham khảo, bạn cũng có thể kiểm tra size partition đã tăng lên 2 trên màn hình topic của AKHQ .
Thực thi lại producer và thêm consumer vào partition mới được thêm vào #1.

kafka-console-producer --bootstrap-server kafka:9092 --topic hello 

Chấm dứt consumer được kết nối với partition 0 hiện có và kết nối consumer với partition mới 1.

kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 0
kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 1

Tạo một số lượng tin nhắn ngẫu nhiên với producer.
Có hai consumer, nhưng topic được chia và giao cho chỉ một consumer.

Đây là cách cache partition sticky kafka hoạt động khi không có key .
Nếu không có key, số partition được gửi đầu tiên cache và topic chỉ được chuyển tiếp tới partition này.
Nếu không có key thì việc tăng partition là vô nghĩa vì chỉ sử dụng 1 partition .
Nói cách khác, key là thông tin quan trọng xác định partition trong topic sẽ được lưu trữ trong kafka .
Chúng tôi sẽ thêm key để topic được phân chia và lưu trữ tốt giữa partition .

Thêm option property vào producer và chạy lại.

kafka-console-producer --bootstrap-server kafka:9092 --topic hello --property "key.separator=-" --property "parse.key=true"

Hãy đặt một giá trị ngẫu nhiên là producer.
Bây giờ bạn có thể thấy rằng topic được chia thành partition và được lưu.
Cụ thể, bạn có thể kiểm tra xem cùng một key có publish cho cùng một partition thông qua consumer hay không.

Sử dụng option separator key , key trước dấu gạch ngang và value sau nó được publish.
a là key và b là value.
Để tham khảo, trước đây, chỉ value hello được publish mà không key .

Nếu các giá trị trước dấu gạch ngang giống nhau, key cũng giống nhau.
Điều quan trọng là cùng một key luôn được lưu trữ trong cùng một partition.
Tuy nhiên, nếu key khác nhau, chúng sẽ được lưu trữ trong cùng một partition hoặc partition khác nhau.
Để hiểu phần này, hãy xem cách xử lý key trong kafka .
kafka hash key và tính toán phần còn lại bằng số nút kafka và xác định giá trị kết quả là số partition .
Vì hiện tại có hai partition nên chỉ 0 và 1 có thể xuất hiện dưới dạng số partition .
Để tham khảo, thuật toán hash sử dụng hash murmur2 .

Một điểm quan trọng cần hiểu về partition là kafka chỉ đảm bảo thứ tự của topic trên cơ sở partition .
Nghĩa là, khi publish topic có thứ tự quan trọng, hãy đặt chúng vào cùng một partition.
Tôi đã kiểm tra rằng giá trị key luôn được lưu trữ trong cùng một partition,
Đối với topic quan trọng về thứ tự, hãy đảm bảo sử dụng cùng một key!

Tiếp theo, tôi sẽ giải thích offset của partition .
kafka khác với queue message hiện có ở chỗ nó không xóa tin nhắn khỏi queue sau khi consume .

Phân vùng tương tự như mảng.
topic trong partition được lưu trữ theo thứ tự, giống như các phần tử của một mảng.
Giống như bạn truy cập một giá trị mảng theo chỉ mục, bạn có thể consume từ một chỉ mục cụ thể của partition thông qua offset .
Để tham khảo, mỗi partition có offset cuối cùng.
Vì vậy, nếu một consumer mới được kết nối mà không có option offset , thì nó consume từ offset cuối cùng .
Tuy nhiên, nếu một option offset được cung cấp, thông tin offset sẽ được consume trước tiên.

Như một bài tập, chúng tôi sẽ đưa ra hai lệnh cho terminal.

  1. Ra lệnh cho consumer thực hiện từ offset 0.
  2. Lệnh thực hiện consumer không có lệnh offset .
kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 1 --offset 0
kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 1 

Nếu bạn đưa ra option offset index 0, bạn có thể kiểm tra xem nó có được thực hiện lại từ đầu hay không.
Nếu không có option offset , tùy chọn offset sẽ mặc định là mới nhất.
Chỉ consume topic mới publish .

Cuối cùng, như một ràng buộc quan trọng đối với partition,
Bạn không thể đặt một giá trị nhỏ hơn cho size partition .
Chỉ có thể nhập các giá trị lớn hơn cho size partition .
Tôi sẽ đưa ra lệnh alter để giảm partition từ 2 xuống 1.

kafka-topics --bootstrap-server kafka:9092 --alter --partitions 1 --topic hello

Bạn có thể thấy thông báo lỗi yêu cầu bạn đặt option partition thành giá trị lớn hơn 2.

Điều này kết thúc phần giải thích về topic và partition của kafka .
Lần tới, chúng ta sẽ xem xét cách sử dụng groups consumer .
Để tham khảo, thay vì consumer trực tiếp consume partition ,
groups consumer được sử dụng nhiều hơn trong thực tế.
Để hiểu rõ hơn về groups consumer này, lớp này
Tôi đã có thời gian để tìm hiểu partition.

Cài đặt thông báo đăng ký và thích rất hữu ích cho người tạo nội dung.

Cảm ơn