我正在使用Kafka Streaming,具有无状态的简单处理器拓扑。
我有一个包含 100 个分区的主题,有 2 台机器,每台机器有 50 个线程,并且运行相同的流媒体应用程序,因此最终我将在两者之间进行 1-1 映射。
主题中的消息已是键控消息。
我有一个逻辑约束,一旦线程挂到一个或更多分区,它应该继续处理这些分区(当然,直到重新启动发生,它会重新洗牌)
我从日志中看到线程反复(重新)加入消费者组。
我的问题,kafka 流 api 是否保证线程处理它最初挂在应用程序启动上的相同分区,或者它时不时地重新洗牌。
我检查了文档,但我找不到任何详细讨论的内容。
这是我正在使用的代码:
StreamsBuilder builder = new StreamsBuilder();
KStream<String, Document> topicStreams = builder.stream(sourceTopic);
topicStreams.process(() -> new CustomMsgProcessor());
KafkaStreams streams = new KafkaStreams(builder.build(), config);
streams.start();
我的问题,kafka 流 api 是否保证线程处理它最初在应用程序启动时挂载的相同分区,或者它不时地重新洗牌。
当 Streams 应用程序启动时,它会生成指定的线程数,并将线程设置为侦听分区分配。将分区分配给线程时,它会为这些分区创建任务。当这些分区接收输入时,线程会使用各自的任务处理输入。
因此,如果我正确理解您的 contraint,考虑到 Streams 应用程序的生命周期,是的:一旦线程收到分区分配,它将继续处理该分区,直到它关闭或重新平衡。
在建筑中,它说:
Kafka Streams 根据应用程序的输入流分区创建固定数量的流任务,每个任务都分配一个来自输入流的分区列表(即 Kafka 主题)。流分区分配给流任务永远不会改变