LINUX.ORG.RU
ФорумTalks

Когда микросервисная архитектура может быть проблемой? Или расчленяем проект на кусочки.

 , , , ,


0

2

Есть замечательный микросервисный подход к архитектуре ПО, суть которого в обеспечении ортогональности, изолированности (разные БД и контейнеры для каждого микросервиса) и расчлененности ПО.

Вроде, такая архитектура для более-менее больших проектов хороша со всех сторон:
0. Наконец-то заказчик (который в россии всегда лох и самодур невменяемый) не сможет помешать релизу своими хотелками. Хотелки можно быстро реализовывать, а релизы часто выкатывать.
1. Легкое масштабирование - просто запускаем больше контейнеров в нужным микросервисом и http/https-балансер настраиваем на раскидывание запросом.
2. HA из коробки: добавляем в балансер скрипт мониторинга и легко отслеживаем падение какого-то куска ПО (микросервиса), перенаправляя на резервный вызовы приложений.
3. Просто разработать приемлемую архитектуру, рефакторинг через переписывание блоков ПО, а не всего приложения. Просто сменить архитектуру.
4. Простой откат, т.к. откатить можно только куски приложения и их БД, а всего монстра.
5. Простой деплой, т.к. деплоятся только куски. В ходе деплоя другие микросервисы точно не пострадают и выйдут из строя.
6. 9 женщин прогеров наконец-то могут родить за 1 месяц. Можно покупать более дешевых прогеров (т.к. микросервисы можно писать на любом языке, и спецзнания и особый опыт не требуется). Задача разработки прекрасно раскидывается на несколько прогеров, если архитектура составлена правильно и API специфицирован. Поэтому можно даже не держать штат специалистов (кроме архитектора и то не всегда), а прогеров из Индии через интернеты нанимать.
7. Легкое тестирование. Юнит-тесты не нужны: микросервис не большого размера, тестирование осуществляется просто развёрткой контейнера с микросервисом и проверкой ответов на API-запросы.
8. Безопасность. Микросервисы изолированы как в плане БД так и на уровне контейнеров. Взлом одного микросервиса позволяет получить доступ только его данным.
9. Независимость от технологий. Микросерисы работают очереди или простые http/https-запросы, поэтому они могут вообще быть реализованы в гомогенной среде, где часть работает на php в линуксе с mysql, часть на solaris с явой и oracle db, а часть вообще на C# на винде с MS SQL.

Мой вопрос в следующем: когда такая архитектура может не быть лучшем вариантом?

Исключаем джумлы, хелловорлды (мелки проекты), нищеговнище (когда клиент - лох нищебродный и не имеет кластера своего), а также алгоритмы с высокой степенью синхронизации (типа некоторых научных вычислений, нейронный сетей или бигдаты) или требований с сверхнизким задержкам. Кроме этих проблем, вроде, проблема только при программировании на заказ: нам сложно сделать для клиента vendor lock-in своим говнокодом, после чего на платную обязательную поддержку посадить.

Перемещено leave из development



Последнее исправление: AnyGov_security (всего исправлений: 2)

Мой вопрос в следующем: когда такая архитектура может не быть лучшим вариантом?

Когда разные идиоты используют ее как предлог для фарминга скора для толксов.

Deleted
()
Ответ на: комментарий от Deleted

У меня 39 (дефолтное 45, для лолксов нужно 50). Ты серьёзно думаешь, что я троллю не от чистого сердца, а для лолксов? И что по теме то?

AnyGov_security
() автор топика

Когда такие дебилы, как ты, срут в толксы
Лучше бы в клубе политоту коментил, или там скора не дают?

mystery ★★
()

Огромный минус следующий: усложнённая архитектура, в результате деплоймент и поддержка тонны микросервисов сложнее, нежели монолита на паре серверов.

Irben ★★★
()

Что, вебельщики переизобрели юникс-вей? До чего дошел прогресс!

anonymous
()

Так вот теперь какой тренд в технологиях продажи софта - микросервисная архитектура.

