我正在导入一个数据库,其中包含一些表示多对多和一对多关系的链接表。
现在让我们着重于一对多关系。例如。一个Biossay可以有多个文档,但是一个文档只能有一个BioAssay。
因此,我有一个BioAssay表[BioAssay,...,...,...]和一个链接表[Document,BioAssay]。
最终,我需要将这2个文件及其全部文件加入完整的BioAssay中。 [BioAssayxyz,....,“ Document1:Document2:Document3”]
我想知道这里有人可以为我提供Kafka流需要发生什么的感觉吗?
1-到目前为止,根据我对Kafka流的了解,似乎我需要为每个链接表提供流,以便执行聚合。 KTable将无法使用,因为记录是按键更新的。但是,聚合的结果可能是在Ktable中。
2-然后出现了外键联接的问题。看来唯一的方法就是通过GlobalKtable。 link-table-topic-> link-table-stream-> link-tableGlobaKTable。由于我的表很大,因此可能会占用大量磁盘空间。这是一个具有大量表的超大型数据库,并且在数据上构建多个逻辑视图的要求是项目核心的一部分,无法避免。
a)我在这里理解吗?
b)这是解决该问题的唯一方法吗?
EDIT1
像唯一存在的声音是KStream-to-GlobalKTable,似乎我需要将东西倒过来一点。我的原始DB BioAssay表需要转换为流,而我的链接文档表首先需要转换为流以进行聚合,然后需要转换为GlobalKTable以进行连接。
无论哪种方式,除非我的流只有一个分区,否则这可能会非常昂贵。
答案 0 :(得分:2)
几个月前,我碰巧曾在Kafka Streams上处理过一个类似的用例,很高兴分享自己的经验。
按照您的建议使用KStreams-to-KTable可能会奏效,尽管有些注意事项可能对您来说是不可接受的。
首先,回想一下,只有当在流端而不是ktable端接收到新事件时,Kafka Streams才会更新流到表的连接。
第二,假设您使用CDC来导入数据库,那么我的理解是,您无法保证更新在Kafka上的顺序。这意味着即使您在数据库方面享受事务隔离,从而使“文档和BioAssay”表一次全部更新或插入到表中,但在Kafka方面,您会以任意顺序收到一个,然后收到另一个。
以上两点希望可以清楚地说明为什么Kafka Streams端的联接结果可能无法反映您期望的DB内容。
我采取的解决方案是“深入了解”并使用Processor API手动加入我的流。这允许实现表对表的连接语义,每当更新任一侧时都进行更新。我在该博客文章中描述了核心思想:
https://svend.kelesia.com/one-to-many-kafka-streams-ktable-join.html
使用该技术,我能够从DB正确导入一对多和多对多关系。
答案 1 :(得分:0)
如果您的表共享相同的键(即外键),那么您可以利用它来发挥优势,并将所有表流式传输到同一主题(可以使用多个分区进行扩展)。