在 Kafka 中,如何处理已反映在 Kafka 主题中的来自源 table 的已删除行?

In Kafka, how to handle deleted rows from source table that are already reflected in Kafka topic?

我正在使用 JDBC 模式时间戳+递增的源连接器,使用 Kafka Connect 从 Postgres 获取 table。数据的更新反映在Kafka主题中,但记录的删除没有影响。所以,我的问题是:

  1. 有什么方法可以处理删除的记录吗?
  2. 如何处理kafka topic中被删除但仍然存在的记录?

一个Kafka主题可以看作是一个“append-only”的日志。它可以根据需要保留所有消息,但 Kafka 并不是为了从主题中删除单个消息而构建的。

在您所描述的场景中,下游应用程序(使用主题)处理已删除记录的信息是很常见的。

作为替代方案,您可以将主题的 cleanup.policy 设置为 compact,这意味着它最终将只保留每个键的最新值。如果您现在将消息的键定义为 Postgres table 的主键,那么当您向主题中生成具有相同键和 null 值的消息时,您的主题最终将删除该记录。然而,

  1. 我不确定您的连接器是否可以灵活地执行此操作

  2. 根据您对 kafka 主题中数据的处理方式,这仍然不能解决您的问题,因为下游应用程序仍会读取原始记录和 null消息作为删除的记录。

建议 1) 将源数据库调整为仅 append/update,也可以通过 Kafka Connect 查询 table 时过滤掉的布尔值或时间戳。

如果你的数据库是 运行 out of space,那么你可以删除旧记录,这些记录应该已经被 Kafka 处理过

选项 2) 使用 CDC 工具立即捕获删除事件,而不是在周期 table 扫描中遗漏它们。 Debezium 是 Postgres 的一个流行选项