我注意到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()
我希望键值存储在内存中起作用,直到提交时写入。看起来不仅为每个更新进行写操作,而且还存在反序列化的读操作。有人可以解释一下这是如何工作的,以及我是否应该关注性能?
答案 0 :(得分:0)
您观察到的数据总是(反)序列化是正确的,即使所有数据都在内存中也是如此。 Kafka Streams中的所有存储都基于{
"user": {
"actions": [
{
"name": "reading",
"description": "blablabla",
"nested": {
"name": "reading",
"description": "broken"
}
}
],
"name": "John"
}
}
数组,以进行适当的内存管理。反序列化器头Java对象的大小未知,并且使内存管理变得困难且内存使用无法预测。
您的存储仍将在内存中工作,并且仅在必要时并在提交时才写入磁盘。