Khoá học ngắn về Kafka

Kafka: partition và consumer group

Kafka chỉ bảo đảm thứ tự bên trong một partition, và chỉ cho mỗi partition đúng một consumer trong group. Hai câu đó nghe đơn giản, nhưng chúng quyết định hai thứ người dùng Kafka hay gặp mà khó giải thích: vì sao thêm partition lại làm hỏng thứ tự của một khoá, và vì sao thêm consumer đôi khi không làm gì cả. Khoá này tính ra câu trả lời bằng đúng thuật toán Kafka dùng, rồi đối chiếu với số đo trên Apache Kafka 4.3.1.

Hai bài, hai con số đáng nhớ Nâng một topic từ 3 lên 6 partition làm 16 trên 32 khoá đổi chỗ, và Kafka không chuyển dữ liệu cũ theo. Còn với chiến lược gán mặc định, một group có 10 consumer đọc một topic 3 partition thì 7 consumer ngồi không — điều đó thì ai cũng đoán được, nhưng cùng chiến lược ấy trên 3 topic × 3 partition cũng chỉ 3 consumer làm việc, trong khi roundrobin cho 9 consumer mỗi người một partition.

Lộ trình

Mỗi bài khoảng 12–15 phút đọc, kèm phòng thí nghiệm chạy ngay trên trình duyệt.

Cách đo

Bộ đo là một broker Kafka duy nhất chạy ở chế độ KRaft trong Docker, cộng với các script shell chép vào container rồi chạy bằng docker exec. Không có thư viện client nào ở giữa: mọi thứ đi qua đúng những công cụ đi kèm Kafka.

docker run -d --name kflab -e KAFKA_NODE_ID=1 … apache/kafka:latest
docker cp do-partition.sh kflab:/tmp/
docker exec kflab sh /tmp/do-partition.sh

Ánh xạ khoá → partition đọc bằng kafka-console-consumer.sh với --property print.partition=true; việc gán partition cho consumer đọc bằng kafka-consumer-groups.sh --describe --members --verbose. Cả hai engine JavaScript trong khoá đều được đối chiếu lại với chính những số liệu đó trước khi đưa vào bài.

Một chỗ phải đo lại mới biết Lần đo đầu tiên cho thấy nhóm ba consumer nhận partition khi dùng range là c1, c2, c3; lần chạy lại với đúng bộ tên đó nhưng thứ tự vào group ngược lại thì nhóm ấy đổi. Nghĩa là kích thước của phần chia thì dự đoán được, còn consumer nào nhận phần nào thì không suy ra được từ tên. Bài 2 nói rõ chỗ này thay vì che đi.