Приложение Kafka Streams НЕ дает сбой, когда кластер Kafka выходит из строя

У меня запущено приложение Kafka Streams (0.10.2.1). Когда я выключаю кластер Kafka, приложение потоков продолжает ждать следующего сообщения, когда кластер будет восстановлен, он возобновит прием сообщений. Пока кластер не работает, приложение кажется работает нормально. Я тестировал это более 45 минут.

Я ожидал, что Кафка выбросит исключение или остановится. Я настроил StateListener для регистрации при завершении работы KafkaStreams, однако он никогда не вызывается.

kafkaStreams.setStateListener((newState, _) => {
  if (newState == KafkaStreams.State.NOT_RUNNING) {
    Log.error("Kafka died unexpectedly.")
  }
})

Как заставить Kafka генерировать исключение или завершать работу, когда он не может подключиться к кластеру?

Примечание. Предполагается, что кластер выходит из строя после запуска приложения.


person Mike Rylander    schedule 29.06.2017    source источник
comment
Это очень исключительный случай, поскольку кластер Kafka должен быть достаточно устойчивым в случае сбоев в производстве.   -  person jvwilge    schedule 30.06.2017
comment
@jvwilge Это должен быть исключительный случай, но может и случалось раньше ...   -  person Mike Rylander    schedule 30.06.2017
comment
Вы пробовали установить UncaughtExceptionHandler через KafkaStream.setUncaughtExceptionHandler()? Думаю, вы должны получить исключение и вызвать System.exit().   -  person Matthias J. Sax    schedule 06.07.2017
comment
@ MatthiasJ.Sax Я пробовал это, но это не сработало. Я постараюсь разобраться в этом подробнее ...   -  person Mike Rylander    schedule 06.07.2017
comment
Может быть связано с cwiki.apache.org/confluence/display/KAFKA/ - если да, это проблема клиента, а не потоков.   -  person Matthias J. Sax    schedule 09.07.2017
comment
@ MatthiasJ.Sax Это может быть связано, но я не знаю достаточно, чтобы знать наверняка.   -  person Mike Rylander    schedule 10.07.2017


Ответы (1)


Почему вы хотите, чтобы приложение Kafka Streams перестало работать?

Приложение должно быть устойчивым к сбоям брокера, то есть терпеливо продолжать работу, пока брокер не выздоровеет и не покажется, что это именно то, что он делает. Если у вас есть несколько экземпляров приложения Kafka Streams, и один из них теряет связь с брокером, нагрузка будет перебалансирована на оставшиеся экземпляры. Если каждый экземпляр, потерявший подключение, просто отключится, вы потеряете экземпляры, а вместе с ними потеряете избыточность и параллелизм, даже если подключение к брокеру восстановится. То, как это делается сейчас, Kafka Streams разработано для обеспечения устойчивости. Я бы сказал, что это правильное поведение.

IMHO, если вы хотите обнаруживать сбои брокера (или подключения), это вариант использования для мониторинга, а не для внесения сбоев в приложения Kafka Streams.

person Michal Borowiecki    schedule 02.07.2017
comment
В некоторых случаях предпочтительнее выбросить экземпляр приложения и запустить новый (большинство платформ оркестровки контейнеров поддерживают это из коробки), однако вы должны иметь возможность определить, что приложение находится в плохом состоянии, чтобы это работало. - person Mike Rylander; 04.07.2017
comment
Вопрос был в том, как заставить Kafka генерировать исключение или завершение работы, когда он не может подключиться к кластеру ?. Ваш ответ не отвечает на этот вопрос и лучше подходит в качестве комментария. - person Mike Rylander; 04.07.2017
comment
Справедливо :-) - person Michal Borowiecki; 04.07.2017