Я создаю приложение nodejs, которое сейчас довольно велико. Стремясь избежать монолитного приложения node, я пошел по архитектурному пути более модульной системы, разбив несколько компонентов на отдельные модули npm. Они публикуются с использованием npm и устанавливаются в зависимых модулях. У меня около 6 различных модулей (которые я хотел бы разразиться больше), и теперь стало сложно управлять пакетами.
Проблемы:
- Существует вложенная зависимость, поэтому, если я изменяю модуль A, а модуль B зависит от модуля A, а модуль C зависит от модуля B, то при обновлении модуля AI необходимо опубликовать его новую версию, что означает, что мне нужно обновить это в модуле B, что означает, что мне также нужно опубликовать это, а затем, наконец, мне нужно установить эту новую версию в модуле A... вы можете увидеть, где это может быть болью. Более того, обновление версий во всем пакете. Json является ручным и поэтому подвержено ошибкам, и ожидание каждой публикации требует много времени.
- Модули могут совместно использовать зависимости npm, поэтому иногда конфликты возникают, когда пакеты обновляются. Чем больше модулей, тем выше вероятность конфликта.
Преимущества заключаются в том, что у нас очень модульная система, в которой библиотеки могут быть легко использованы повторно, и существует явная иерархия модулей, которые не могут быть связаны никакими круговыми зависимостями.
Возможные решения:
-
Монолит. Управление зависимостями как единое приложение в одном репозитории с каждым модулем, который становится сервисом. Это означает, что требуется только одно обновление, и весь модуль apis будет синхронизирован. Тем не менее, обращение к библиотекам в коде может быть немного больным (так как я полагаю, что им нужно будет ссылаться относительно локального файла), я не уверен, как можно обеспечить структурную иерархию между модулями и повторное использование кода быть сложнее с модулями вне репозитория.
-
Микросервисы. Чтобы каждый модуль обслуживал микросервис. Это сохраняет все преимущества модульной системы, но я обеспокоен тем, что она добавит много сложности в сборку и управление всеми сервисами, которая сама по себе станет полноценной работой.
-
Продолжайте движение. Выработайте способ сохранить текущую архитектуру, но устраните проблему с нажатием обновлений и т.д. Возможно, скрипты для обновления версий и сжатия для обеспечения правильных зависимостей. Я думаю, что это было бы трудно и потенциально могло бы привести его к монолитной системе другого сорта.
Вариант 1 кажется мне наиболее управляемым, но я не хочу потерять модульную структуру, если мне это не нужно.
Это довольно широкий вопрос, но любые предложения/советы/комментарии будут действительно полезны.
Спасибо