При создании сервисов контроллеров Apache NiFi мне интересно узнать, когда имеет смысл создавать новые, а когда делиться существующими.
В настоящее время у меня есть CsvReader
и CSVRecordSetWriter
в корневой группе процессов, и они активно используются в дочерних группах процессов.Я попытался настроить их так, чтобы они были максимально динамичными и гибкими, чтобы охватить максимально возможное количество вариантов использования.Я устанавливаю свойство «Текст схемы» в каждом из них в настоящее время следующим образом:
Reader Schema Text: ${avro.schema:notNull():ifElse(${avro.schema}, ${avro.schema.reader})}
Writer Schema Text: ${avro.schema:notNull():ifElse(${avro.schema}, ${avro.schema.writer})}
Очень распространенный шаблон, который у меня есть, заключается в сопоставлении файлов с разными полями из разных источников в общий формат (общая схема).Поэтому одной из идей является использование процессоров ConvertRecord
или UpdateRecord
с атрибутами avro.schema.reader
и avro.schema.writer
, установленными для схем ввода и вывода.Тогда я бы сделал так, чтобы писатель всегда устанавливал атрибут avro.schema
, поэтому каждый раз, когда я снова читаю записи дальше в потоке, по умолчанию используется avro.schema
.Это кажется грязным, чтобы оставить атрибуты схемы читателя и писателя висящими вокруг.Есть ли лучший способ с точки зрения архитектуры?Почему тонны служб контроллеров находятся на разных уровнях?Помимо некоторых настроек, которые могут потребоваться для некоторых случаев использования, я что-то упускаю?
Также интересно узнать, как другие организуют свои схемы?У меня нет необходимости повторно использовать их в разных местах на разных процессорных блоках или ссылаться на разные версии, поэтому кажется неэффективным их централизовать или поддерживать сервер реестра схемы, который также потребует обновлений и обслуживания, когда я могу просто использовать AvroSchemaRegistry
.