Bài 2
Ai đọc partition nào
Trong một consumer group, mỗi partition được giao cho đúng một consumer. Việc chia đó do một lớp assignor làm, và Kafka có bốn lớp sẵn cho ra bốn kết quả khác nhau trên cùng một cấu hình. Bài này đo cả bốn trên Kafka 4.3.1, trong đó có một trường hợp 9 partition chia cho 4 consumer mà vẫn có một consumer không nhận gì.
Luật duy nhất
Một partition được giao cho nhiều nhất một consumer trong cùng group. Từ đó ra hai hệ quả mà ai cũng biết: số consumer làm việc không bao giờ vượt quá số partition, và số partition là trần cứng của mức song song. Điều ít được nói tới là phần còn lại — cách chia — không phải một chi tiết nhỏ. Nó quyết định liệu trần đó có được dùng hết hay không.
Bộ đo dưới đây dựng group bằng chính công cụ đi kèm Kafka, rồi đọc kết quả gán ra:
kafka-console-consumer.sh --include 't3[abc]' --group g1 \
--consumer-property group.protocol=classic \
--consumer-property partition.assignment.strategy=\
org.apache.kafka.clients.consumer.RangeAssignor
kafka-consumer-groups.sh --describe --group g1 --members --verbose
# CLIENT-ID #PARTITIONS CURRENT-ASSIGNMENT
# c1 6 t3a:0,1;t3b:0,1;t3c:0,1
# c2 3 t3a:2;t3b:2;t3c:2
range chia theo từng topic
RangeAssignor là mặc định. Nó xử lý từng topic một cách độc lập:
với mỗi topic, mỗi consumer nhận ⌊P/C⌋ partition liền nhau, và P mod C consumer đầu danh sách
nhận thêm một partition.
Trên một topic đơn lẻ, cách chia đó hợp lý. Trên nhiều topic thì nó lặp lại y hệt, nên phần dư của mọi topic đều rơi vào cùng những consumer đầu danh sách. Ba topic cùng dư một partition nghĩa là consumer đầu nhận thêm ba, chứ phần dư không được rải ra.
Đo trên ba topic 3 partition, hai consumer:
| consumer | được gán | số partition |
|---|---|---|
| c1 | t3a:0,1;t3b:0,1;t3c:0,1 | 6 |
| c2 | t3a:2;t3b:2;t3c:2 | 3 |
Sáu so với ba: một consumer gánh gấp đôi. Cùng cấu hình đó, roundrobin cho 5 và 4.
3, 3, 3, 0. Với roundrobin trên đúng cấu hình đó:
3, 2, 2, 2.
roundrobin trải cả group
RoundRobinAssignor gộp mọi cặp topic–partition của cả group thành
một danh sách, sắp theo tên topic rồi số hiệu partition, và phát lần lượt cho từng consumer.
Vì danh sách không bị cắt theo topic nên phần dư của topic này bù vào topic kia.
Cùng ba topic 3 partition, hai consumer:
| consumer | được gán | số partition |
|---|---|---|
| c1 | t3a:0,2;t3b:1;t3c:0,2 | 5 |
| c2 | t3a:1;t3b:0,2;t3c:1 | 4 |
Chênh lệch tối đa giữa hai consumer bất kỳ luôn là 1 partition, vì đó là tính chất của việc phát vòng tròn. Trên mười consumer và 9 partition, roundrobin cho 9 consumer mỗi người một partition, một người trắng tay, trong khi range cho 3 consumer mỗi người ba partition và 7 người trắng tay. Cùng một group, cùng một tập topic.
Trên topic lệch nhau thì khác biệt cũng rõ: một topic 5 partition cộng một topic 1 partition, hai consumer. range cho 4 và 2; roundrobin cho 3 và 3.
sticky và cooperative-sticky
StickyAssignor cũng chia đều như roundrobin nhưng theo cách khác: nó xếp partition
xen kẽ theo số hiệu — mọi partition số 0 của các topic trước, rồi mọi
partition số 1 — rồi lấp đầy từng consumer tới hạn ngạch thay vì phát vòng
tròn. Trên ba topic 3 partition, hai consumer, đo được:
| consumer | được gán | số partition |
|---|---|---|
| c1 | t3a:0,1;t3b:0,1;t3c:0 | 5 |
| c2 | t3a:2;t3b:2;t3c:1,2 | 4 |
Vẫn 5 và 4 như roundrobin, nhưng gom khác. Đúng bằng danh sách xen kẽ
t3a:0, t3b:0, t3c:0, t3a:1, t3b:1, t3c:1, t3a:2, t3b:2, t3c:2 cắt ở phần tử
thứ năm.
t3a:0;t3b:0;t3c:0, t3a:1;t3b:1,
t3a:2;t3b:2 và t3c:1,2: kích thước vẫn đúng 3, 2, 2, 2 như hạn ngạch
dự đoán, nhưng cách gom thì khác. Không có thứ tự tĩnh nào giải thích được cả ba cỡ group, nên
với sticky chỉ nên dựa vào kích thước phần chia. Phòng thí nghiệm bên dưới ghi rõ giới hạn này
ngay dưới kết quả.
Cái tên “sticky” nói về những lần gán sau: khi một consumer rời group, nó cố giữ nguyên phần đã gán cho những consumer còn lại, thay vì xáo lại từ đầu. Phòng thí nghiệm trong bài này chỉ dựng lần gán đầu tiên, khi chưa có gì để bám lại.
Bảng số
Ba topic, mỗi topic 3 partition, tổng 9 partition. Số partition mỗi consumer nhận được:
| số consumer | range | roundrobin | sticky | consumer ngồi không |
|---|---|---|---|---|
| 2 | 6, 3 | 5, 4 | 5, 4 | không ai |
| 3 | 3, 3, 3 | 3, 3, 3 | 3, 3, 3 | không ai |
| 4 | 3, 3, 3, 0 | 3, 2, 2, 2 | 3, 2, 2, 2 | range: 1 người |
| 10 | 3, 3, 3, và 7 số 0 | chín số 1, một số 0 | chín số 1, một số 0 | range: 7 người |
Topic lệch nhau — một topic 5 partition và một topic 1 partition, hai consumer:
| chiến lược | c1 | c2 |
|---|---|---|
| range | u1:0;u5:0,1,2 — 4 partition | u5:3,4 — 2 partition |
| roundrobin | u1:0;u5:1,3 — 3 partition | u5:0,2,4 — 3 partition |
| sticky | u1:0;u5:0,1 — 3 partition | u5:2,3,4 — 3 partition |
Với một topic duy nhất thì ba chiến lược gần như tương đương về số lượng, chỉ khác partition
nào về tay ai: trên một topic 3 partition và hai consumer, range cho
0,1 và 2, còn roundrobin cho 0,2 và 1. Nói
cách khác, mọi khác biệt trong bài này chỉ hiện ra khi group đọc từ nhiều hơn một
topic. Group một topic thì chọn chiến lược nào cũng như nhau.
Thứ đoán được và thứ không
Engine trong phòng thí nghiệm tái hiện đúng tập các phần chia ở cả 16 kịch bản đã đo. Nhưng có một thứ nó không tái hiện được, và cũng không nên hứa: consumer nào nhận phần nào.
Cho đúng mười consumer tên c1…c10 vào một group range
đọc một topic 3 partition, hai lần, chỉ khác thứ tự vào group. Lần thứ nhất ba consumer nhận
partition là c1, c10, c2; lần thứ hai là c1, c2, c3. Chạy lại
roundrobin cũng ra bộ khác với lần trước. Nghĩa là thứ tự nội bộ không suy ra được
từ tên client.
Phòng thí nghiệm
Tự đặt topic, số partition và số consumer, rồi đổi chiến lược để so. Thuật toán là bản viết lại của ba assignor và đã tái hiện đúng tập phần chia ở 16 kịch bản đo trên Kafka 4.3.1.
Ai đọc partition nào
Cấu hình
Nhớ gì
- Mỗi partition thuộc về đúng một consumer trong group; số partition là trần cứng của mức song song.
rangechia từng topic độc lập, nên phần dư dồn hết vào những consumer đầu danh sách. Ba topic 3 partition với 4 consumer cho3, 3, 3, 0.roundrobintrải cả group nên chênh lệch giữa hai consumer bất kỳ không quá 1 partition. Cùng cấu hình đó nó cho3, 2, 2, 2.stickychia đều như roundrobin nhưng gom theo số hiệu partition, vàcooperative-stickychia y hệt sticky — khác biệt nằm ở giao thức rebalance.- Group chỉ đọc một topic thì bốn chiến lược cho cùng số lượng; mọi khác biệt chỉ hiện ra khi có nhiều topic.
- Hình dạng phép chia thì đoán được, danh tính người nhận thì không.
Bài trước giải thích nửa còn lại: khoá nào rơi vào partition nào.