从Kafka状态存储中删除记录是否也会从changelog主题中删除记录?

时间:2020-08-28 21:50:58

标签: apache-kafka apache-kafka-streams aggregation tombstone

我们有一个Kafka流聚合拓扑。我们需要检查changeLog主题的大小,以减少Kafka的存储成本。因此,我们在拓扑中使用转换器(DSL API)来安排标点符号,以便使用keyValueStore.delete()从stateStore中删除旧记录。
我能够验证,在删除之后,在标点符号的进一步计划的触发器上,状态存储中不存在已删除的键。但是它也会从changeLog主题中删除记录吗?更重要的是,它是否也减少了changeLog主题的大小,以便控制Kafka的存储成本?

2 个答案:

答案 0 :(得分:1)

是的,对状态存储的更改将应用​​于changelog主题。

答案 1 :(得分:1)

否,发出“删除”命令时,changelog主题中没有实际的记录删除。请注意,“删除”命令实际上是一条记录,该记录具有写入主题(null或其他任何主题)中的tombstone值(aka changelog)-请参见here

空值以特殊方式解释:具有空值的记录 值代表记录键的“删除”或逻辑删除

因此,实际上是一种解释,使它感觉像是一种删除;可以通过KStream或使用Kafka Consumer API读取changelog主题(您必须知道确切的主题名称),然后在其中找到tombstone记录(直到压缩或固定螺纹)。但是,如果您读取的是changelog或带有KTable的任何压缩主题,但比tombstone记录要多的话,它将确定从关联的存储中删除了-尽管您实际上无法在存储中找到相关的键,它实际上存在于相关的压缩主题中。

如果在某个主题上启用了压缩策略(默认情况下在changelog主题上启用了压缩策略),则会删除其记录,直到最后一个特定键的记录为止。因此,在某些时候,您只有删除记录,因为压缩Kafka线程会删除具有相同键的先前记录。