Jika client konsumen Anda memicu rebalance terlalu sering, penyebab utamanya biasanya adalah pemrosesan pesan yang lambat, konfigurasi parameter konsumen yang tidak tepat, atau penggunaan versi client yang sudah usang. Topik ini menjelaskan penyebab berdasarkan versi client dan memberikan solusi yang sesuai.
Gejala
Rebalance terjadi secara sering pada client konsumen Anda saat menggunakan ApsaraMQ for Kafka.
Penyebab
Penyebabnya bergantung pada versi client yang digunakan.
Client versi sebelum 0.10.2: Konsumen tidak memiliki thread heartbeat terpisah. Heartbeat dikirim melalui metode
poll(). Jika pemrosesan pesan memakan waktu terlalu lama, permintaan heartbeat mengalami timeout dan memicu rebalance.Client versi 0.10.2 atau lebih baru: Terdapat thread heartbeat terpisah. Namun, jika tidak ada pesan yang ditarik setelah waktu yang ditentukan oleh
max.poll.interval.msberlalu, client keluar dari consumer group dan memicu rebalance. Nilai defaultmax.poll.interval.msadalah 5 menit.
Parameter kunci
Parameter berikut mengontrol perilaku rebalance:
| Parameter | Versi yang berlaku | Deskripsi |
|---|---|---|
session.timeout.ms | Semua | Session timeout. Jika tidak ada heartbeat yang diterima dalam periode ini, broker menghapus konsumen dari consumer group. |
max.poll.records | Semua | Jumlah maksimum pesan yang dikembalikan per panggilan ke metode poll(). |
max.poll.interval.ms | 0.10.2 atau lebih baru | Interval maksimum antara dua panggilan berturut-turut ke metode poll(). Jika interval ini dilampaui, konsumen keluar dari consumer group dan memicu rebalance. |
Solusi
Sesuaikan nilai parameter
Konfigurasikan parameter berikut berdasarkan versi client Anda:
session.timeout.msVersi client Nilai yang direkomendasikan Sebelum 0.10.2 Lebih besar daripada waktu untuk memproses satu batch pesan, tetapi tidak lebih dari 30 detik. Disarankan 25 detik. 0.10.2 atau lebih baru Pertahankan nilai default 10 detik. max.poll.recordsTetapkan nilai ini jauh lebih kecil daripada hasil rumus berikut:
max.poll.records << messages_per_thread_per_second * number_of_threads * max.poll.interval.msmax.poll.interval.ms(hanya untuk versi 0.10.2 atau lebih baru)Tetapkan nilai ini lebih besar daripada hasil rumus berikut:
max.poll.interval.ms > max.poll.records / (messages_per_thread_per_second * number_of_threads)Tingkatkan kecepatan konsumsi dan pisahkan thread pemrosesan
Tingkatkan kecepatan pemrosesan pesan dengan mengalokasikan thread terpisah untuk logika konsumsi. Hal ini mencegah pemrosesan lambat menghambat heartbeat atau melebihi interval poll.
Kurangi jumlah topik per consumer group
Kurangi jumlah topik yang di-subscribe oleh setiap consumer group. Subscribe tidak lebih dari lima topik per consumer group. Untuk stabilitas optimal, subscribe satu topik per consumer group.
Lakukan upgrade ke versi 0.10.2 atau lebih baru
Jika Anda menggunakan client versi sebelum 0.10.2, lakukan upgrade ke versi 0.10.2 atau lebih baru. Versi yang lebih baru menggunakan thread heartbeat terpisah, sehingga penundaan pemrosesan tidak menyebabkan timeout heartbeat.