我正在使用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();
答案 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主题)分配一个分区列表。流分区到流任务的分配永远不会改变