Я пытался проверить нашу Кафку на наличие некоторых негативных сценариев, и один из них - очень медленный потребитель. Я установил Thread.sleep(15000)
в моем методе @KafkaListener
(это spring-kafka
) и установил параллелизм на 3. У меня есть 1 тема с 1 разделом.
Я поместил 10 сообщений в тему и запустил сервис.
Когда 3 потребителя начинают, они все получают до (Re-)joining group
пункта,
но тогда только один из них (предположим, что это consumer-2
) доберется до:
Successfully joined group with generation X
И начните медленно потреблять сообщения.
(кстати, я использую режим подтверждения MANUAL_IMMEDIATE, но он воспроизводим, даже когда я не добавляю аргумент Acknowledgement
в слушатель и не подтверждаю сообщения).
Я вижу следующее:
До тех пор, пока все сообщения не будут обработаны потребителем-2, каждые 3 секунды (интервал пульса по умолчанию) Я получил сообщение в консоли:
AbstractCoordinator$HeartbeatResponseHandler: [Consumer clientId=consumer-2, groupId=pixel-group] Attempt to heartbeat failed since group is rebalancing
Интересно, почему это происходит? Только после того, как все 10 сообщений будут обработаны, произойдет еще одна перебалансировка, после которой все 3 потребителя напечатают:
Successfully joined group with generation X
И одному из них будет назначен раздел, и проблем с сердцебиением больше не будет.
Это происходит только тогда, когда я устанавливаю интервал сна на значение выше, чем интервал сердцебиения. Обычно это происходит один раз, когда все потребители запускаются, но вскоре после этого они успешно настроятся.
Итак, если подвести итог, то кажется, что:
Если время обработки потребителем >
время интервала сердцебиения - все, кроме первого потребителя, не могут завершить восстановление баланса (вероятно, они не могут разговаривать со своим медленным Лидером).
Я не понимаю, почему эта ошибка сердцебиения такая постоянная?
Почему остальные потребители не могут закончить балансировку где-то между потреблением сообщений Лидера, если сон длится дольше, чем сердцебиение?
UPDATE
Кафка версия 2.12-2.2.0
Spring-Kafka 2.2.3. РЕЛИЗ