У меня есть служба, которая преобразует XML-документы.
Он получает сообщения из N очередей и в зависимости от того, из какой очереди он получает сообщение, выполняет одно из преобразований.
Теперь я реорганизую его в микросервис, работающий в док-контейнере.
Я думаю, что могу сделать это двумя способами, но я не знаю, какой из них будет лучше при использовании контейнеров.
Я делаю это в .NET Core 2.2. Я пока не знаю, будем ли мы использовать docker-swarm или kubernetes для производства.
Я мог бы просто оставить большую часть кода, как сейчас, и запустить его как один контейнер. AppSettings.config будет содержать настройки для каждой пары очередь-преобразование.
Плюсы, которые я вижу:
Требуется меньше изменений кода и упрощение docker-compose - один сервис вместо N. Только один файл конфигурации.
Минусы:
Если есть потребность в одной из трансформаций или если она имеет
более высокий приоритет, я не могу просто масштабировать его контейнер. Новые реплики
будет извлекать сообщения из всех очередей вместо одной, которую я хочу масштабировать.
Я мог бы провести рефакторинг кода и создать N различных изображений контейнеров.
Каждый из них прослушивал одну очередь и выполнял одно преобразование. Я могу сделать так, чтобы
единственная разница в коде заключается в запуске при регистрации сервисов. На основании конфигурации я мог
зарегистрировать один из IXmlTransformers.
Плюсы:
Я могу масштабировать для одной очереди-преобразования.
Если есть проблема с одним из преобразований и перезапуском контейнера, все остальные преобразования будут работать нормально.
Я думаю, что это чище - одно изображение выполняет одно преобразование - Правило единой ответственности.
Минусы:
В некоторых средах будет около 10 различных преобразований, поэтому
Там будет много конфигурационных файлов - возможно, добавленных в каждый работающий контейнер с использованием тома?
Составление докера будет очень долгим.
Что может быть лучше для этого? Или, может быть, есть другие лучшие варианты?
Edit:
Мне кажется, я не совсем понял свой вопрос, поэтому я пытаюсь объяснить его лучше.
В обоих вариантах у меня будет одно изображение контейнера. Разница будет во время выполнения. Только конфигурация будет другой.
Допустим, я преобразую XML в CSV или XML в XML с помощью XSLT.
Формат CSV и XSLT являются частью конфигурации. У меня может быть много форматов CSV (много конфигураций) и много разных XSLT (опять же много конфигураций)
Итак, у меня есть две реализации ITransformer (CSV, XSLT), и они читают конфигурацию, чтобы выполнить свои преобразования.
И у меня вопрос: лучше ли иметь один запущенный экземпляр контейнера для одной конфигурации или поместить все эти конфигурации в один контейнер, который отслеживает N очередей или одну очередь и читает какие-то метаданные, чтобы решить, какое преобразование запустить.