5

我正在做一个项目,我们需要将实时更新从 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 之前得到处理

4

1 回答 1

0

我实施的一种解决方案是仅将记录 ID 发布到 Kafka 和消费者中,使用对原始数据库的查找来获取完整记录。我认为在问题中描述的场景中,您可能希望使用 CRM 工具 API 来查找该特定记录,而不是对代码中的记录查找进行逆向工程。您最终是如何实施该解决方案的?

于 2016-03-30T17:10:46.083 回答