Kafka Stream 真的是实时的吗?

Is Kafka Stream really Real Time?

我正在使用 Kafka Stream API 来测试一些功能。 我有一个像这样的流:

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);
                });

我发现 2 个奇怪的行为会在我的主题中产生一些数据:

那么,您认为这种行为完全正常吗?或者我的 kafka 有配置问题吗?

我正在使用 Kafka 1.0.1、Kafka Stream 1.0.1、Java 8 和 Spring-Boot

默认情况下,Kafka Streams 使用缓存 "dedupliate" 来自聚合的连续输出以减少下游负载。

您可以通过在 KafkaStreams 配置中设置 cache.max.bytes.buffering=0 来全局禁用缓存。作为替代方案,也可以通过将 Materialized 参数传递给聚合运算符来单独禁用每个商店的缓存。

此外,所有缓存都在提交时刷新,默认提交间隔为 30 秒。因此,您在 30 秒后看到输出是有道理的。如果禁用缓存,提交间隔将不再对行为产生任何影响。

有关详细信息,请参阅:https://kafka.apache.org/documentation/streams/developer-guide/memory-mgmt.html