Как стать автором
Обновить

Комментарии 15

Спасибо, конечно, но по ссылке говорят: «Используйте alpine!», а в статье как раз он
Кроме того, в статье кардинальный способ уменьшения вклада каждого микросервиса в общий размер. Только на размер пожатого вебпаком исходника. С трудом представляю, как порезать еще хоть чуть-чуть.

1) А теперь представьте, что MsA разрабатывает одна команда, а MsB другая?

2) А ещё у вас 20 сервисов. Вы обновили в одном пакет и сломали другие 19. Придется вам не обновляться...

3) Также если у вас 20 сервисов, шанс что пакеты устаканится стремится к нулю

1) А теперь представьте, что MsA разрабатывает одна команда, а MsB другая?

Ээ… Разрабатывают разные команды… и?
2) А ещё у вас 20 сервисов. Вы обновили в одном пакет и сломали другие 19. Придется вам не обновляться…

На практике вообще не проблема. На практике есть небольшой набор общих для всех микросервисов пакетов, (а конкретно mongoose, axios, nats, express, ..) и некоторым микросервисам нужны специфичные пакеты, которые больше никто не использует.
Например один микросервис отвечает за рендеринг PDF, другой за вебсокеты, третий за связь со сторонним приложением.
Добавить специфичный пакет в базовый образ — не страшно, это никак не отразится на других 19. Обновить свой специфичный пакет (например рендеринга PDF) — опять же, не страшно. Другие 19 он никак не заденет.
Другое дело если пакет общий. Например, если вышла новая мажорная версия mongoose с брейкин ченджем. Тогда либо надо собрать силу волю и команды в кулак — и всем вместе обновится. Либо, если вам так нужна новая фича в монгусе, а других подбить на апдейт не получается — то просто базируете свой микросервис не на общем BaseMS, а на Node по старинке. (но на практике такого не помню)
3) Также если у вас 20 сервисов, шанс что пакеты устаканится стремится к нулю

Повторюсь — добавлять и обновлять специфичные пакеты в базовый образ — не страшно.
Повторюсь — добавлять и обновлять специфичные пакеты в базовый образ — не страшно.


Вопрос на засыпку, зачем тогда вам вообще образы? Почему не использовать пакеты?

Что за потребность такая сэкономить 3Гб ценой организационных ограничений при наличии нескольких команд? Экономическая целесообразность этого шага, на мой взгляд, сильно отрицательная.

Прям вот ограничений особых и нет, а вот польза от уменьшения приличная.
Отмечу, кстати, что это уменьшение скорее не на 3Гб, — а скорее уменьшение в 20+ раз. Это сильно сказывается, когда приходится обновлять установ на продакшене или тестовом контуре. Одно дело, когда удаленный сервак выкачивает 3 Гб, и совсем другое, когда 0.15 Гб. Да даже не удаленный сервак, а локальное хранилище образов гораздо лучше себя чувствует.
А целиком все микросервисы обновляются периодически. У нас есть npm-пакет с интерфейсами и т.д. общий для всех микросервисов, он обновляется нередко. И каждый раз пушить 3 Гб, а потом тянуть их — так себе

У нас есть npm-пакет с интерфейсами и т.д. общий для всех микросервисов, он обновляется нередко

Дайте угадаю, у вас еще и БД общая и микросервисы общаются друг с другом напрямую, а не разавязаны через какую-нибудь кафку?

Нет, конечно. Если БД нужна, она у каждого своя. Общих БД у микросервисов нет. Но они общаются между собой — синхронизованные сообщения через GET/POST, асинхронные через nats-streaming эвенты. Сигнатура запросов и эвентов, а также доменные модели, какие-то общие утилиты и т.д. в общем пакете. Удобно, когда и бэкэнд и клиент у тебя на Typescript. Могут использовать общий код

То что БД развели - это важный шаг от "распределенного монолита".

Однако единый npm-пакет с интерфейсами и общение через HTTP - на мой взгляд идут в "минус".

Например по HTTP, классический сценарий - один сервис вызвал другой, тот третий, а третий решил немного "подумать", вся цепочка начинает просаживаться по ресурсам или перестаёт выполнять свои функции.

В «разведении БД» есть психологический момент, что нужно свыкнуться с мыслью, что данные дублируются. Не все данные, но всё же — прям очень некомфортно с этой мыслью. Но можно использовать психологический трюк — рассматривать это дублирование данных как своего рода кэш. И тогда можно спокойно спать по ночам
npm-пакет с интерфейсами не в минус… На мой взгляд, прям вот чтобы независимые команды независимо мимо спринтов пилили микросервисы — это далеко от практики.
Но вот практический пример: в реквесте один параметр из опционального решили сделать обязательным, обновили базовый образ, автоматом обновили везде package.json, — и вдруг перестал собираться всеми забытый микросервис. Это же прекрасно, что ошибка обнаружилась на этапе компиляции, а не на проде где-то что-то отвалилось и надо искать где и что. Это вот прям жирнейший плюс общего пакета
+ централизованный апдейт пакетов сокращает время апдейта в столько раз, сколько микросервисов имеется, это имеет прямое отношение к экономической целесообразности. Даже не прямое, а геометрическое :)
А еще есть практика, когда все микросервисы — это по сути одна и та же кодовая база, просто разные «бинарники» запускаются. В этом случае что-то специально синхронизировать вообще не нужно. Примерно такую архитектуру NestJS, например, предлагает.

Over-engineering в чистом виде.

Достаточно ведь просто сделать контейнеры с микросервисами, в которых исключительно production зависимости. Устанавливать их через multistage (в большинстве случаев, эта установка уже под кешом внутренней сети).

Ну и просто не раздувать количество зависимостей. Иначе шутка о том, что npm выкачивает пол интернета, станет правдой...

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории