Apache kafka 从Kafka状态存储中删除记录是否也会从changelog主题中删除该记录?
我们有一个Kafka流聚合拓扑。我们需要控制变更日志主题的大小,以降低Kafka存储成本。因此,我们在拓扑中使用transformer(DSL API)来调度标点符号,该标点符号使用keyValueStore.delete()从stateStore中删除旧记录。Apache kafka 从Kafka状态存储中删除记录是否也会从changelog主题中删除该记录?,apache-kafka,apache-kafka-streams,aggregation,tombstone,Apache Kafka,Apache Kafka Streams,Aggregation,Tombstone,我们有一个Kafka流聚合拓扑。我们需要控制变更日志主题的大小,以降低Kafka存储成本。因此,我们在拓扑中使用transformer(DSL API)来调度标点符号,该标点符号使用keyValueStore.delete()从stateStore中删除旧记录。 我能够验证删除后,在标点符号的进一步预定触发器上,删除的键不在状态存储中。但是它是否也会从变更日志主题中删除记录?更重要的是,它是否也减少了变更日志主题的大小,以便检查卡夫卡的存储成本???是的,对状态存储的更改应用于变更日志主题。否,
我能够验证删除后,在标点符号的进一步预定触发器上,删除的键不在状态存储中。但是它是否也会从变更日志主题中删除记录?更重要的是,它是否也减少了变更日志主题的大小,以便检查卡夫卡的存储成本???是的,对状态存储的更改应用于变更日志主题。否,当您发出“删除”命令时,
变更日志
主题中没有实际的记录删除。请注意,“delete”命令实际上是一条记录,其null
值(也称tombstone
)写入主题(changelog
或任何其他)-请参阅:
空值以一种特殊的方式解释:带有空值的记录
值表示记录键的“删除”或墓碑
因此,事实上,这种解释让人觉得它是一种删除;您可以将changelog
主题(您必须知道确切的主题名称)作为KStream或使用Kafka Consumer API读取,并在那里找到墓碑记录(直到被压缩或保留线程删除)。但是,如果您阅读一个changelog
或任何包含KTable的压缩主题,那么tombstone
记录将确定从相关存储中删除-您将不再在存储中找到相关密钥,尽管它实际上存在于相关压缩主题中
如果在主题上启用了压缩策略(默认情况下在changelog
topics上启用),则其记录将被删除,直到特定密钥的最后一个记录。因此,在某些情况下,您将只拥有删除记录,因为压缩卡夫卡线程将删除以前具有相同密钥的记录。谢谢。它会减少变更日志主题的存储大小,还是只是将记录标记为“软删除”,以便变更日志主题的存储仍然不受影响?所有变更日志主题都会被压缩,因此最终删除(作为墓碑)将消失。谢谢。所以墓碑也被写进了变更日志主题中。我将需要删除墓碑记录以及保存在卡夫卡存储大小。我找到了这个属性,设置为1天,而retention.ms配置设置为7天。我将cleanup.policy设置为[compact,delete]。在我当地的环境中。我没有看到记录被删除。我遗漏了什么吗?实际上,由于业务需要,我们将retention.ms配置为7天(一个事件可以更新到7天)。但在7天内,我们收到了大量的信息,导致了巨大的卡夫卡存储成本。这就是为什么我们开始通过发送墓碑消息立即删除处理过的记录。