Kafka Streaming 1.0将分区分配给线程

时间:2018-03-19 15:07:22

标签: apache-kafka apache-kafka-streams

我正在使用Kafka Streaming,采用无状态简单处理器拓扑。

我有一个包含100个分区的主题,有2台机器,每个机器有50个线程,并且运行相同的流媒体应用程序,所以最终我将在它之间进行1-1映射。

主题中的消息已经是键控消息。

我有一个逻辑约束,一旦一个线程挂钩到一个或更多的分区,它应该继续处理这些分区(当然,直到重启发生,它将重新洗牌)

我从日志中看到线程重复(重新)加入消费者群体。

我的问题是,kafka-streaming api保证线程能够处理最初在app启动时挂钩的相同分区,或者它会不时地进行重新调整。

我检查过这些文件,但是我无法找到任何详细讨论这个问题的内容。

以下是我正在使用的代码:

StreamsBuilder builder = new StreamsBuilder();

KStream<String, Document> topicStreams = builder.stream(sourceTopic);

topicStreams.process(() -> new CustomMsgProcessor());

KafkaStreams streams = new KafkaStreams(builder.build(), config);
streams.start();

1 个答案:

答案 0 :(得分:1)

  

我的问题是,kafka-streaming api保证线程能够处理最初在app启动时挂钩的相同分区,或者它会不时地进行重新调整。

当您的Streams应用程序启动时,您指定了it builds the number of threads并设置线程以侦听分区分配。将分区分配给线程时,它为creates tasks for those partitions。当这些分区接收输入时,线程processes the input with their respective tasks

因此,如果我正确理解您的约束,given the lifecycle of the Streams application,是的:一旦线程收到分区分配,它将继续处理该分区,直到它关闭或重新平衡。

Architecture中说:

  

Kafka Streams根据应用程序的输入流分区创建固定数量的流任务,每个任务从输入流(即Kafka主题)分配一个分区列表。流分区到流任务的分配永远不会改变