Обновления приложения Kafka Streams

Я создал приложение Kafka Streams. Это мой первый вопрос, поэтому я перехожу от мышления, основанного на доказательстве концепции, к вопросу «как я могу это реализовать?» образ мышления.

Версия tl; dr: Я ищу рекомендации и советы по развертыванию потоков kafka, особенно связанные с обновлением кода вашего приложения.

Мне удалось найти много документации о том, как работают Kafka и Streams API, но я не смог найти ничего о фактическом развертывании приложения Streams.

Первоначальное развертывание кажется довольно простым - есть хорошая документация для настройки вашего кластера Kafka, затем вы должны создать темы для своего приложения, а затем вы вполне можете запустить его и опубликовать данные для обработки.

Но что, если вы захотите обновить свое приложение позже? В частности, если обновление содержит изменение топологии. Мое приложение выполняет приличный объем обогащения и агрегации данных в окнах, поэтому вполне вероятно, что в будущем потребуется доработка обработки.

Насколько я понимаю, изменение порядка обработки или добавление дополнительных шагов в топологию приведет к смещению внутренних идентификаторов для каждого шага обработки, то есть в лучшем случае будут созданы новые хранилища состояний, при этом предыдущее состояние будет потеряно, а в худшем - шаги обработки. чтение из неправильной темы государственного магазина при запуске. Это означает, что вам нужно либо сбросить настройки приложения, либо присвоить новой версии новый идентификатор приложения. Но с этим есть некоторые проблемы:

  1. Если вы сбросите приложение или дадите новый идентификатор, обработка начнется с начала исходных и промежуточных тем. Я действительно не хочу дважды публиковать вывод в разделах вывода.
  2. Текущие данные «на лету» будут потеряны, когда вы остановите приложение для обновления (так как это приложение никогда не запустится снова, чтобы возобновить обработку).

Единственный способ, которым я могу это смягчить, - это:

  1. Остановить публикацию данных в исходных темах. Дайте приложению обработать все сообщения, а затем отключите его.
  2. Обрежьте все исходные и промежуточные темы.
  3. Запустить новую версию приложения с новым идентификатором приложения.
  4. Начать издателей.

На данный момент это «нормально», поскольку мое приложение является единственным приложением, которое читает исходные темы, а промежуточные темы в настоящее время не используются, кроме передачи на следующий процессор в том же приложении. Но я вижу, что это становится довольно запутанным.

Есть ли лучший способ обрабатывать обновления приложений? Или мои шаги в целом совпадают с тем, что делают большинство разработчиков?


person shaddow    schedule 07.02.2018    source источник


Ответы (1)


Я думаю, у вас есть полное представление о проблеме, и ваше решение похоже на то, что делает большинство людей в этом случае.

Этот вопрос был задан во время последнего саммита Kafka-Summit после выступления Гвен Шапира и Матиаса Дж. Сакса по поводу развертывания Kubernetes. Ответы были такими же: если ваше обновление содержит модификации топологии, это означает, что последовательное обновление не может быть выполнено.

Похоже, что на данный момент нет KIP по этому поводу.

person Loicmdivad    schedule 02.11.2018