Rebalance là quá trình phân bổ lại partition cho các consumer trong group. Nó xảy ra khi consumer tham gia/rời group, khi consumer bị coi là chết (quá session.timeout.ms không gửi heartbeat, hoặc quá max.poll.interval.ms không gọi poll()), hoặc khi số partition của topic thay đổi.
Ảnh hưởng: với giao thức eager mặc định trước đây, toàn bộ consumer nhả hết partition rồi mới nhận lại — cả group ngừng xử lý trong thời gian đó (stop-the-world). Ngoài ra:
- Message đang xử lý dở mà chưa commit offset sẽ được xử lý lại bởi consumer mới → thêm bản trùng.
- State cục bộ trong consumer (cache, buffer gom lô) mất theo.
- Rebalance liên tiếp (rebalance storm) khiến throughput gần như bằng 0 dù consumer vẫn "sống".
Giảm tác động:
max.poll.recordsnhỏ lại để một vòngpoll()luôn kết thúc trongmax.poll.interval.ms. Đây là nguyên nhân số một của rebalance storm ở hệ thống thật: mỗi lô gọi API ngoài quá lâu.- Static membership (
group.instance.id): consumer khởi động lại — khi deploy chẳng hạn — giữ nguyên partition cũ nếu quay lại trongsession.timeout.ms, không kích hoạt rebalance. - Cooperative rebalancing (
CooperativeStickyAssignor): chỉ chuyển những partition thực sự cần đổi chủ, các consumer khác tiếp tục chạy. - Commit offset trước khi partition bị thu hồi trong
onPartitionsRevokedđể giảm số message xử lý lặp. - Consumer idempotent — dù chỉnh gì thì rebalance vẫn sinh trùng, đây mới là lớp bảo vệ cuối.