2015-05-13 7 views
5

Ich arbeite an einem Projekt, wo wir Echtzeit-Updates von Oracle auf eine Reihe von Systemen (Cassandra, Hadoop, Echtzeitverarbeitung, etc.) streamen müssen. Wir planen, Golden Gate zu verwenden, um die Änderungen von Oracle zu erfassen, sie an Kafka zu schreiben und dann verschiedene Zielsysteme das Ereignis von Kafka lesen zu lassen. Es gibt einige Design-Entscheidungen, die getroffen werden müssen:Oracle Change-Datenerfassung mit Kafka Best Practices

Welche Daten in Kafka auf Updates schreiben?

GoldenGate gibt Updates in Form von Datensatz-ID und aktualisiertem Feld aus. Diese Änderungen können auf eine von drei Arten in Kafka geschrieben werden:

  • Vollständige Zeilen: Für jeden Feldwechsel, emittieren Sie die vollständige Zeile. Dies ergibt eine vollständige Darstellung des 'Objekts', erfordert jedoch wahrscheinlich eine Abfrage, um die vollständige Zeile zu erhalten.
  • Nur aktualisierte Felder: Die einfachste, aber es ist irgendwie komisch, mit zu arbeiten, wie Sie nie eine vollständige Darstellung eines Objekts leicht zugänglich haben. Wie würde man das auf Hadoop schreiben?
  • Ereignisse: Wahrscheinlich das sauberste Format (und das beste für Kafka), aber es erfordert viel Arbeit, um db-Feld-Updates in Ereignisse zu übersetzen.
  • Wo Datenumwandlung und Bereinigung durchführen?

    Das Schema in der Oracle DB wird von einem CRM-Tool eines Drittanbieters generiert und ist daher nicht sehr einfach zu konsumieren - es gibt seltsame Feldnamen, Übersetzungstabellen usw. Diese Daten können in einem von (a) Quellsystem, (b) Kafka unter Verwendung der Stream-Verarbeitung, (c) jedes Zielsystem.

    Wie kann die In-Order-Verarbeitung für parallele Verbraucher sichergestellt werden?

    Kafka ermöglicht jedem Verbraucher, eine andere Partition zu lesen, wobei jede Partition garantiert in Ordnung ist. Themen und Partitionen müssen so ausgewählt werden, dass die Nachrichten in jeder Partition vollständig unabhängig sind. Wenn wir ein Thema pro Tabelle und einen Hash-Datensatz für Partitionen basierend auf record_id auswählen, sollte dies die meiste Zeit funktionieren. Was passiert jedoch, wenn ein neues untergeordnetes Objekt hinzugefügt wird? Wir müssen sicherstellen, dass es verarbeitet wird, bevor das übergeordnete Element seine Foreign_id verwendet

    Antwort

    0

    Eine Lösung, die ich implementiert habe, besteht darin, nur die Datensatz-ID in Kafka zu veröffentlichen und im Consumer einen Lookup zur Ursprungs-DB zu verwenden, um den vollständigen Datensatz zu erhalten. Ich würde denken, dass Sie in einem Szenario wie dem in der Frage beschriebenen möglicherweise die CRM-Tool-API verwenden möchten, um diesen bestimmten Datensatz zu suchen, und nicht die Datensatzsuche in Ihrem Code reverse engineeren. Wie haben Sie die Lösung implementiert?