ya-betmen ★★★★★
()
Ответ на: комментарий от Irben

зависит от упоротости авторов, исключительно.

я часто сталкивался с такими «монолитными кусками оf shit» что кластер вручную развернуть проще.

Deleted
()

Меня недавно на собеседовании спросили, зачем нужны микросервисы. Я честно ответил, что не знаю, почему стадА тупоголовых кретинов следуют трендам сраных хипстеров вместо того, чтобы писать код. Ну хоть кофем угостили и то хорошо.

unt1tled ★★★★
()
Ответ на: комментарий от Deleted

зависит от упоротости авторов, исключительно.

При равной упоротости / адекватности авторов обеспечивать поддержку микросервисов сложнее. Если говорим о контейнерах, то кол-во машин, которые надо мониторить существенно возрастает. Конечно, всегда можно (и нужно) задокументировать каждую машину, сделать карту где что находится и что с чем общается. В таком случае у суппорта не получится делать что-либо по памяти, придётся на каждый чих открывать документацию и подключаться к нужной машине.

Также при грамотном построении монолита достаточно просто поднять среду разработки. Для микросервисов надо либо поднять всё и не париться по поводу связей, либо ковыряться в документации всех зависимостей сервиса, что необходимо изменить в данный момент, дабы поднять исключительно то, что надо.

Хочу заметить, что сейчас моя команда занимается как-раз переписыванием монолита на микросервисы и мне это нравится.

Irben ★★★
()
Ответ на: комментарий от no-such-file

И внезапно не остается ни хрена.

Т.е. в любой непонятной ситуации нужно использовать микросервисы? (Отсылка к: «В любой непонятной ситуации делай бочку. И да, бочка с водой может помочь при пожаре.»)

AnyGov_security
() автор топика
Ответ на: комментарий от Irben

Хочу заметить, что сейчас моя команда занимается как-раз переписыванием монолита на микросервисы и мне это нравится.

Обосрали микросервисы, возвысили монолит, а потом внезапно поменяли мнение. Да Вы, батенька, тролль!

Кстати, а переписываете через «разрывание» кода монолита на части (используете монолит, как ядро системы, вынимаете код из классов, перенося в микросервисы, а в классах делаете запросы в микросервисы) или с нуля?

AnyGov_security
() автор топика
Ответ на: комментарий от Irben

Если говорим о контейнерах, то кол-во машин, которые надо мониторить существенно возрастает. Конечно, всегда можно (и нужно) задокументировать каждую машину, сделать карту где что находится и что с чем общается. В таком случае у суппорта не получится делать что-либо по памяти, придётся на каждый чих открывать документацию и подключаться к нужной машине.

man оркестрация

и да, я не представляю как можно это не автоматизировать

Для микросервисов надо либо поднять всё и не париться по поводу связей, либо ковыряться в документации всех зависимостей сервиса, что необходимо изменить в данный момент, дабы поднять исключительно то, что надо.

это да, у нас по максимуму стабы для девелопа, но один фиг пришлось купить еще и ноут т.к. иногда нужно 4-5 сервисов в отладчике гонять

Deleted
()
Ответ на: комментарий от Deleted

Спасибо за чистосердечное, я пошел крысить в l-o-r.

Пожалуйста. Это просто капитанство, а не чистосердечное. Всем очевидно, что я - тролль и клоун. Но провокационная формулировка тем не умоляет их значения.

AnyGov_security
() автор топика
Ответ на: комментарий от Deleted

очень даже остается, я щас в таком эээ «проекте» ковыряюсь, на микросервисах 8)

Что же остаётся? Какие проблемы? Можно подробный обзор от первой задницы первого лица?

AnyGov_security
() автор топика
Ответ на: комментарий от Deleted

Да там такой «архитектор» собеседователь попался. У него на лице было написано «я 20 лет писал гуи и вот я всех подсидел и стал здесь богом, отвечай на мои ответы, насекомое». Я пол часа делал какой-то тупой сортинг строк на сисярпе и на все его вопросы отвечал нет и незнаю. Было весело, но я сдержался.

