我们有一个kafka流聚合拓扑。我们需要控制changelog主题的大小,以降低kafka存储成本。因此,我们在拓扑中使用transformer(dslapi)来调度标点符号,该标点符号使用keyvaluestore.delete()从statestore中删除旧记录。
我能够验证在删除之后,在标点符号的进一步预定触发器上,删除的键不在状态存储中。但是它是否也会从changelog主题中删除记录?更重要的是,它是否也减少了changelog主题的大小,从而控制了kafka的存储成本??
我们有一个kafka流聚合拓扑。我们需要控制changelog主题的大小,以降低kafka存储成本。因此,我们在拓扑中使用transformer(dslapi)来调度标点符号,该标点符号使用keyvaluestore.delete()从statestore中删除旧记录。
我能够验证在删除之后,在标点符号的进一步预定触发器上,删除的键不在状态存储中。但是它是否也会从changelog主题中删除记录?更重要的是,它是否也减少了changelog主题的大小,从而控制了kafka的存储成本??
2条答案
按热度按时间deyfvvtc1#
是的,对状态存储的更改将应用于changelog主题。
dxxyhpgq2#
不,没有实际的记录删除到
changelog
发出“删除”命令时的主题。请注意,“delete”命令实际上是带有null
价值(又名tombstone
)写进一个主题(changelog
或任何其他)-参见此处:空值以一种特殊的方式进行解释:带有空值的记录表示记录键的“delete”或tombstone
因此,事实上,解释是一个,使它感觉像删除;一个人可以读一本书
changelog
主题(您必须知道确切的主题名称)作为kstream或使用kafka消费者api,并将找到tombstone
记录在那里(直到被压实或保留线去除)。但如果你读了一本changelog
或者任何一个压缩的主题tombstone
记录将决定从相关存储中删除-尽管相关主题中确实存在相关密钥,但您将不再在存储中找到相关密钥。如果在主题上启用了压缩策略(默认情况下在
changelog
主题),直到特定键的最后一个记录被删除。因此,在某个时刻,您将只拥有delete记录,因为具有相同键的先前记录将被kafka线程删除。