Java 添加空处理器时,Kafka Streams处理速度减慢
考虑一下这个卡夫卡流驱动程序Java 添加空处理器时,Kafka Streams处理速度减慢,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,考虑一下这个卡夫卡流驱动程序 public class TestDriver { private static final String SOURCE = "SOURCE"; public static void main(String[] args) throws Exception { ProtoDeserializer<Message> protoDeserializer = new ProtoDeserializer<>(Me
public class TestDriver {
private static final String SOURCE = "SOURCE";
public static void main(String[] args) throws Exception {
ProtoDeserializer<Message> protoDeserializer = new ProtoDeserializer<>(Message.parser());
ProtoSerializer<Message> protoSerializer = new ProtoSerializer<>();
StringDeserializer stringDerializer = new StringDeserializer();
StringSerializer stringSerializer = new StringSerializer();
Topology topologyBuilder = new Topology();
topologyBuilder.addSource(SOURCE, stringDerializer, protoDeserializer, "input-messages")
.addProcessor(DummyProcessor.NAME, DummyProcessor::new, SOURCE)
.addSink("MAIN", "output-messages", stringSerializer, protoSerializer, DummyProcessor.NAME)
;
KafkaStreams streams = new KafkaStreams(topologyBuilder, getConfig());
streams.cleanUp();
streams.start();
System.out.println(streams.toString());
Runtime.getRuntime().addShutdownHook(new Thread(streams::close));
}
private static Properties getConfig() {
Properties config = new Properties();
config.put(StreamsConfig.CLIENT_ID_CONFIG, "test.stream-processor");
config.put(StreamsConfig.APPLICATION_ID_CONFIG, "test.stream-processor");
config.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "broker-1:9092,broker-2:9092,broker-3:9092");
config.put(StreamsConfig.REPLICATION_FACTOR_CONFIG, 3);
config.put(StreamsConfig.NUM_STREAM_THREADS_CONFIG, 10);
config.put(StreamsConfig.DEFAULT_TIMESTAMP_EXTRACTOR_CLASS_CONFIG, WallclockTimestampExtractor.class);
return config;
}
}
添加单个“空”处理器是否会对Streams性能造成如此大的开销?原因是什么?Kafka Streams是否如此智能,以至于当没有处理器时,它不会执行protobuf serde,而只转发接收到的数据?无论如何,要加快速度吗
有了这样的速度,我需要更多x千个cpu线程来处理我所有的数据,因为25k消息/秒是我拥有的数据的1%。这听起来太多了。问题是因为经常请求提交 您根本不需要调用
ProcessorContext:commit()
。
卡夫卡流基于commit.interval.ms
属性执行提交(默认为:30000 ms
)。如果只设置了一次语义,则其值不同。您可以在中查看详细信息
如果在某些用例中需要更频繁地提交,则可以调用
ProcessorContext:commit()
。但您必须记住,提交不是立即(直接)进行的。它只设置一个标志,以便在可能的情况下尽快提交 问题是由于经常请求提交而导致的
您根本不需要调用ProcessorContext:commit()
。
卡夫卡流基于commit.interval.ms
属性执行提交(默认为:30000 ms
)。如果只设置了一次语义,则其值不同。您可以在中查看详细信息
如果在某些用例中需要更频繁地提交,则可以调用
ProcessorContext:commit()
。但您必须记住,提交不是立即(直接)进行的。它只设置一个标志,以便在可能的情况下尽快提交 如果删除context().commit(),性能是否会提高代码>?@wardziniak是,明显为330k条消息/秒。我认为commit()是流工作所必需的(?)。然而,这似乎是瓶颈。如果删除context().commit()代码>?@wardziniak是,明显为330k条消息/秒。我认为commit()是流工作所必需的(?)。不过,这似乎是瓶颈。啊,我一点也没想到。现在一切都清楚了。可能最让我困惑的是,几乎所有的教程/视频/博客帖子/其他示例每次都调用commit()
,所以我认为这是必要的。谢谢啊,我一点也没想到。现在一切都清楚了。可能最让我困惑的是,几乎所有的教程/视频/博客帖子/其他示例每次都调用commit()
,所以我认为这是必要的。谢谢
public class DummyProcessor extends AbstractProcessor<String, Message> {
public static final String NAME = "DUMMY_PROCESSOR";
public void process(String key, Message originalMessage) {
context().forward(key, originalMessage);
context().commit();
}
}