unt1tled ★★★★
()
Ответ на: комментарий от AnyGov_security

Это у вас троолобоязнь, сударь. Я просто веселюсь за ваш счет. Раньше для этого бухал как черт, но недавно занялся спортом и много пить уже не могу =/ приходится представляться героинщиком и генерировать бред на ходу. Свободу Даниилу Хармсу!

unt1tled ★★★★
()
Ответ на: комментарий от mystery

Когда такие дебилы, как ты, срут в толксы

Ты не попопутал девелопмент с толксами? Тут объективное мнение люди выражают, тащемто, а не собственную ненависть и упоротость.

Лучше бы в клубе политоту коментил, или там скора не дают?

Ох, как же задолбали, мне хоть интерью для ЛОРа давать: я уже 100 раз говорил, что мне не интересны сальноукропные конфликты и прочая хрень. Мне важно, только чтобы была большая зарплата и курс доллара хороший, чтобы я мог себе купить новый макбук и в стейкхаус ходить. Просто в рашке всё через жопу: вместо того, чтобы как США укреплять через войны свою валюту, тут только бюджетные бабки просирают. А так бы я поддерживал бы любую войну, если бы я от неё выиграл бы в ништяках.

Я просто не могу в политоту, да и пуканы сильно не взрываются у читателей.

AnyGov_security
() автор топика
Ответ на: комментарий от unt1tled

Это у вас троолобоязнь, сударь.

Говно в говне не тонет.

Я просто веселюсь за ваш счет.

Всегда пожалуйста, в этом то и есть моя суть.

Раньше для этого бухал как черт, но недавно занялся спортом и много пить уже не могу =/

Одно другому не мешает, даже наоборот: знакомые спортсмены как кони пьют. Ну если таки это действительно проблема, и Вы меня не троллите, то рекомендую использовать вещества (перед употреблением не забудьте проконсультироваться с врачем, возможны побочные эффекты).

AnyGov_security
() автор топика
Ответ на: комментарий от AnyGov_security

Просто ты черезжопный, даже гуглить не умеешь и создаешь тупые треды
Ну ты читал, что написал? Перечислил все плюсы и спрашиваешь, в чем минусы
Не зря тебя забанили, клоуна

mystery ★★
()
Ответ на: комментарий от Irben

При равной упоротости / адекватности авторов обеспечивать поддержку микросервисов сложнее. Если говорим о контейнерах, то кол-во машин, которые надо мониторить существенно возрастает. Конечно, всегда можно (и нужно) задокументировать каждую машину, сделать карту где что находится и что с чем общается. В таком случае у суппорта не получится делать что-либо по памяти, придётся на каждый чих открывать документацию и подключаться к нужной машине.

Если саппорт всё делает по памяти и не документирует изменения, то их надо гнать из продакшена ссаными тряпками в три шеи.

Также при грамотном построении монолита достаточно просто поднять среду разработки.

Что Вы подразумеваете под средой разработки? Если у Вас монолитное приложение, то Вы по-любому должны будете использовать гитхаб и мердж в конце, плюс каждый деплоинг будет проходить с замиранием сердцами и множественными инфарктами заказчика. Я уж молчу про проблемы масштабирования. И да: значительно замедляется скорость разработки, нужно контролить кодеров и делать постоянных кодревью, митапы. И всё-равно API (но уже для классов) надо будет делать. Или я где-то не прав?

Для микросервисов надо либо поднять всё и не париться по поводу связей, либо ковыряться в документации всех зависимостей сервиса, что необходимо изменить в данный момент, дабы поднять исключительно то, что надо.

Внезапно есть куча фрейморков и сред оркестрации. Там всё красиво представлено, в большинстве случаев прямо там можно и документацию вести.

AnyGov_security
() автор топика
Ответ на: комментарий от AnyGov_security

С похмелья трудно заниматься тяжелой отлетикой. Точнее еще труднее чем без него. А отходняки у меня по 3 дня бывают.

