Я работаю над проектом, в котором нам нужно передавать обновления в реальном времени из Oracle на множество систем (Cassandra, Hadoop, обработка в реальном времени и т. Д.). Мы планируем использовать Golden Gate для захвата изменений из Oracle, записи их в Kafka, а затем позволить различным целевым системам читать событие из Kafka. Необходимо принять ряд дизайнерских решений:
Какие данные записывать в Kafka при обновлениях?
GoldenGate отправляет обновления в виде идентификатора записи и обновленного поля. Эти изменения можно записать в Kafka одним из трех способов:
- Полные строки: при каждом изменении поля выделять полную строку. Это дает полное представление об «объекте», но, вероятно, требует выполнения запроса для получения полной строки.
- Только обновленные поля: самый простой, но работать с ним довольно странно, поскольку у вас никогда не бывает легкодоступного полного представления объекта. Как написать это в Hadoop?
- События: Вероятно, самый чистый формат (и лучше всего подходит для Kafka), но для преобразования обновлений полей db в события требуется много работы.
Где выполнять преобразование и очистку данных?
Схема в базе данных Oracle создается сторонним инструментом CRM и, следовательно, не очень проста в использовании - есть странные имена полей, таблицы перевода и т. Д. Эти данные можно очистить в одной из (а) исходной системы, ( б) Kafka с использованием потоковой обработки, (в) каждая целевая система.
Как обеспечить обработку заказов для параллельных потребителей?
Kafka позволяет каждому потребителю читать отдельный раздел, причем каждый раздел гарантированно находится в порядке. Темы и разделы должны быть выбраны таким образом, чтобы гарантировать полную независимость сообщений в каждом разделе. Если мы выберем тему для таблицы и хэш-запись для разделов на основе record_id, это должно работать большую часть времени. Однако что происходит, когда добавляется новый дочерний объект? Нам нужно убедиться, что он будет обработан, прежде чем родитель использует его foreign_id.