Да, есть разница и разные компромиссы:
1) Первая версия, использующая through()
, создаст «линейный план» и разделит топологию на две под-топологии. Обратите внимание, что through("topic")
является точной вещью как to("topic")
плюс builder.stream("topic")
.
mainStream -> grp -> agg -> toStream -> to -> TOPIC -> builder.stream -> subStream
Первая под-топология будет от mainStream
до to()
; "aggregate-topic"
отделяет его от второй подтологии, которая состоит из builder.stream()
и подает в subStream
. Это означает, что все данные сначала записываются в "aggregate-topic"
, а затем считываются. Это увеличит задержку сквозной обработки и увеличит нагрузку на брокера для дополнительной операции чтения. Преимущество состоит в том, что обе субтологии могут быть распараллелены независимо. Их параллелизм является независимым и определяется количеством соответствующих им разделов входных тем. Это создаст больше задач и, таким образом, обеспечит больший параллелизм, так как обе под-топологии могут выполняться в разных потоках.
2) Вторая версия создаст «разветвленный план» и будет выполнена в виде одной под-топологии:
mainStream -> grp -> agg -> toStream -+-> to -> TOPIC
|
+ -> subStream
После toStream()
данные логически транслируются в оба последующих оператора. Это подразумевает, что в "aggregate-topic"
нет обхода, но записи пересылаются в памяти в subStream
. Это уменьшает сквозную задержку и не требует считывания данных из кластера Kafka. Однако вы можете выполнять меньше задач и, следовательно, уменьшить максимальный параллелизм.