unt1tled ★★★★
()
Ответ на: комментарий от AnyGov_security

Обосрали микросервисы, возвысили монолит, а потом внезапно поменяли мнение. Да Вы, батенька, тролль!

Где обосрал? Вы читать умеете? Цитирую Вас же:

Мой вопрос в следующем: когда такая архитектура может не быть лучшем вариантом?

Я и говорю, что микросервисы усложняют поддержку и развёртывание среды разработки. Не вижу в этом ничего критичного, минусы есть везде.

Кстати, а переписываете через «разрывание» кода монолита на части (используете монолит, как ядро системы, вынимаете код из классов, перенося в микросервисы, а в классах делаете запросы в микросервисы) или с нуля?

К счастью, в моей ситуации монолитное ядро используется для более 20-ти проектов, большинство из которых никак не связано друг с другом. Переписываем проект за проектом, перенося траффик на новую систему.

Irben ★★★
()
Ответ на: комментарий от AnyGov_security

Раз не умаляет, значит обсудим. Но уже без тебя.

Deleted
()
Ответ на: комментарий от mystery

Просто ты черезжопный, даже гуглить не умеешь и создаешь тупые треды

У меня все треды всегда большие, с отсылками, а многие вообще тянут на небольшую статью. И аудитория мои треды любит, иначе бы они столько комментов не собирали. На свои твитотреды посмотри сначала, перед тем, как метра хаять.

Ну ты читал, что написал? Перечислил все плюсы и спрашиваешь, в чем минусы

Я указал, что минусы будут при джумлах, хеллоувордах, нищезаказчиках, ведредлокине и слишком «связанных» алгоритмах. Вам столько минусов не достаточно? Или, может, проблема в том, что Вы, хоть и научились читать, не понимаете тексты сложнее твитов? Случаем, высшего образования профильного нет? Это просто хорошо бы объяснило проблемы с когнитивными способностями.

Не зря тебя забанили, клоуна

У Вас просто багет от предыдущий тем не закончился, вот Вы и бугуртите мне в тред.

anonymous
()
Ответ на: комментарий от Irben

в результате деплоймент и поддержка тонны микросервисов сложнее, нежели монолита на паре серверов.

Только если уж вообще говнокод писать - то да, сложнее. Если писать нормально - микросервисная архитектура рулит и педалит. Мы у себя такую внедряем (правда, не под веб) - вообще зашибись, можно озадачить 100500 народу, никто не толкается, все сидят по своим «загончикам» и ничего друг у друга сломать не могут от слова «ваапще», потому как в центральные бибилиотеки их никто не пускает.

no-dashi ★★★★★
()

Мой вопрос в следующем: когда такая архитектура может не быть лучшем вариантом?

Когда системе не нужно масштабироваться, держать большие нагрузки и нужны все три буковки из CAP одновременно. Cильно заблуждаешься считая что такую систему сможет разрабатывать несколько обезьянок с архитектором и что HA появится как-то само собой. В лучшем случае для обезъянок получится выделить сервисы с поддержкой изолированных UDF подобных окружений.

У тебя слишком много нереалистичных упрощений. Например что все сервисы будут stateless, всё IPC будет выглядеть как { запрос -> ответ }, можно безболезненно что-то поменять в коде и разложить ограничившись локальными тестами, вообще что можно разрабатывать сервис локально без учёта его взаимодействия с остальным кластером - могут быть распределённые рейсы, петли автогенерации трафика IPC, сложные схемы DDoS отдельных сервисов и многое другое.

Многие массовые интернет проекты примерно так и устрены, но везде для поддержки и разработки таких систем держат штат из высокооплачиваемых кадров, трарят на него кучу денег. Оно оправдано когда сервис нужно делать для себя.

Можно покупать более дешевых прогеров <...> если <...> API специфицирован

лол.

mashina ★★★★★
()
Ответ на: комментарий от mashina

все три буковки из CAP одновременно

Есть бесхвостые которые смогли это для, допустим, банковских систем?

Deleted
()

