我们有一个Kafka流聚合拓扑。我们需要检查changeLog主题的大小,以减少Kafka的存储成本。因此,我们在拓扑中使用转换器(DSL API)来安排标点符号,以便使用keyValueStore.delete()从stateStore中删除旧记录。
我能够验证,在删除之后,在标点符号的进一步计划的触发器上,状态存储中不存在已删除的键。但是它也会从changeLog主题中删除记录吗?更重要的是,它是否也减少了changeLog主题的大小,以便控制Kafka的存储成本?
答案 0 :(得分:1)
是的,对状态存储的更改将应用于changelog主题。
答案 1 :(得分:1)
否,发出“删除”命令时,changelog
主题中没有实际的记录删除。请注意,“删除”命令实际上是一条记录,该记录具有写入主题(null
或其他任何主题)中的tombstone
值(aka changelog
)-请参见here :
空值以特殊方式解释:具有空值的记录 值代表记录键的“删除”或逻辑删除
因此,实际上是一种解释,使它感觉像是一种删除;可以通过KStream或使用Kafka Consumer API读取changelog
主题(您必须知道确切的主题名称),然后在其中找到tombstone
记录(直到压缩或固定螺纹)。但是,如果您读取的是changelog
或带有KTable的任何压缩主题,但比tombstone
记录要多的话,它将确定从关联的存储中删除了-尽管您实际上无法在存储中找到相关的键,它实际上存在于相关的压缩主题中。
如果在某个主题上启用了压缩策略(默认情况下在changelog
主题上启用了压缩策略),则会删除其记录,直到最后一个特定键的记录为止。因此,在某些时候,您只有删除记录,因为压缩Kafka线程会删除具有相同键的先前记录。