Kafka Stream真的很实时吗?

时间:2018-06-01 13:44:30

标签: java apache-kafka apache-kafka-streams

我使用Kafka Stream API测试某些功能。 我有一个像:

的流
vmlinux

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

  • 首先:我没有为每个产生的数据获得输出。例如,如果我生成了20条没有延迟的消息,我只会得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

1 个答案:

答案 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