Более-менее крупный проект сложно дробить на микросервисы. Слишком сильно пересекаются подсистемы, много взаимных зависимостей.

shimshimshim
()
Ответ на: комментарий от mashina

что значит значит не только http/https? очереди только большей скоростью и меньшими задержками отличаются, коллбеки и на https/http работают. про stateless тоже не понятно: почему БД не может быть как зависимость у группы гомогенных (для балансировки нагрузки) микросервисов и разворачиваться вместе с ними контейнером или заливаться в основную БД как uuid-специфичная БД для конкретной группы контейнеров? Петли генерации трафика могут возникать только при стрелянии себе в ногу из дробовика. И прочем тут UDF?

murmur
()
Ответ на: комментарий от mashina

Листал тред, думал ответить, но после этого поста все сказано

vertexua ★★★★★
()
Ответ на: комментарий от Deleted

Там есть ещё воображаемые буквы, например Latency, который вносят в А или нет. Или просто С и A не обязательно свежих данных. Этот академический пример, САР, очень сильно упрощают

vertexua ★★★★★
()
Ответ на: комментарий от Deleted

Есть бесхвостые которые смогли это для, допустим, банковских систем?

Если под банковской системой понимать всё, от СХД и заканчивая операторами в разных городах, то навряд ли.

mashina ★★★★★
()
Ответ на: комментарий от murmur

что значит значит не только http/https? очереди только большей скоростью и меньшими задержками отличаются, коллбеки и на https/http работают.

Что-то я не совсем понял вопрос. Объём очереди исходящих и входящих запросов для конкретного инстанса сервиса ограничен памятью, определяется двумя константами - байтами пакетов и кол-вом запросов. Ещё есть ограничение на время жизни самого запроса обусловленное временем ожидания ответа клиентом. IPC транспорт должен уметь делать flow control так, чтобы наиболее эффективно распоряжаться ресурсами в рамках этих ограничений. Например, не должен делать большие исходящие очереди на медленные пути, должен честно делить полосу между разными входящими клиентами и т.п.

HTTP/1.1 сам по себе этого ничего не умеет и вообще очень неудобный даже как чисто низкоуровневый трансорт (большой оверхед на разбор пакета, обязательный {req -> resp} цикл, однонаправленный поток). Потому используют более эффективные IPC транспорты со специальными протоколами на низком уровне (~ бинарные, дуплексные через одно TCP соединение или вообще UDP... и с навороченным flow control свеху). Для вебни и левака делают отдельные HTTP RESTful гейтвеи.

про stateless тоже не понятно: почему БД не может быть как зависимость <...> ?

Как много текста... Во-первых, БД это тоже сервис и он может быть размазан по нескольким шардам. Например, нам нужен полный ACID для какой-то сущности, но на один сервер вся такая БД не влезает. Тогда поднимают несколько реляционок, или свой аналог, и мажут по ним сущности по какому-то правилу. Вот уже получили привязку идентификатора сущности к конкретному statefull интсансу сервиса, т.е. тупая балансировка невозможна.

Во-вторых, каждый сервис может иметь своё runtime состояние даже при наличии внешней БД. Например, имеем IM сервис с контакт листом (jabber, ICQ и т.п.), нужно обеспечить отображение online состояния контактов. Для этого нужно загрузить из БД лист, создать в памяти состояние online'новости для каждого контакта и подписаться на уведомления у каждой сужности точно такого же сервиса (т.е. состояние выглядит как два списка, первый это {(контакт, статус)} и второй {подписчик на presence}) - снова имеем привязку сущности к конкретному инстансу сервиса где тупая балансировка невозможна, но подойдёт что-то вроде consistent hashing. А если здесь ещё нужно обеспечивать HA, то нужно мутить реалтаймовую репликацию состояния, тупую или сложную в виде какого-нибудь paxos.

Петли генерации трафика могут возникать только при стрелянии себе в ногу из дробовика.

