Oracle change-data-capture с помощью лучших практик Kafka

Я работаю над проектом, в котором нам нужно передавать обновления в реальном времени из Oracle на множество систем (Cassandra, Hadoop, обработка в реальном времени и т. Д.). Мы планируем использовать Golden Gate для захвата изменений из Oracle, записи их в Kafka, а затем позволить различным целевым системам читать событие из Kafka. Необходимо принять ряд дизайнерских решений:

Какие данные записывать в Kafka при обновлениях?

GoldenGate отправляет обновления в виде идентификатора записи и обновленного поля. Эти изменения можно записать в Kafka одним из трех способов:

  • Полные строки: при каждом изменении поля выделять полную строку. Это дает полное представление об «объекте», но, вероятно, требует выполнения запроса для получения полной строки.
  • Только обновленные поля: самый простой, но работать с ним довольно странно, поскольку у вас никогда не бывает легкодоступного полного представления объекта. Как написать это в Hadoop?
  • События: Вероятно, самый чистый формат (и лучше всего подходит для Kafka), но для преобразования обновлений полей db в события требуется много работы.

Где выполнять преобразование и очистку данных?

Схема в базе данных Oracle создается сторонним инструментом CRM и, следовательно, не очень проста в использовании - есть странные имена полей, таблицы перевода и т. Д. Эти данные можно очистить в одной из (а) исходной системы, ( б) Kafka с использованием потоковой обработки, (в) каждая целевая система.

Как обеспечить обработку заказов для параллельных потребителей?

Kafka позволяет каждому потребителю читать отдельный раздел, причем каждый раздел гарантированно находится в порядке. Темы и разделы должны быть выбраны таким образом, чтобы гарантировать полную независимость сообщений в каждом разделе. Если мы выберем тему для таблицы и хэш-запись для разделов на основе record_id, это должно работать большую часть времени. Однако что происходит, когда добавляется новый дочерний объект? Нам нужно убедиться, что он будет обработан, прежде чем родитель использует его foreign_id.


person EugeneMi    schedule 13.05.2015    source источник


Ответы (1)


Одно из реализованных мной решений - опубликовать только идентификатор записи в Kafka, а в Consumer использовать поиск в исходной БД, чтобы получить полную запись. Я бы подумал, что в сценарии, подобном описанному в вопросе, вы можете использовать API инструмента CRM для поиска этой конкретной записи, а не реконструировать поиск записи в вашем коде. Как вы в итоге реализовали решение?

person thcricketfan    schedule 30.03.2016