我正在做一个项目,我们需要将实时更新从 Oracle 流式传输到一堆系统(Cassandra、Hadoop、实时处理等)。我们计划使用 Golden Gate 从 Oracle 捕获更改,将它们写入 Kafka,然后让不同的目标系统从 Kafka 读取事件。有很多设计决策需要做出:
在更新时将哪些数据写入 Kafka?
GoldenGate 以记录 ID 和更新字段的形式发出更新。这些更改可以通过以下三种方式之一写入 Kafka:
- 全行:对于每个字段更改,发出整行。这给出了“对象”的完整表示,但可能需要进行查询才能获得完整的行。
- 仅更新字段:最简单,但使用起来有点奇怪,因为您永远无法轻松访问对象的完整表示。如何将其写入 Hadoop?
- 事件:可能是最简洁的格式(并且最适合 Kafka),但是将数据库字段更新转换为事件需要大量工作。
在哪里执行数据转换和清理?
Oracle DB 中的模式是由第 3 方 CRM 工具生成的,因此不太容易使用 - 有奇怪的字段名称、翻译表等。这些数据可以在 (a) 源系统之一中清理,( b) Kafka 使用流处理,(c) 每个目标系统。
如何保证并行消费者的有序处理?
Kafka 允许每个消费者读取不同的分区,其中每个分区都保证是有序的。选择主题和分区的方式需要保证每个分区中的消息完全独立。如果我们为每个表选择一个主题,并根据 record_id 将记录散列到分区,这在大多数情况下应该可以工作。但是,当添加一个新的子对象时会发生什么?我们需要确保它在父级使用它的 foreign_id 之前得到处理