apache-kafka - Kafka Streams 聚合阶段是否序列化和反序列化每个单个元素?

标签 apache-kafka apache-kafka-streams

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

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

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

最佳答案

您对数据始终(反)序列化的观察是正确的,即使所有数据都在内存中。 Kafka Streams中的所有存储都基于byte[]数组以允许适当的内存管理。反序列化的堆上 Java 对象的大小未知,这使得内存管理困难且内存使用不可预测。
您的存储仍然可以在内存中工作,并且仅在必要时和提交时才会写入磁盘。

关于apache-kafka - Kafka Streams 聚合阶段是否序列化和反序列化每个单个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56350939/

相关文章:

java - 来自单个主主题的多个流

mongodb - Debezium MongoDB 连接器错误 : org. apache.kafka.connect.errors.ConnectException:错误处理程序中超出了容差

apache-kafka-streams - Kafka Stream - 如果在一段时间内没有收到给定键的事件,如何发送警报

apache-kafka - 在 Kafka Streams 中的多个分区上聚合

java - 如何在 spring-cloud-stream-binder-kafka-streams :3. 1.1 中使用功能方法检索/设置 header

java - 似乎无法将 KStream<A,B> 转换为 KTable<X,Y>

docker - 将 kafDrop 连接到安全代理

java - 如何安全地取消订阅 Kafka 中的主题

apache-kafka - 使用 Kafka Streams 在输出中设置时间戳

python : Kafka consumer offset commit in the background