Как масштабировать приложение Kafka Stream - PullRequest
0 голосов
/ 30 января 2019

Меня немного смущает формулировка этой темы в документации kafka, поэтому я хочу спросить здесь, правильно ли я здесь интерпретирую или нет?

Так что, если я правильно понимаю, это единственный способмасштабировать приложение Kafka Stream, чтобы запустить новый экземпляр приложения (или увеличить количество потоковых потоков в приложении), это обеспечит увеличение числа потребителей в consumerGroup ('application.id'), поэтому я могу масштабировать свойПотоковое приложение до количества разделов темы (на самом деле, что произойдет, если моя потоковая топология подключена к нескольким темам, скажем, TopicA с 5 разделами и topicB с 3 Я присоединился к потокам для TopicA и TopicB, я думаю, я могу масштабироваться до3 экземпляра / потока в этом случае).

Теперь допустим, что у меня есть тема A с 5 разделами, и я запустил 3 экземпляра моего приложения, и если я настроил KTable в своей топологии, каждый KTable будет содержать информацию из определенного раздела.и я должен выяснитьповерх метаданных, в каком экземпляре (разделе) мой Key, так что же происходит, когда я запускаю 4-й экземпляр, скажем, ключ / значение, которое было KTable на instance3, теперь может перейти к KTable на instance4, не так ли?Один побочный вопрос, как долго продлится такая перебалансировка (думаю, это зависит от размера темы, поэтому предположим, что это займет 1 минуту, будет ли мое приложение, запрашивающее KTable, не отвечать на запросы во время этой операции?)

AДополнительный вопрос, будет ли этот механизм работать точно так же для 'streamBuilder.table (..)' и 'streambuilder.groupByKey (..). redu (..)' '?

И еще один последний вопрос, сноваТема с 5 разделами, но вместо запуска 3 экземпляров приложения, я запустил один экземпляр с 3 потоковыми потоками (num.stream.threads = 3), у меня снова будет 3 KTable, представляющих 5 разделов, будет ли он вести себя точно так же, как увеличениеномер экземпляра, если я изменю размер потока с 3 на 4.

Спасибо за ответы ..

1 Ответ

0 голосов
/ 30 января 2019

скажем, TopicA с 5 разделами и topicB с 3 Я присоединился к потокам для TopicA и TopicB, я предполагаю, что в этом случае я могу увеличить до 3 экземпляров / потоков).

Прежде всего, чтобы объединить две темы, они должны иметь одинаковое количество разделов.Это ключевое требование для вступления.Если у вас есть Тема A с 5 и Тема B с 3 разделами, она никогда не выполнит соединение.(https://docs.confluent.io/current/streams/developer-guide/dsl-api.html#join-co-partitioning-requirements)

что происходит, когда я запускаю 4-й экземпляр,

Да, потоки Kafka будут перебалансировать рабочую нагрузку между экземплярами на основе количестваразделы. Он переназначит разделы и их задачи, включая локальные хранилища состояний. Время зависит от размера темы. Если конечный пользователь запрашивает ktable, вы должны предпочесть сбор метаданных из всех экземпляров и выполнить поиск.

будет ли этот механизм работать точно так же для 'streamBuilder.table (..)' и 'streambuilder.groupByKey (..). Redu (..)' '?

Да,тот же механизм используется всякий раз, когда создается ktable с использованием любого преобразования.

снова тема с 5 разделами, но вместо запуска 3 экземпляров приложения, я запустил один экземпляр с 3 потоковыми потоками (num.stream.threads = 3) у меня снова будет 3 KTable, представляющих 5 разделов, будет ли он вести себя точно так же, как увеличение количества экземпляров, если я изменю размер потокас 3 по 4.

По умолчанию Kafka Streams разбивает топологию на 5 задач (= количество разделов). Если для num.stream.threads установлено значение 3, эти задачи будут распределены поуказанные темы.Следовательно, thread-1 может выполнять 2 задачи, thread-2 может выполнять следующие 2 задачи, а thread-3 может запускать 1 задачу.
Состояние KTable будетразделить на 5 осколков (= количество перегородок), и один осколок будет сопоставлен с одной задачей.Следовательно, каждая задача создаст локальный магазин, исключая саму себя.Эти локальные хранилища содержат данные соответствующего шарда.Несмотря на количество потоков, вы получите local-store равным количеству разделов.

Пример:

image

После добавления еще одного экземпляра

image

...