前言:
在我们的组织中,我们正在尝试使用Kafka解决涉及捕获Oracle数据库中的更改并通过Kafka发送的问题。实际上,它是CDC,我们正在使用Kafka Connector。
我们使用Oracle闪回查询来捕获Oracle中的更改,这使我们可以获得更改和操作(插入,删除,更新)的时间戳。
一旦我们观察到表中进行了一些更改,Kafka Connector会将其发布为主题,我们将使用Kafka Streams进一步阅读该主题。
问题在于,由于表中的某些更新没有做任何更改(这也会触发闪回更改),或者表中有100列,有时闪回查询中会出现相等的行,并且我们只看了20条,最终由于在那20条字段中没有任何更改,因此在查询中看到了重复的行。
我们使用闪回获取更改的行(包括排除的行)。在连接器中,我们设置了时间戳+增量模式(时间戳是通过闪回查询的 versions_starttime 字段获取的)
重要提示:我们不能动摇数据库,我的意思是,我们不能创建触发器而不是使用已经存在的闪回方案。
问题
如果某些(键,值)在我们要舍弃的内容中同样存在,我们将尝试过滤Kafka中的记录。注意,这不完全是一次语义。将以较大的时间戳差异重复记录。
如果我使用KTable来检查某些记录的最后一个值,那么经过很长一段时间后,它的效率如何?
我的意思是,消费者的内部状态存储由RocksDB和支持的Kafka Topic处理,因为如果我使用非窗口式KTable,则内部空间最终可能会很大。
在这种情况下,哪个被认为是好的方法?为了不使Kafka Consumers内部状态存储超载,同时又能够知道实际记录是否在一段时间之前已经处理过。