如何从Kafka全局状态存储中删除记录?

时间:2020-05-13 10:49:04

标签: apache-kafka kafka-consumer-api apache-kafka-streams kafka-producer-api

还原过程中的全局状态存储将转储来自源主题的数据(这被视为全局存储的更改日志主题)。

要删除记录,我会执行以下操作

kvStore.put("key-1",null)

Kafka如何知道该记录已被删除,并且在还原期间它将从源主题转储记录(考虑源主题的key-1记录)

在我的拓扑中

  • 输入主题-> T1
  • 并且附加了一个过程,该过程从T1读取数据并从记录中构造一个密钥,然后向下转发到主题T2
  • 主题T2是全局状态存储的源主题。

示例:

  • T1我收到了数据:{"id":'123', "name":"Mohit", "type":"insert"}
  • 构造一个密钥以进行记录并转发到主题,并以密钥和值作为T2->密钥:123和值:{"id":'123', "name":"Mohit"}

该键记录之后,在数据中键入delete。 T1获得了数据:{"id":'123', "name":"Mohit", "type":"insert"}

所以我像这样向前记录

this.context.forward(key, null)
key: 123 value:null

相同状态已在状态存储区中更新

我只想知道在恢复此记录时将被删除,这意味着如果我使用密钥123上架存储,我将得到null。

1 个答案:

答案 0 :(得分:1)

状态存储更改日志是紧凑主题。要从紧凑主题中删除邮件,您需要执行put(key, null)操作。值为null的消息称为墓碑,它最终会被主题清除器删除。

请注意,该消息只会(最终)在状态存储中删除,而不会在输入主题中删除。

最后,应将密钥为123的记录从状态存储中完全删除。