Это всё иллюзии. Если кластер очень большой, т.е. много (микро)сервисов, то конкретный разработчик может не знать всех схем обмена сообщениями между сервисами. И легко может получиться, что сервис A идёт в сервис B, далее его запрос порождает другой запрос в сервис C .. проходит несколько итераций, запрос возвращается назад в A генерируя ещё +1 в B и т.д. И это не какой-то антипаттерн, а вполне себе рабочая схема которую нужно делать аккуратно и над которой нужно много думать.

Похожие петли с положительной обратной связью могут быть не только в виде реалтаймовых сообщений, но так же возможны в виде перекладывания данных из одной БД в другую (оффлайновые очереди, отложенные транзакции сроком на несколько дней...) образовывая временные петли на шкалах в несколько дней или даже месяцев.

И прочем тут UDF?

Это самое простое что можно сделать неквалифицированному разработчику в контексте распределённых систем, т.е. код что-то получает на вход производя некий выхлоп. И даже через такой простой интерфейс можно умудриться ухудшить работу всех остальных сервисов в кластере.

mashina ★★★★★
()

банхаммер на голове не жмет?

ты даже хуже анонимуса - у того хоть и шизофрения, но его интересно читать, ибо башка варит хоть немного

reprimand ★★★★★
()

Единственное преимущество микросервисов — можно писать разные сервисы на разных языках. Но учитывая, что JVM для серверов это лучшая платформа, это преимущество никому не нужно. Все остальные преимущества микросервисов присущи любому приложению. Из недостатков:

1. Чаще всего нет чётко определённых интерфейсов, ибо используется всякое REST-оподобное (подобное, потому что про REST больше говорят, чем знают) мессиво. Если вдруг используются Web Services, то очень много усилий приходится прикладывать для создания этих интерфейсов.

2. Скорость просто ужасающая. Вызов метода это наносекунды. Ну может микросекунды, если накрутить там всяких интерцепторов. Вызов REST-а это миллисекунды. В тысячи-миллионы раз медленней. Чаще всего отсюда и вылезает надобность в кластерах, лол.

3. Общее неудобство разработки, развёртывания тестового окружения и тд.

4. Безумное дублирование кода, ибо проще скопипастить, чем выносить чего-то в общую либу.

5. Всё же в определённый момент начинают выносить и получают Dependency Hell. Ибо разрабатывать с бинарной совместимостью умеет только Самый Главный Программист, все остальные фигачат как бог на душу положит, как следствие — у каждого «микросервиса» свои версии зависимостей, работает куча класслоадеров, течёт память вовсю, давно исправленные баги никогда не дают о себе забыть и прочие прелести безумного бардака.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)

Сложные комплексы всё равно будут состоять и тысяч микросервисов и отлаживать всё это в комплексе будет не так то просто, примерно также сложно как и обычный крупный проект на С++.

Простые тесты возможны только для для простого кода, который ни с чём толком не взаимодействует. Где идёт взаимодействие с оборудованием, пользователем и много чем ещё - тестами на уровне api уже не решаются все проблемы.

Объём и сложность взаимодействия никуда не девается. Сложные системы сложны. Тут ещё появляются накладные расходы на постоянное взаимодействие, которое ну нахрен не нужно(делить приложение на куски, которые взаимодействуют даже по простейшему rpc там, где можно обойтись динамическими либами это просто тупизм).

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

ixrws ★★★
()

Видимо проприетарщики отстали от модераторов, теперь их покупает анонiмус, судя по тому, что ктулху уже забанен, а он до сих пор Development засирает.

templarrr ★★★★★
()
Ответ на: комментарий от Deleted

можно спокойно пиписывать юнит тесты для килотонн микросервисов. всю жизнь

EnterpriseMobility
()
Ответ на: комментарий от EnterpriseMobility

В проектной документации, например. У нас для огромного проекта есть даже выделенный человек, кто разруливает коннекции и документирует это всё. Юнит тесты могут быть небольшой самодокументацией исключительно для разработчика и там ты не будешь писать по 100 всевозможных коннекций к разным тестовым и продукционным средам.

Irben ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.