Я использую приложение Kafka Streams с тремя под-топологиями. Этапы деятельности примерно таковы:
stream
Тема A
selectKey
и перераспределение Тема A to
Тема B
stream
Тема B
foreach
От темы B к теме C Producer
stream
Тема C
- Тема C
to
Тема D
Темы A, B и C материализуются, что означает, что если каждая тема имеет 40 разделов, мой максимальный параллелизм равен 120.
Сначала я запускал 5 потоковых приложений по 8 потоков на штуку. С этой настройкой я испытывал противоречивые результаты. Похоже, что некоторые под-топологии, использующие один и тот же поток, были более требовательны к процессору, чем другие, и через некоторое время я получил бы такую ошибку: Member [client_id] in group [consumer_group] has failed, removing it from the group (kafka.coordinator.group.GroupCoordinator)
. Все будет перебалансировано, что может привести к снижению производительности до следующего сбоя и перебалансировки.
У меня следующие вопросы:
- Как получается, что несколько под-топологий могут быть запущены в одном потоке? Очередь опроса?
- Как каждый поток решает, как распределить вычислительные ресурсы для каждой из его под-топологий?
- Как оптимизировать соотношение потоков к разделам в таких случаях, чтобы избежать периодических сбоев потребителей? например, обеспечит ли соотношение 1: 1 более стабильную производительность?
- Если вы используете соотношение 1: 1, как вы гарантируете, что каждому потоку назначается собственный раздел-тема, а некоторые потоки не остаются без дела?