首页 > 解决方案 > Kafka Streams 聚合阶段是否序列化和反序列化每个元素?

问题描述

我注意到该aggregate()阶段似乎序列化/反序列化每个元素,即使它定期发出结果。

  streamBuilder
      .stream(inputTopic, Consumed.`with`(keySerde, inputValueSerde))
      .groupByKey(Serialized.`with`(keySerde, inputValueSerde))
      .aggregate(
        () => Snapshot.Initial(),
        (_, event, prevSnap: Snapshot) => {
          // ...
        },
        Materialized.as(stateStoreName).withValueSerde(snapshotSerde)
      )
      .toStream()

我希望键值存储在内存中工作,直到提交时写入。看起来不仅每次更新都会进行写入,而且还会进行反序列化的读取。有人可以解释一下这是如何工作的,我是否应该关注性能?

标签: apache-kafkaapache-kafka-streams

解决方案


即使所有数据都在内存中,您对数据始终(反)序列化的观察是正确的。Kafka Streams 中的所有存储都基于byte[]数组,以便进行适当的内存管理。反序列化的堆上 Java 对象的大小未知,使内存管理变得困难并且内存使用不可预测。

您的存储仍将在内存中工作,并且仅在必要时和提交时才会写入磁盘。


推荐阅读