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 个奇怪的行为会在我的主题中产生一些数据:
- 首先:我没有得到每个生成数据的输出。例如,如果我立即生成 20 条消息,我只会得到
20
作为输出,而不是 1 2 3....
- 其次:在我生成消息和
System.out.println(value)
在我的控制台中打印结果之间有大约 20 秒的延迟
那么,您认为这种行为完全正常吗?或者我的 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
我正在使用 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 个奇怪的行为会在我的主题中产生一些数据:
- 首先:我没有得到每个生成数据的输出。例如,如果我立即生成 20 条消息,我只会得到
20
作为输出,而不是1 2 3....
- 其次:在我生成消息和
System.out.println(value)
在我的控制台中打印结果之间有大约 20 秒的延迟
那么,您认为这种行为完全正常吗?或者我的 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