Java Kafka-本地状态存储是否消耗应用程序内存(JVM)

Java Kafka-本地状态存储是否消耗应用程序内存(JVM),java,apache-kafka,apache-kafka-streams,spring-kafka,Java,Apache Kafka,Apache Kafka Streams,Spring Kafka,我的应用程序中运行了一个消费者API线程(在不同的节点上运行),我的目标是使用来自Kafka的传入记录,该记录将具有唯一的id作为密钥。正在寻找存储Kafka Consumer API处理的记录的选项,以便我的订单可以使用它进行显示 计划使用流API在Kafka broker上处理和创建Ktable。如果我选择使用持久状态存储,它还会占用本地应用程序内存吗?如果是这样的话,它是否像是临时的,并在处理记录后立即释放内存?尝试在应用程序中避免任何内存问题,并查看哪个状态存储选项最适合我的用例。非常感

我的应用程序中运行了一个消费者API线程(在不同的节点上运行),我的目标是使用来自Kafka的传入记录,该记录将具有唯一的id作为密钥。正在寻找存储Kafka Consumer API处理的记录的选项,以便我的订单可以使用它进行显示

计划使用流API在Kafka broker上处理和创建Ktable。如果我选择使用持久状态存储,它还会占用本地应用程序内存吗?如果是这样的话,它是否像是临时的,并在处理记录后立即释放内存?尝试在应用程序中避免任何内存问题,并查看哪个状态存储选项最适合我的用例。非常感谢

如果我选择使用持久状态存储,它还会占用本地应用程序内存吗

它取决于底层存储,可以是:RocksDB、内存哈希映射或其他数据结构

如果是这样的话,它是否像是临时的,并在处理记录后立即释放内存

没有

顺便说一下:你不应该在任何Kafka代理上部署你的Kafka Streams应用程序

在Kafka broker上创建Ktable

将在客户端填充
KTable

如果我选择使用持久状态存储,它还会占用本地应用程序内存吗

甚至ROCKSDB也会使用一些本地内存(注意内存将是堆堆,因为ROCKSDB是一个C++应用程序,通过JNI集成到JVM)。当然,您也可以根据需要微调/配置RocksDB,并相应地限制其内存消耗。通常,RocksDB溢出到磁盘,因此您可以保持比主内存大的状态

它是否像是临时的,并在处理记录后立即释放内存

否。如果将主题作为变更日志读取,则每个记录都将是插入/更新/删除(通过墓碑删除,即value=
null
)。假设每个记录都有唯一的ID,那么所有记录都将是插入,您的KTable将无限增长


如何定义记录的“已处理”?如果可以确定记录何时被完全处理,则可以使用
KafkaProducer
将墓碑写入表输入主题。KafkaStreams最终将读取并处理此墓碑,并从KTable中删除消息。这当然是一个异步删除,但它可能工作得很好。

谢谢您的回复。是的,Kafka stream应用程序将位于消费者应用程序上,而不是Kafka broker上。