我使用Kafka Stream API测试某些功能。 我有一个像:
的流vmlinux
我发现2个奇怪的行为会在我的主题中产生一些数据:
KStream<String, UnifiedData> stream = builder.stream("topic", Consumed.with(Serdes.String(), new JsonSerde<>(Data.class)));
stream.groupBy((key, value) -> value.getMetadata().getId())
.windowedBy(TimeWindows.of(TimeUnit.SECONDS.toMillis(1000)))
.count()
.toStream()
.map((key, value) -> {
System.out.println(value);
return KeyValue.pair(key.toString(), value);
});
作为输出而不是20
1 2 3....
在我的控制台中打印结果的时间之间有20秒的延迟那么,你认为这种行为完全正常吗?或者我的卡夫卡可能有配置问题?
我正在使用Kafka 1.0.1,Kafka Stream 1.0.1,Java 8和Spring-Boot
答案 0 :(得分:3)
默认情况下,Kafka Streams使用缓存来进行重复数据删除&#34;聚合的连续输出,以减少下游负载。
您可以通过在cache.max.bytes.buffering=0
配置中设置KafkaStreams
来全局禁用缓存。作为替代方案,通过将Materialized
参数传递到聚合运算符,也可以单独禁用每个存储的缓存。
此外,所有缓存都在提交时刷新,默认提交间隔为30秒。因此,30秒后看到输出是有道理的。如果禁用缓存,则提交间隔将不再对该行为产生任何影响。
有关详细信息,请参阅:https://kafka.apache.org/documentation/streams/developer-guide/memory-mgmt.html