Kafka Streams聚合阶段是否对每个元素进行序列化和反序列化?

时间:2019-05-28 22:40:29

标签: apache-kafka apache-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()

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

1 个答案:

答案 0 :(得分:0)

您观察到的数据总是(反)序列化是正确的,即使所有数据都在内存中也是如此。 Kafka Streams中的所有存储都基于{ "user": { "actions": [ { "name": "reading", "description": "blablabla", "nested": { "name": "reading", "description": "broken" } } ], "name": "John" } } 数组,以进行适当的内存管理。反序列化器头Java对象的大小未知,并且使内存管理变得困难且内存使用无法预测。

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