Где наконец-то говорится, что микросервисы это не так уж хорошо и не всегда применимо. В конце статьи очень интересный список ссылок.
Расцвет микросервисов закончился. Uber преобразовывает тысячи микросервисов в более управляемое решение [1]; Келси Хайтауэр предсказывает, что будущее за монолитами [2]; и даже Сэм Ньюман заявляет, что микросервисы никогда не должны быть выбором по умолчанию, а скорее крайним средством [3].
Что происходит? Почему так много проектов стало невозможно поддерживать, несмотря на обещание микросервисов простоты и гибкости? Или все-таки монолиты лучше?
Я вот сам трушных микросервисов ни разу не встречал. Так что бы 1 сервис — 1 бд. Обычно делали 1 ил 2 бд к которым подключались несколько сервисов.
Либо же вообще за работу с каждой бд отвечал свой сервис, а остальные уже подключались к нему.
А вся эта куча сервисов как правило была доступна фронту через какой-либо api gateway типа ocelot.
Несколько бд было только в том случае, если одна реляционная, а другая — нет.
Кто как делает?
Я тоже считаю, что плодить множество действительно микросервисов с кучей баз данных повышает трудоемкость разработки и поддержки проектов. В первую очередь — это необходимость согласовывать изменения между сервисами. И невозможность вытащить данные из одной бд sql запросом.
Здравствуйте, BlackEric, Вы писали: BE>Кто как делает?
не имел дел. но где-то у Александреску читал, что основная причина появления таких архитектур, что ЯП типа джава потребляет слишком много ресурсов.
в отличии от нативных ЯП. Я и сам удивлялся сколько гласфишу нужно памяти для пары крохотных веб-приложений.
сишарп кушает поменьше но тоже нехило. плюс эта вечная отмазка про компиляцию первого вызова. пробовал ngen но прикола так и не понял.
а всякие джанго и питоны еще и медленные.
Здравствуйте, BlackEric, Вы писали:
BE>Я тоже считаю, что плодить множество действительно микросервисов с кучей баз данных повышает трудоемкость разработки и поддержки проектов. В первую очередь — это необходимость согласовывать изменения между сервисами. И невозможность вытащить данные из одной бд sql запросом.
Оверхед на микросервисность (и ценность микросервисности) зависит от размера организации — чем больше организация, тем меньше оверхед, и тем больше ценность. Микросервисность — это в первую очередь про изоляцию команд друг от друга. Если речь идёт про 100 команд по 10 человек, вопрос изоляции/автономности есть и он важен. Когда одна команда из 5 человек начинает себе микросервисы делать, это конечно глупость.
Здравствуйте, vaa, Вы писали:
vaa>не имел дел. но где-то у Александреску читал, что основная причина появления таких архитектур, что ЯП типа джава потребляет слишком много ресурсов.
А разве не возможность делать изи горизонтальное масштабирование?
Здравствуйте, BlackEric, Вы писали:
BE>Я вот сам трушных микросервисов ни разу не встречал. Так что бы 1 сервис — 1 бд. Обычно делали 1 ил 2 бд к которым подключались несколько сервисов. BE>Либо же вообще за работу с каждой бд отвечал свой сервис, а остальные уже подключались к нему. BE>А вся эта куча сервисов как правило была доступна фронту через какой-либо api gateway типа ocelot.
BE>Несколько бд было только в том случае, если одна реляционная, а другая — нет.
BE>Кто как делает?
На новой работе сделали несколько сервисов. Каждый сервис с отдельной БД. Не сказал бы, что они микро. Мне не нравится. Любители копипаста. Нужен новый схожий проект — создают новый репозиторий в гитлабе, склонированный из старого, копируют базу и поехали менять. Надеюсь всё это выбросить и переделать в один универсальный сервис с единой БД. Хотя не факт, что дадут.
BE>Я тоже считаю, что плодить множество действительно микросервисов с кучей баз данных повышает трудоемкость разработки и поддержки проектов. В первую очередь — это необходимость согласовывать изменения между сервисами. И невозможность вытащить данные из одной бд sql запросом.
Ещё по моим наблюдениям такие сервисы имеют тенденцию по последней причине копировать куски базы между сервисами и пытаться их синхронизировать, обычно не особо удачно. В общем придумываем проблемы и героически их решаем.
Вот, кстати, "идея для стартапа" — надёжная и быстрая синхронизация некоторого подмножества БД между разными базами.
Здравствуйте, vaa, Вы писали:
BE>>Кто как делает? vaa>не имел дел. но где-то у Александреску читал, что основная причина появления таких архитектур, что ЯП типа джава потребляет слишком много ресурсов. vaa>в отличии от нативных ЯП. Я и сам удивлялся сколько гласфишу нужно памяти для пары крохотных веб-приложений.
Тут можно схитрить и не запускать отдельный сервер приложений для каждого микросервиса. Тогда накладные расходы на каждый микросервис будут небольшими. Правда там свои проблемы появляются, но в целом решаемые. Хотя это старые и не модные технологии нынче. Поэтому да, по факту жава жрёт память дико, если жалко гигабайта на каждый микросервис, лучше от жавы сразу отказываться в пользу го, ноды или пайтона.
Здравствуйте, rosencrantz, Вы писали:
R>Здравствуйте, BlackEric, Вы писали:
BE>>Я тоже считаю, что плодить множество действительно микросервисов с кучей баз данных повышает трудоемкость разработки и поддержки проектов. В первую очередь — это необходимость согласовывать изменения между сервисами. И невозможность вытащить данные из одной бд sql запросом.
R>Оверхед на микросервисность (и ценность микросервисности) зависит от размера организации — чем больше организация, тем меньше оверхед, и тем больше ценность. Микросервисность — это в первую очередь про изоляцию команд друг от друга. Если речь идёт про 100 команд по 10 человек, вопрос изоляции/автономности есть и он важен. Когда одна команда из 5 человек начинает себе микросервисы делать, это конечно глупость.
Команда в 10 человек — это уже толпа. И она вполне способна сделать большой проект.
А на практике команды в 4-5 человек начинают плодить сервисы с кубернетисом, кучей нод и потом думаю как же все это поддерживать.
Здравствуйте, vsb, Вы писали:
vsb>На новой работе сделали несколько сервисов. Каждый сервис с отдельной БД. Не сказал бы, что они микро. Мне не нравится. Любители копипаста. Нужен новый схожий проект — создают новый репозиторий в гитлабе, склонированный из старого, копируют базу и поехали менять. Надеюсь всё это выбросить и переделать в один универсальный сервис с единой БД. Хотя не факт, что дадут.
Ну вот и мы при начале проектов обычно приходили к тому же выводу, что будет много накладных расходов на синхронизацию баз или запросов между базами и решали использовать одну бд на несколько веб-сервисов.
Здравствуйте, vsb, Вы писали:
vsb>Здравствуйте, vaa, Вы писали:
BE>>>Кто как делает? vaa>>не имел дел. но где-то у Александреску читал, что основная причина появления таких архитектур, что ЯП типа джава потребляет слишком много ресурсов. vaa>>в отличии от нативных ЯП. Я и сам удивлялся сколько гласфишу нужно памяти для пары крохотных веб-приложений.
vsb>Тут можно схитрить и не запускать отдельный сервер приложений для каждого микросервиса. Тогда накладные расходы на каждый микросервис будут небольшими. Правда там свои проблемы появляются, но в целом решаемые. Хотя это старые и не модные технологии нынче. Поэтому да, по факту жава жрёт память дико, если жалко гигабайта на каждый микросервис, лучше от жавы сразу отказываться в пользу го, ноды или пайтона.
Один сервис — один докер контейнер или ВМ. Иначе смысла нет. Даже перезапуск веб-сервера перезапускает все сервисы сразу. Ничем не будет отличаться от монолита.
Здравствуйте, BlackEric, Вы писали:
BE>Один сервис — один докер контейнер или ВМ. Иначе смысла нет.
Почему?
BE>Даже перезапуск веб-сервера перезапускает все сервисы сразу.
Перезагрузка компьютера тоже перезапускает все сервисы сразу, докер там или не докер.
BE>Ничем не будет отличаться от монолита.
Почему? Для меня отличие монолита от микросервиса в "толщине" границ. А что там используется для запуска — докер, процесс ОС или сервер приложений — это уже детали реализации.
G>А разве не возможность делать изи горизонтальное масштабирование?
ну да. и вообще тут вопрос выбора должен определятся тем действительно ли будет перегружено приложение? или в итоге все усилия будут потрачены впустую.
опять вспомнил доклад рича хикки от 2012 "значение значений".
там он предлагает уходит от "программирования на месте" к иммутабельному ФП аргументируя это тем что уже 5-10 лет железо не проблема. хватит мол экономить на байтах.
странно конечно слышать такое от сишника.
вот александреску так не считает. нам все еще нужны быстрые программы с малым потреблением ресурсов.
у раста в этом смысле есть будущее. если учесть что он на достаточно медленном llvm работает дебианбенчмарки впечатляют.
Здравствуйте, BlackEric, Вы писали:
vsb>>Тут можно схитрить и не запускать отдельный сервер приложений для каждого микросервиса. Тогда накладные расходы на каждый микросервис будут небольшими. Правда там свои проблемы появляются, но в целом решаемые. Хотя это старые и не модные технологии нынче. Поэтому да, по факту жава жрёт память дико, если жалко гигабайта на каждый микросервис, лучше от жавы сразу отказываться в пользу го, ноды или пайтона.
BE>Один сервис — один докер контейнер или ВМ. Иначе смысла нет. Даже перезапуск веб-сервера перезапускает все сервисы сразу. Ничем не будет отличаться от монолита.
Ну так сейчас уже поверх докеров и куберов накручивают опеншифт, очень удобная штука, решает ряд головняков. Так что микросервисная парадигма эволюционирует и развивается. Я считаю, что монолит — это прошлый век и ретроградство, тупиковая ветвь развития. Микросервисы лучше по многим показателям, пусть ещё пока имеют слабые стороны и нерешенные проблемы, их решение — вопрос времени.
Здравствуйте, rosencrantz, Вы писали:
BE>>Я тоже считаю, что плодить множество действительно микросервисов с кучей баз данных повышает трудоемкость разработки и поддержки проектов. В первую очередь — это необходимость согласовывать изменения между сервисами. И невозможность вытащить данные из одной бд sql запросом.
R>Оверхед на микросервисность (и ценность микросервисности) зависит от размера организации — чем больше организация, тем меньше оверхед, и тем больше ценность. Микросервисность — это в первую очередь про изоляцию команд друг от друга. Если речь идёт про 100 команд по 10 человек, вопрос изоляции/автономности есть и он важен. Когда одна команда из 5 человек начинает себе микросервисы делать, это конечно глупость.
Кроме изоляции команд, вторым мотивом является возможность дешевого горизонтального масштабирования. Если про это забыть, то даже у маленьких команд в 5 человек, реализующих по-старинке монолит, может настать момент когда они попадут со своим монолитом в ловушку масштабирования. У нас так один раз случилось, делали небольшой командой монолит, начали выводить на рынок, рынок захотел сразу много всяких новых фич, начали эти фичи прикручивать, уперлись в том, что монолит просто физически не справляется с задачами, диктуемыми рынком. Начали как говориться "распиливать монолит", потому что иначе невозможно распределить нагрузку. А если бы в начале подумали о масштабировании и изначально бы делали микросервисы, то проблемы бы не было.
Здравствуйте, vaa, Вы писали:
vaa>там он предлагает уходит от "программирования на месте" к иммутабельному ФП аргументируя это тем что уже 5-10 лет железо не проблема. хватит мол экономить на байтах.
Я в этом не эксперт. Но моё понимание такое: иммубательное ФП хорошо для процессоров с огромным числом ядер. Там работает модель с акторами, передачей сообщений. Чтобы было минимум синхронизаций через общую память. В идеале общей памяти вообще не должно быть. В 2012 году вероятно было представление, что число ядер будет расти. Правда расти оно начало лишь спустя 8 лет. В общем, имхо, когда у нас в ноутбуках будут тысячеядерные процессоры, в этом будет смысл.
vaa>вот александреску так не считает. нам все еще нужны быстрые программы с малым потреблением ресурсов. vaa>у раста в этом смысле есть будущее. если учесть что он на достаточно медленном llvm работает дебианбенчмарки впечатляют.
А ещё в последние годы всё актуальней встаёт вопрос безопасности со всех сторон.
Здравствуйте, gyraboo, Вы писали:
BE>>>Я тоже считаю, что плодить множество действительно микросервисов с кучей баз данных повышает трудоемкость разработки и поддержки проектов. В первую очередь — это необходимость согласовывать изменения между сервисами. И невозможность вытащить данные из одной бд sql запросом.
R>>Оверхед на микросервисность (и ценность микросервисности) зависит от размера организации — чем больше организация, тем меньше оверхед, и тем больше ценность. Микросервисность — это в первую очередь про изоляцию команд друг от друга. Если речь идёт про 100 команд по 10 человек, вопрос изоляции/автономности есть и он важен. Когда одна команда из 5 человек начинает себе микросервисы делать, это конечно глупость.
G>Кроме изоляции команд, вторым мотивом является возможность дешевого горизонтального масштабирования. Если про это забыть, то даже у маленьких команд в 5 человек, реализующих по-старинке монолит, может настать момент когда они попадут со своим монолитом в ловушку масштабирования. У нас так один раз случилось, делали небольшой командой монолит, начали выводить на рынок, рынок захотел сразу много всяких новых фич, начали эти фичи прикручивать, уперлись в том, что монолит просто физически не справляется с задачами, диктуемыми рынком. Начали как говориться "распиливать монолит", потому что иначе невозможно распределить нагрузку. А если бы в начале подумали о масштабировании и изначально бы делали микросервисы, то проблемы бы не было.
Здравствуйте, vsb, Вы писали:
G>>Кроме изоляции команд, вторым мотивом является возможность дешевого горизонтального масштабирования. Если про это забыть, то даже у маленьких команд в 5 человек, реализующих по-старинке монолит, может настать момент когда они попадут со своим монолитом в ловушку масштабирования. У нас так один раз случилось, делали небольшой командой монолит, начали выводить на рынок, рынок захотел сразу много всяких новых фич, начали эти фичи прикручивать, уперлись в том, что монолит просто физически не справляется с задачами, диктуемыми рынком. Начали как говориться "распиливать монолит", потому что иначе невозможно распределить нагрузку. А если бы в начале подумали о масштабировании и изначально бы делали микросервисы, то проблемы бы не было.
vsb>Ничего не мешает монолиту быть масштабируемым.
Если ты про горизонтальное масштабирование монолита, то да, но все равно придется реализовывать распределенные функции (иначе монолиты начнут перезатирать бд друг у друга и прочие косяки, связанные с неумением в распределнное взаимодействие), и тогда сама "монолитность" становится избыточным свойством такой системы, и переход на микросервисы становится неизбежным.
Расцвет микросервисов закончился. Uber преобразовывает тысячи микросервисов в более управляемое решение [1]; Келси Хайтауэр предсказывает, что будущее за монолитами [2]; и даже Сэм Ньюман заявляет, что микросервисы никогда не должны быть выбором по умолчанию, а скорее крайним средством [3].
То что сервисы (микросервисов не бывает) должны быть крайним средством — это факт. Но вот монолиты тоже не вариант, так как их сложно поддерживать.
BE>Я вот сам трушных микросервисов ни разу не встречал. Так что бы 1 сервис — 1 бд. Обычно делали 1 ил 2 бд к которым подключались несколько сервисов.
Я встречал. В Амазоне это сделано наиболее правильно из всего, что я видел. Границы сервисов — это границы команд. И публичный интерфейс сервисов — это то, о чём договорились на берегу.
BE>Я тоже считаю, что плодить множество действительно микросервисов с кучей баз данных повышает трудоемкость разработки и поддержки проектов. В первую очередь — это необходимость согласовывать изменения между сервисами. И невозможность вытащить данные из одной бд sql запросом.
При масштабах, на которых нужны сервисы, обычно данные одним запросом вытащить уже вообще нельзя.
Расцвет микросервисов закончился. Uber преобразовывает тысячи микросервисов в более управляемое решение [1]; Келси Хайтауэр предсказывает, что будущее за монолитами [2]; и даже Сэм Ньюман заявляет, что микросервисы никогда не должны быть выбором по умолчанию, а скорее крайним средством [3].
C>То что сервисы (микросервисов не бывает) должны быть крайним средством — это факт. Но вот монолиты тоже не вариант, так как их сложно поддерживать.
BE>>Я вот сам трушных микросервисов ни разу не встречал. Так что бы 1 сервис — 1 бд. Обычно делали 1 ил 2 бд к которым подключались несколько сервисов. C>Я встречал. В Амазоне это сделано наиболее правильно из всего, что я видел. Границы сервисов — это границы команд. И публичный интерфейс сервисов — это то, о чём договорились на берегу.
BE>>Я тоже считаю, что плодить множество действительно микросервисов с кучей баз данных повышает трудоемкость разработки и поддержки проектов. В первую очередь — это необходимость согласовывать изменения между сервисами. И невозможность вытащить данные из одной бд sql запросом. C>При масштабах, на которых нужны сервисы, обычно данные одним запросом вытащить уже вообще нельзя.
Будущее за в меру упитанными и воспитанными микросервисами.
Здравствуйте, gyraboo, Вы писали:
G>Если ты про горизонтальное масштабирование монолита, то да, но все равно придется реализовывать распределенные функции (иначе монолиты начнут перезатирать бд друг у друга и прочие косяки, связанные с неумением в распределнное взаимодействие), и тогда сама "монолитность" становится избыточным свойством такой системы, и переход на микросервисы становится неизбежным.
Просто запускаешь монолит на N-серверах и роутишь запросы к нему. Про перезатирать бд друг у друга — я не понял. БД одна обычно и для БД разницы нет, идут к ней 10 коннектов от одного сервера или от 10 разных. Единственное, про что нужно думать, это про распределённый кеш, но решений для этого хватает и ничего изобретать не нужно. Почему переход на микросервисы становится неизбежным — я не понимаю.
Если упрёшься в БД, то масштабирование БД это отдельная тема, опять же никак не зависящая от монолитов или микросервисов.
Здравствуйте, vsb, Вы писали:
G>>Если ты про горизонтальное масштабирование монолита, то да, но все равно придется реализовывать распределенные функции (иначе монолиты начнут перезатирать бд друг у друга и прочие косяки, связанные с неумением в распределнное взаимодействие), и тогда сама "монолитность" становится избыточным свойством такой системы, и переход на микросервисы становится неизбежным.
vsb>Просто запускаешь монолит на N-серверах и роутишь запросы к нему. Про перезатирать бд друг у друга — я не понял. БД одна обычно и для БД разницы нет, идут к ней 10 коннектов от одного сервера или от 10 разных. Единственное, про что нужно думать, это про распределённый кеш, но решений для этого хватает и ничего изобретать не нужно. Почему переход на микросервисы становится неизбежным — я не понимаю.
vsb>Если упрёшься в БД, то масштабирование БД это отдельная тема, опять же никак не зависящая от монолитов или микросервисов.
Под перезатиранием БД я имею ввиду, что монолиты часто проектируются так, как будто бы у 1 экземпляра монолита 1 БД в эксклюзивном доступе, без оглядки на то, что одой БД могут пользоваться несколько копий монолита. Например, какие-нибудь таблицы с информацией о настройках — юзер меняет через UI глобальные настройку, и все монолиты подцепят эту настройку, чего бы не хотелось. Или таблицы с текущей информацией по каким-то идущим процессам на текущем инстансе (его "подцепят" и другие инстансы, чего бы не хотелось). И получается, что дял того, чтобы несколько монолитов работали с одной БД и не мешали друг другу, не перезатирали части данных или не подцепляли данные от другой копии, нужно проектировать монолит так чтобы он работал распределенно, а это уже первый шаг к микросервисам.
Здравствуйте, gyraboo, Вы писали:
G>Под перезатиранием БД я имею ввиду, что монолиты часто проектируются так, как будто бы у 1 экземпляра монолита 1 БД в эксклюзивном доступе, без оглядки на то, что одой БД могут пользоваться несколько копий монолита. Например, какие-нибудь таблицы с информацией о настройках — юзер меняет через UI глобальные настройку, и все монолиты подцепят эту настройку, чего бы не хотелось. Или таблицы с текущей информацией по каким-то идущим процессам на текущем инстансе (его "подцепят" и другие инстансы, чего бы не хотелось). И получается, что дял того, чтобы несколько монолитов работали с одной БД и не мешали друг другу, не перезатирали части данных или не подцепляли данные от другой копии, нужно проектировать монолит так чтобы он работал распределенно, а это уже первый шаг к микросервисам.
Это как раз не проблема. Указывать для какого юзера настройки необходимо все равно.
Гораздо серьезнее проблема что другие инстансы не сразу подхватывают изменение настроек сделанное на другом инстансе. А так как балансировщик обычно раскидывают клиентские подключения по случайным серверам начинаются проблемы пока кеш не обновится.
Здравствуйте, BlackEric, Вы писали:
G>>Под перезатиранием БД я имею ввиду, что монолиты часто проектируются так, как будто бы у 1 экземпляра монолита 1 БД в эксклюзивном доступе, без оглядки на то, что одой БД могут пользоваться несколько копий монолита. Например, какие-нибудь таблицы с информацией о настройках — юзер меняет через UI глобальные настройку, и все монолиты подцепят эту настройку, чего бы не хотелось. Или таблицы с текущей информацией по каким-то идущим процессам на текущем инстансе (его "подцепят" и другие инстансы, чего бы не хотелось). И получается, что дял того, чтобы несколько монолитов работали с одной БД и не мешали друг другу, не перезатирали части данных или не подцепляли данные от другой копии, нужно проектировать монолит так чтобы он работал распределенно, а это уже первый шаг к микросервисам.
BE>Это как раз не проблема. Указывать для какого юзера настройки необходимо все равно. BE>Гораздо серьезнее проблема что другие инстансы не сразу подхватывают изменение настроек сделанное на другом инстансе. А так как балансировщик обычно раскидывают клиентские подключения по случайным серверам начинаются проблемы пока кеш не обновится.
Ну да, у монолита обычно локальный кэш, так надо распределенный кэш прикручивать, hazelcast или gridgain из коробки такое умеют. А это тоже шаг в сторону микросервисов. Правда у распределенного кэша всё равно остается задержка или рассогласование, но это уже неизбежное следствие любой распределённой системы, по теореме CAP — "выбирайте два из трёх".
Здравствуйте, gyraboo, Вы писали:
G>Под перезатиранием БД я имею ввиду, что монолиты часто проектируются так, как будто бы у 1 экземпляра монолита 1 БД в эксклюзивном доступе, без оглядки на то, что одой БД могут пользоваться несколько копий монолита. Например, какие-нибудь таблицы с информацией о настройках — юзер меняет через UI глобальные настройку, и все монолиты подцепят эту настройку, чего бы не хотелось. Или таблицы с текущей информацией по каким-то идущим процессам на текущем инстансе (его "подцепят" и другие инстансы, чего бы не хотелось). И получается, что дял того, чтобы несколько монолитов работали с одной БД и не мешали друг другу, не перезатирали части данных или не подцепляли данные от другой копии, нужно проектировать монолит так чтобы он работал распределенно, а это уже первый шаг к микросервисам.
Ну естественно при проектировании монолита, который потенциально может понадобиться масштабировать, подобные вопросы нужно как минимум держать в уме. Понятно, что если приложение рассчитано на один сервер, а его запустили на нескольких, будут нюансы.
Я просто не согласен с тем, что это первый шаг к микросервисам. Это первый шаг к распределённой системе и скорей всего для подавляющего большинства проектов этот шаг будет последним, т.к. больше ничего и не нужно.
Посмотрел я на картинки, и что-то от них SOA пахнуло. Потом почитал немного — не ошибся. Их определение сервиса взято из Service Oriented Architecture. Вообще определения архитектур варьируются. Я дальше приведу те, которые использую сам (это enterprise integration patterns). Они дают очень четкое различие между SOA & Microservices.
Собственно, сервис на каждый бизнес-процесс — это один из характерных атрибутов SOA. Еще там обычно наблюдаются еще два уровня сервисов (инфраструктура — логи и т.п., и "бизнес-ядро" — всякие пользователи и прочие общие понятия). SOA идеально подходит для случаев, когда бизнес-сценарии включают множество шагов (потенциально — много ручных шагов). Например, "одобрить квартиру в ипотеку" — очень хороший кандидат на SOA. Там много внешних интеграций, процесс может включать осмотр квартиры специалистом и т.п. К сожалению, SOA вроде больше никуда не подходит.
BE>Где наконец-то говорится, что микросервисы это не так уж хорошо и не всегда применимо. В конце статьи очень интересный список ссылок.
Серебрянной пули нет, это известно было и до этого автора. Характерным критерием microservices architecture, которую учил я, является построение сервисов вокруг замкнутых контекстов (Bounded Context). Т.е. каждый сервис описывается в рамках "своей личной" модели. Микросервисы не допускают в API полей вида "userId — id пользователя в central user-management system", а SOA как раз допускает и даже приветствует. Условно, Backlog в статье имеет своих team и user (могут создаваться из других систем). Эти сущности могут иметь поля вроде externalId, но внутри самого сервиса эти поля не используются! Если выкинуть из первой картинки Backlog непонятную функцию "show item", получится неплохой микросервис.
Микросервисы устраняют проблемы (churn) вокруг широкоиспользуемых классов (вроде пользователя, базовых документов и т.п.) куда в монолите будут периодически пытаться писать много команд. Но зато создает проблемы синхронизации/репликации данных между сервисами и контекстами. Также усложняет UI/фасад, так как нет единого понятия "пользователь". Интерфейсным частям часто приходится ходить во много сервисов и собирать "полное" представление по частям. В общем, компромиссы.
BE>Кто как делает?
Я делаю микросервисы в моем определении (замкнутый контекст). Из артефактов реализации:
База логически у каждого своя (физически — может быть один экземпляр db engine).
Общение (push, в направлении зависимостей) в основном REST Level 2. Т.е. общение в терминах состояний а не операций.
Передача данных "в обратном направлении" — обычно через message queues. Люблю rabbit, где клиенты могут _сами_ подписаться на нужные обмены (exchange). Наличие exchange и форматы сообщений — часть контракта сервиса.
Есть разница между развертыванием (deployment) и сервисами (bounded context, роль в рамках большей системы). Один микросервис может иметь несколько различных компонент (т.е. несколько различных deployment unit). Эти компоненты могут ходить в базу и общаться по внутреннему протоколу. С точки зрения внешнего зрителя — это один среднего размера сервис.
BE>Я тоже считаю, что плодить множество действительно микросервисов с кучей баз данных повышает трудоемкость разработки и поддержки проектов.
Да, микросервисы делать сложнее по многим причинам. В какой-то книжке это прекрасно сформулированно было: если ваши разработчики не могут нормально сделать модульность в рамках одного монолита, то почему вы решили, что они смогут сделать нормальную модульность в рамках распределенной системы? Именно в дизайне модулей, разбиении на компоненты и начинаются проблемы. Всякие там зацепление и связность (coupling & cohesion). Почему-то не любят разработчики эти понятия. Разбивают систему на куски чисто механически. А в распределенной системе этот бардак становится заметен очень рано.
BE>В первую очередь — это необходимость согласовывать изменения между сервисами. И невозможность вытащить данные из одной бд sql запросом.
Так а это две стороны одной и той же медали. В микросервисах вам нужно согласовывать API между компонентами. В одной базе — согласовывать форматы данных хранения. Вот представьте, что моя команда сделала рефакторинг и переколбасила с десяток таблиц. Ваши sql запросы по вытаскиванию данных придется пересматривать. При определенной зрелости команды меньше согласований именно в микросервисах. Одна команда выкатила обратно-совместимый API (новые поля, новые content type, в крайнем случае — новые /api/vX). Затем туда переползают все пользователи сервиса, старый API отключается. Иногда так сделать нельзя, но очень часто все-же можно. Только это нужно уметь, а это задача вроде сложнее сортировки гномиков.
Здравствуйте, maxkar, Вы писали:.
M>Микросервисы устраняют проблемы (churn) вокруг широкоиспользуемых классов (вроде пользователя, базовых документов и т.п.) куда в монолите будут периодически пытаться писать много команд. Но зато создает проблемы синхронизации/репликации данных между сервисами и контекстами. Также усложняет UI/фасад, так как нет единого понятия "пользователь". Интерфейсным частям часто приходится ходить во много сервисов и собирать "полное" представление по частям. В общем, компромиссы.
Не по этой ли причине монолитный UI сейчас тоже пытаются разбить на микро? Фронтэндеры Тинькова вроде статью на Хабре об этом писали.
Здравствуйте, gyraboo, Вы писали:
G>Кроме изоляции команд, вторым мотивом является возможность дешевого горизонтального масштабирования.
Согласен кроме слова "дешевого". Микросервисы требуют специфической экосистемы и рабочих процессов. Например там где в монолите можно обойтись локальным инт тестом, в микросервисной архитектуре нужно будет поднимать эту самую распределённую систему и тестировать её "снаружи". Там где в монолите у вас интерфейсы между модулями — на уровне ЯП, в распределённой системе нужна технология для удалённого взаимодействия. Да куча примеров.
G>Если про это забыть, то даже у маленьких команд в 5 человек, реализующих по-старинке монолит, может настать момент когда они попадут со своим монолитом в ловушку масштабирования. У нас так один раз случилось, делали небольшой командой монолит, начали выводить на рынок, рынок захотел сразу много всяких новых фич, начали эти фичи прикручивать, уперлись в том, что монолит просто физически не справляется с задачами, диктуемыми рынком. Начали как говориться "распиливать монолит", потому что иначе невозможно распределить нагрузку. А если бы в начале подумали о масштабировании и изначально бы делали микросервисы, то проблемы бы не было.
Это только так кажется. Если бы вы изначально делали микросервисы, с большой вероятностью вообще до рынка не дошли бы — застряли бы на обслуживании самой этой микросервисности (без обид: либо у команды не было опыта с микросервисами, и поэтому стали делать монолит, либо был негативный опыт и _поэтому_ стали делать монолит . Вот вы начинаете проект — по какому критерию будете отдельные сервисы выделять?
Здравствуйте, gyraboo, Вы писали:
G>Под перезатиранием БД я имею ввиду, что монолиты часто проектируются так, как будто бы у 1 экземпляра монолита 1 БД в эксклюзивном доступе, без оглядки на то, что одой БД могут пользоваться несколько копий монолита.
Да ну. Крутить 3+ инстансов одного сервиса — это такой минимальный бест пректиз, который позволяет деплоить новые версии аппликейшна без даунтайма. Писать код в рассчёте на 1 инстанс — это по-моему 100% индикатор профнепригодности.
Здравствуйте, gyraboo, Вы писали:
G>Ну да, у монолита обычно локальный кэш
По-моему вы слово "монолит" используете как такое общее название для всех неудачных дизайновых решений. Слово "монолит" означает:
1. одна кодовая база
2. один деплоймент юнит
3. всё
Перестаёт ли монолит быть монолитом, если запустить его 5 инстансов? Нет, не перестаёт. Перестаёт ли монолит быть монолитом, если у него не локальный кэш, а несколько нодов редиса? Нет, не перестаёт. И т.д.
Здравствуйте, gyraboo, Вы писали:
G>Не по этой ли причине монолитный UI сейчас тоже пытаются разбить на микро? Фронтэндеры Тинькова вроде статью на Хабре об этом писали.
Причины те же, что и у микросервисов на бэкенде. Фронтэнд пилит не одна команда, а десяток. Команды появляются, исчезают, какие-то раньше, какие-то позже. Команды — разные. По квалификации, по предпочтениям, по темпераменту, по частоте релизов, и т.д. "Микрофронтэнды" позволяют этим командам действовать максимально независимо. Эти вон хотят писать на AngularJS, окей, нет проблем. Эти хотят на React — да ради бога. У вон тех по 4 релиза в день, на здоровье.
G>Не по этой ли причине монолитный UI сейчас тоже пытаются разбить на микро? Фронтэндеры Тинькова вроде статью на Хабре об этом писали.
Именно это и есть одна из реально важных причин, по которым микросервисы вообще пользуются популярностью. Чтобы разделить зоны ответственности команд. Наиболее надежным методом является необходимость общаться по сети. Там хошь не хошь, но придется продумать API.
В "монолите" же проблема в том, что если есть много команд, очень часто народ "прокручивает дырочки" в обход слоев разных API. Если это невозможно по чисто техническим причинам (нужно чтоб через сеть пролезало, однако), становится куда проще все это менеджить.
R>Да ну. Крутить 3+ инстансов одного сервиса — это такой минимальный бест пректиз, который позволяет деплоить новые версии аппликейшна без даунтайма. Писать код в рассчёте на 1 инстанс — это по-моему 100% индикатор профнепригодности.
Вы еще скажите, что отсутствие, скажем, staging environment, или test-only database является показателем профнепригодности. И очень много людей из FAANG почувствуют грусть, ибо очень часто сервисы (особенно внутренние) попросту не имеют инстансов. Есть только production, где с помощью разных ACL разделяются use-cases.
BE>>Я тоже считаю, что плодить множество действительно микросервисов с кучей баз данных повышает трудоемкость разработки и поддержки проектов. M>Да, микросервисы делать сложнее по многим причинам. В какой-то книжке это прекрасно сформулированно было: если ваши разработчики не могут нормально сделать модульность в рамках одного монолита, то почему вы решили, что они смогут сделать нормальную модульность в рамках распределенной системы? Именно в дизайне модулей, разбиении на компоненты и начинаются проблемы. Всякие там зацепление и связность (coupling & cohesion). Почему-то не любят разработчики эти понятия. Разбивают систему на куски чисто механически. А в распределенной системе этот бардак становится заметен очень рано.
Так всетаки микросервисы проще монолитов или сложнее? Я везде вижу один аргумент в пользу микросервисов, что они проще и масштабировать их легче. А вы пишите что нет.
BE>>В первую очередь — это необходимость согласовывать изменения между сервисами. И невозможность вытащить данные из одной бд sql запросом.
M>Так а это две стороны одной и той же медали. В микросервисах вам нужно согласовывать API между компонентами. В одной базе — согласовывать форматы данных хранения. Вот представьте, что моя команда сделала рефакторинг и переколбасила с десяток таблиц. Ваши sql запросы по вытаскиванию данных придется пересматривать. При определенной зрелости команды меньше согласований именно в микросервисах. Одна команда выкатила обратно-совместимый API (новые поля, новые content type, в крайнем случае — новые /api/vX). Затем туда переползают все пользователи сервиса, старый API отключается. Иногда так сделать нельзя, но очень часто все-же можно. Только это нужно уметь, а это задача вроде сложнее сортировки гномиков.
При использовании правильных средств в монолитном приложении запросы проверяются при компиляции.
Здравствуйте, SkyDance, Вы писали:
R>>Да ну. Крутить 3+ инстансов одного сервиса — это такой минимальный бест пректиз, который позволяет деплоить новые версии аппликейшна без даунтайма. Писать код в рассчёте на 1 инстанс — это по-моему 100% индикатор профнепригодности.
SD>Вы еще скажите, что отсутствие, скажем, staging environment, или test-only database является показателем профнепригодности. И очень много людей из FAANG почувствуют грусть, ибо очень часто сервисы (особенно внутренние) попросту не имеют инстансов. Есть только production, где с помощью разных ACL разделяются use-cases.
Фаанг так делает не из-за того, что это охрененное решение, а из-за кучи ограничений с которыми ему нужно жить (легаси, развесистая экосистема, дохрена народу, и главное — желание максимально сократить время поставки правок в продакшн). Что они там делают — это совершенно точно не решение по умолчанию для всех, и не эталон к которому нужно стремиться.
Но я вообще не про энвайронменты писал. Я высказывал несогласие с заявлением коллеги:
монолиты часто проектируются так, как будто бы у 1 экземпляра монолита 1 БД в эксклюзивном доступе, без оглядки на то, что одой БД могут пользоваться несколько копий монолита
Вся проблема в слове "микро". Думаю, что это не совсем удачная формулировка. Из-за этого вся и проблема, некоторые видят эту приставку "микро", и делают сервисы черезмерно мелкими и получают ад из общительных сервисов.
BE>Несколько бд было только в том случае, если одна реляционная, а другая — нет.
А кто мешает в одной СУБД иметь несколько разных бд, или в одной бд иметь разные схемы для каждого сервиса?
BE>Кто как делает?
Несколько лет тому назад делал проект для сети местных больничек.
Так, вот был реализованы следущие сервисы: "Расписание врачей", "Лаборатория", "Мед.Карта" и ряд вспомогательных сервисов.
Так же разрабатывал архитектуру сервисов для энерегетической западной компании.
BE>Я тоже считаю, что плодить множество действительно микросервисов с кучей баз данных повышает трудоемкость разработки и поддержки проектов. В первую очередь — это необходимость согласовывать изменения между сервисами. И невозможность вытащить данные из одной бд sql запросом.
Я так не считаю.
А за чем тебе вытаскивать одним SQL запросом данные, которые в разных доменах?
Ну вот в моем примере,больному назначены те или иные анализы, в лаборатории своя предметная область, свои данные, на выход выдается стандартный отчет с целевыми показателями, выходят ли эти показатели за границу или нет.
За чем делать запрос в бд лаборатории и джойнить данные из таблиц лаборатории с данными из таблиц для мед.карты больного?
Если у тебя есть необходимость в джойне данных между разными бд, то, скорее всего неправильно разбил доменные сущности.
В общем, микросервисы — это реально рабочий инструмент, но как и любым инструментом, им надо пользоваться правильно. Мало почитать книжки, надо сделать какой-нибудь свой пет проект с помощью микросервисной архитектуры.
P.S. Пример с распиливанием сервиса Backlog — на 8 раздельных сервисов — это крайне тупая вещь, и через эту крайне тупую вещь, заставляют принять мысль, что вся идея микросервисов — тупая.
vsb>Просто запускаешь монолит на N-серверах и роутишь запросы к нему. Про перезатирать бд друг у друга — я не понял. БД одна обычно и для БД разницы нет, идут к ней 10 коннектов от одного сервера или от 10 разных. Единственное, про что нужно думать, это про распределённый кеш, но решений для этого хватает и ничего изобретать не нужно. Почему переход на микросервисы становится неизбежным — я не понимаю.
В некоторых проектах такое норм. В некоторых не прохиляет. Смотри пример. В одном из проектов нужно было распознавать объекты с потокового видео.
Так, вот сервис этот был ресурсозатратным и дорогим, естественно, его масштабировали при достижении пиковых нагрузок, разворачивая довольно дорогие инстансы виртуалок в облаке.
А был ряд сервисов по-проще, у которых нагрузка была гораздо меньшей. И за чем эти сервисы хостить на дорогих инстансах?
И тут встает финансовый вопрос. Если у нас монолит, то при необходимости масштабировать сервисы, которые требуют минимальных ресурсов, придется их деплоить на более производительные инстансы.
Или задача автоматического масштабирования становится очень интересной.
vsb>Если упрёшься в БД, то масштабирование БД это отдельная тема, опять же никак не зависящая от монолитов или микросервисов.
Тут дело не только в масштабировании бд.
Для сущностей одного домена лучше подойдет реляционная бд, для сущностей другого домена лучше подойдет джокументная бд, для сущностей 3-го домена, лучше подойдет графовая бд.
Понятно, что все можно запилить на реляционной БД, но в некоторых случаях — это будет сложнее.
Здравствуйте, BlackEric, Вы писали:
BE>Один сервис — один докер контейнер или ВМ. Иначе смысла нет. Даже перезапуск веб-сервера перезапускает все сервисы сразу. Ничем не будет отличаться от монолита.
А если веб-сервисов несколько контейнеров, и они спрятаны за nGinx? Тогда можно ребутать каждый контейнер без особых потерь. А если используется какой-нибудь распределённый In-memory storage для хранения сессий и прочего состояния, то вообще нет проблем ребутать, главное чтоб число одновременных онлайн-узлов не опускалось ниже требований репликатора.
Здравствуйте, gyraboo, Вы писали:
G>И получается, что дял того, чтобы несколько монолитов работали с одной БД и не мешали друг другу, не перезатирали части данных или не подцепляли данные от другой копии, нужно проектировать монолит так чтобы он работал распределенно, а это уже первый шаг к микросервисам.
Здравствуйте, white_znake, Вы писали:
_>А за чем тебе вытаскивать одним SQL запросом данные, которые в разных доменах? _>Ну вот в моем примере,больному назначены те или иные анализы, в лаборатории своя предметная область, свои данные, на выход выдается стандартный отчет с целевыми показателями, выходят ли эти показатели за границу или нет. _>За чем делать запрос в бд лаборатории и джойнить данные из таблиц лаборатории с данными из таблиц для мед.карты больного?
Фантазируя — а если понадобится какая-то статистика/анализ зависимостей по больным, лабораториям и моделями оборудования лабораторий?
Как быть?
Здравствуйте, white_znake, Вы писали:
_>А за чем тебе вытаскивать одним SQL запросом данные, которые в разных доменах? _>Ну вот в моем примере,больному назначены те или иные анализы, в лаборатории своя предметная область, свои данные, на выход выдается стандартный отчет с целевыми показателями, выходят ли эти показатели за границу или нет. _>За чем делать запрос в бд лаборатории и джойнить данные из таблиц лаборатории с данными из таблиц для мед.карты больного?
Ну, например, первое, что приходит в голову — врачу, работающему с мед.картой, (да и пациенту на руки распечатку) надо отобразить так:
1. Вверху диалога — ФИО пациента (домен "Мед.карта"?)
2. Под ФИО таблицу со столбцами:
Вид анализа (как минимум — это название из справочника, находящегося в домене "Лаборатория"?)
Фактический результат (то, что реально обнаружили в лаборатории)
Допустимые результаты (то, что считается нормой для данного людей данного пола/возраста и т.п.)
Вот уже в одной отчетной форме (в одном диалоге) имеем данные из двух доменов.
Можно, конечно, к справочнику "Видов анализа" обратиться через API сервиса "Лаборатория", а в таблице "Результаты_анализов_пациента" из сервиса "Мед.карта" хранить только ID вида анализа (GUID или некий строковый идентификатор).
Но ведь простой SQL-ный "INNER JOIN" будет проще.
Нет?
Красота — наивысшая степень целесообразности. (c) И. Ефремов
Здравствуйте, swimmers, Вы писали:
S>Здравствуйте, white_znake, Вы писали:
_>>А за чем тебе вытаскивать одним SQL запросом данные, которые в разных доменах? _>>Ну вот в моем примере,больному назначены те или иные анализы, в лаборатории своя предметная область, свои данные, на выход выдается стандартный отчет с целевыми показателями, выходят ли эти показатели за границу или нет. _>>За чем делать запрос в бд лаборатории и джойнить данные из таблиц лаборатории с данными из таблиц для мед.карты больного?
S>Фантазируя — а если понадобится какая-то статистика/анализ зависимостей по больным, лабораториям и моделями оборудования лабораторий? S>Как быть?
А как связаны больные с используемым оборудованием? Из мед.кабинета в лабораторию уходит пробирка со штрихкодом и показателями, которые нужно исследовать, в мед.карте больного добавляется направление на анализ со штрихкодом и требуемыми показателями.
Из лаборатории приходит отчет со штрихкодом и результатами. Ни какой зависимости между больным и лабораторным оборудованием — нет.
В лаборатории не знают ни чего о пациенте.
S>Вот уже в одной отчетной форме (в одном диалоге) имеем данные из двух доменов.
Нет не имеем
S>Можно, конечно, к справочнику "Видов анализа" обратиться через API сервиса "Лаборатория", а в таблице "Результаты_анализов_пациента" из сервиса "Мед.карта" хранить только ID вида анализа (GUID или некий строковый
идентификатор).
Совсем не так. Есть общий информационный сервис-правочник с кодами исследований и болезней, который используется и в мед.картах и в лаборатории. S>Но ведь простой SQL-ный "INNER JOIN" будет проще. S>Нет?
Конечно нет, потому что мед.карты в реляционной субд, а результаты лабораторных исследований в NoSql бд.
Здравствуйте, white_znake, Вы писали:
_>А как связаны больные с используемым оборудованием? Из мед.кабинета в лабораторию уходит пробирка со штрихкодом и показателями, которые нужно исследовать, в мед.карте больного добавляется направление на анализ со штрихкодом и требуемыми показателями. _>Из лаборатории приходит отчет со штрихкодом и результатами. Ни какой зависимости между больным и лабораторным оборудованием — нет. _>В лаборатории не знают ни чего о пациенте.
А я не знаю, как связаны.
Это задача не уровня лаборатории.
Вдруг есть уникальные люди, у которых стандартный анализ на А на оборудовании Б имеет какие-то особенности?
Как их найти?
Или как найти какие-то другие неочевидные зависимости?
S>Вдруг есть уникальные люди, у которых стандартный анализ на А на оборудовании Б имеет какие-то особенности? S>Как их найти? S>Или как найти какие-то другие неочевидные зависимости?
Какие прекрасные фантазии
Но в лабораторию данные поступают обезличенные.
Ну ладно. Предположим, что случлась какая-то аномалия и нужно для конкретного направления на анализы (по штрих коду) получить данные о том, на каком оборудовании и с какими параметрами производились анализцы.
Не проблема. Добавим метод в REST API сервиса лаборатории о получении таких данных. Но это реально будет редкоиспользуемой фичей. Думается, что не каждый врач разбирается в настройках оборудования.
Здравствуйте, swimmers, Вы писали:
S>Как их найти? S>Или как найти какие-то другие неочевидные зависимости?
Обычно подобное решается созданием специальных свалок данных, по которым можно безболезненно для production'а запускать аналитику.
Кроме того, с учётом защиты приватных данных, часто в принципе нельзя давать возможность просто взять и выполнить произвольный запрос. Так как нужно редактирование или анонимизирование.
Здравствуйте, white_znake, Вы писали:
S>>Вот уже в одной отчетной форме (в одном диалоге) имеем данные из двух доменов. _>Нет не имеем
_>Совсем не так. Есть общий информационный сервис-правочник с кодами исследований и болезней, который используется и в мед.картах и в лаборатории.
Отлично. То есть на самом деле тут три сервиса — справочник, лаборатория, и мед.карты. И простая штука "результат исследования" в PDF генерируется из данных трёх сервисов. Я правильно понял?
Кстати — какой из сервисов за этот PDF отвечает: медкарты, лаборатория, или справочник?
_>Конечно нет, потому что мед.карты в реляционной субд, а результаты лабораторных исследований в NoSql бд.
Стесняюсь спросить: а зачем? Что там у нас такого в лабораторных исследованиях, что не ложится в какой-нибудь банальный postgres?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, white_znake, Вы писали:
_>Из мед.кабинета в лабораторию уходит пробирка со штрихкодом и показателями, которые нужно исследовать, в мед.карте больного добавляется направление на анализ со штрихкодом и требуемыми показателями. _>Из лаборатории приходит отчет со штрихкодом и результатами. _>В лаборатории не знают ни чего о пациенте.
Это ты описал процесс, как он выглядит со стороны медиков (лечащий врач, передавший пробирку в лабораторию, и лаборант, проведший анализ содержимого пробирки).
А как это выглядит программно (для простоты считаем, что одна пробирка — один вид анализа)?
Предполагаю так (поправь меня): лаборант, получив пробирку с биоматериалом внутри и штрихкодом снаружи, сканирует этот штрихкод
по ID пробирки (полученном из штрих-кода) в домен "Мед.карта" уходит запрос типа "Какой анализ надо сделать для пробирки с таким-то ID?"
из домена "Мед.карта" приходит ID типа анализа
в домене "Лаборатория" создается некий объект типа "Проведение анализа" с указанием ID пробирки и ID типа анализа
из домена "Лаборатория" в домен "Справочники" уходит запрос типа "Что это за тип анализа с таким-то ID типа?"
из домена "Справочники" приходит ответ с описанием типа анализа
лаборант, прочитал задание, провел анализ, внес результаты (которые сразу улетели в домен "Мед.карта"), а в домене "Лаборатория" у добавленного выше объекта "Проведение анализа" выставляется статус "Выполнено, передано в Мед.карту".
в домене "Мед.карта" полученные результаты сохраняются и проставляется признак, что результаты анализов получены
Примерно так?
Ну тогда отвечая на твой изначальный вопрос: _>>>За чем делать запрос в бд лаборатории и джойнить данные из таблиц лаборатории с данными из таблиц для мед.карты больного?
могу сказать, что как раз связь с доменом "Справочники" очень хочется сделать "INNER JOIN"-ом.
Но сделать так нельзя, потому, что справочник типов анализа должен быть доступен из обоих прикладных доменов: и для "Мед.карты", и для "Лаборатории".
Красота — наивысшая степень целесообразности. (c) И. Ефремов
Здравствуйте, Sinclair, Вы писали:
_>>Совсем не так. Есть общий информационный сервис-правочник с кодами исследований и болезней, который используется и в мед.картах и в лаборатории. S>Отлично. То есть на самом деле тут три сервиса — справочник, лаборатория, и мед.карты. И простая штука "результат исследования" в PDF генерируется из данных трёх сервисов. Я правильно понял? S>Кстати — какой из сервисов за этот PDF отвечает: медкарты, лаборатория, или справочник?
Вокрфлоу здорового человека:
1. "лаборатория" подключаясь к системе отдает capabilities, что она умеет измерять и как она это делает.
2. "клиника" направляет биоматериал пациента (в том числе в виде целикового человка) в "лабораторию". На этом этапе биоматериал анонимизируется, ибо закон о медицинских данных.
3. "лаборатория" присылает результат исследования обогащенный метаданными о том что, как и с какими погрешностями измерялось. Однажды сделанные исследования уже нельзя поправлять задним числом.
4. "клиника" включает результаты исследований в медицинскую карту и ставит диагноз. Опять же, однажды поставленный диагноз уже нельзя просто так убрать.
Если завтра в capabilities лаборатории изменятся, это никак не должно повлиять на уже сделанные анализы. Если завтра примут МКБ-12, то и это никак не должно повлиять на уже сделанные анализы и назначения.
Я даже больше скажу, в любой предметной области связанной с реальным миром есть подобные ограничения. Например, в геодезии "подвигать точки" можно только через суд, а в торговле поменять закрытую отгрузку со склада можно только через возврат обратно на склад.
S>Стесняюсь спросить: а зачем? Что там у нас такого в лабораторных исследованиях, что не ложится в какой-нибудь банальный postgres?
Например, там может быть какой-нибудь DICOM сервер, в том числе и физически встроенный в томограф. Кроме того, результат исследования это достаточно сложная штука. Пациенту показывается только финальный результат, когда в реальности лаборатория может оперировать на несколько порядков большим объемом промежуточных данных часть из которых имеет смысл хранить. Включая, например, физические "стекла" по которым смотрели гистологию.
Здравствуйте, Sinclair, Вы писали:
_>>Конечно нет, потому что мед.карты в реляционной субд, а результаты лабораторных исследований в NoSql бд. S>Стесняюсь спросить: а зачем? Что там у нас такого в лабораторных исследованиях, что не ложится в какой-нибудь банальный postgres?
Рентгеновские или МРТ-снимки, аннотированные результаты ДНК-тестов, например.
Здравствуйте, Miroff, Вы писали:
M>1. "лаборатория" подключаясь к системе отдает capabilities, что она умеет измерять и как она это делает.
Ну ты немного другую архитектуру описал. У тебя справочник видов анализов (capabilities) хранится в "Лаборатории", а у white_znake он вынесен в отдельный сервис "Справочники": _>>>Совсем не так. Есть общий информационный сервис-правочник с кодами исследований и болезней, который используется и в мед.картах и в лаборатории.
Т.е., если я правильно понимаю, у него "Мед.карта" и "Лаборатория" хранят только ID видов анализов. А детализация этих ID тянется из другого сервиса.
Красота — наивысшая степень целесообразности. (c) И. Ефремов
Здравствуйте, Miroff, Вы писали:
S>>Кстати — какой из сервисов за этот PDF отвечает: медкарты, лаборатория, или справочник? M>Вокрфлоу здорового человека:
А теперь как это работает в РЕАЛЬНОЙ системе (LabCorp) по состоянию на примерно 3 года назад.
M>1. "лаборатория" подключаясь к системе отдает capabilities, что она умеет измерять и как она это делает.
Подключение к лаборатории пишется отдельной интеграцией, со своим кодом и отдельными ужимками. Тесты пишутся в контракте и имеют стандартные коды (из общегосударственного справочника), специальные тесты имеют коды из приватного диапазона.
M>2. "клиника" направляет биоматериал пациента (в том числе в виде целикового человка) в "лабораторию". На этом этапе биоматериал анонимизируется, ибо закон о медицинских данных.
Клиника отправляет в лабораторию запрос. Путём отсылки файла через FTP. Файл зашифрован с помощью PGP публичным ключом, который напечатали внутри контракта.
Файл — это XML специальной схемы. В нём данные пациента, включая идентификационные и биллинговые. Это, в частности, нужно для того, чтобы в лаборатории можно было подтвердить имя и дату рождения пациента.
M>3. "лаборатория" присылает результат исследования обогащенный метаданными о том что, как и с какими погрешностями измерялось. Однажды сделанные исследования уже нельзя поправлять задним числом.
Статус исследований и результаты раз в несколько часов выкладываются на FTP, откуда их клиника может забрать.
Альтернативный вариант — это лаборатория их посылает по факсу на указанный в заявке номер. Кстати, заявку прислать можно тоже по факсу.
M>4. "клиника" включает результаты исследований в медицинскую карту и ставит диагноз. Опять же, однажды поставленный диагноз уже нельзя просто так убрать.
Это примерно так. Хотя медицинские записи можно редактировать (исправлять ошибки, например), в том числе по требованию пациента.
Потом ещё есть пункт 5. — биллинг. С workflow, который похож на Ктулху. Так как заявку должна одобрить страховая, которая может выставить претензию доктору, и так до бесконечности.
M>Если завтра в capabilities лаборатории изменятся, это никак не должно повлиять на уже сделанные анализы. Если завтра примут МКБ-12, то и это никак не должно повлиять на уже сделанные анализы и назначения.
Ха. В США переключение на новую систему кодов заняло всего-ничего 20 лет.
Вот так выглядят сервисы в реальной жизни, когда они работают с реальными данными.
Здравствуйте, gandjustas, Вы писали:
G>Так всетаки микросервисы проще монолитов или сложнее?
Сложнее. И требуют более высокой кваливикации разработчиков, чтобы начать делать хорошо.
На архитектурном уровне вместе с микросервисами приходит eventual consistency. В монолите можно сделать большую транзакцию, в микросервисах — в целом нет. Распределенные транзакции идее микросервисов противоречат и технически вряд ли возможны (у каждого сервиса может быть свой стек технологий). Эта неконсистентность сразу вызывает вопросы надежности (reliability). Очень часто нужно уметь надежно доставлять состояние между сервисами. Или надежно знать, что данные не доставлены. А в HTTP есть состояние неопределенности. Запрос отправили, ответ не получили. И вот что это значит? Сервер запрос вообще не получил? Или получил, обработал, но ответ отправить не сумел? Поэтому практически в каждом с сервисе с зависимостями возникает необходимость повторов (retry) и соответствующих внутренних состояний. Кроме того, в сервисах с зависимостями есть проблема устойчивости (robustness). Например, сервис A вызывает сервис Б. Сервис Б обычно отвечал за 10 миллисекунд, а стал — за 10 секунд. Вопрос — что будет с сервисом A? Я видел ситуацию, когда пул HTTP-соединений между A->Б был установлен в настройки по умолчанию (и это было четыре соединения). Поэтому все операции выстраивались в длинную очередь и латентность ответов от А взлетала до небес.
Выше — это архитектурные и технические вопросы. Есть еще операционные: мониторинг (и не "как попало", а чтобы было удобно и более-менее понятно, что происходит с конкретным сервисом), CI, развертывание. Каждая команда должна уметь делать QA, performance и security на неплохом уровне. При большом количестве команд тестировать "в среде/environment" становится сложно — нужно согласовывать тестовые данные, расписания работы сервисов (а вдруг мы задеплоили и что-то сломали?), нагрузку (параллельные perf test имеют много шансов упасть). Это решается эмуляторами зависимостей, но их же кто-то должен писать. А это — время и силы.
Да, еще нужно инфрастуктуру под это поднять. Кубернетес или что положено, инструменты и так далее.
На самом деле после некоторой практики все из вышеописанного совершенно не сложно. Но вот стартовать без наработок долго. Обучать команду всем аспектам — тоже.
G> Я везде вижу один аргумент в пользу микросервисов, что они проще и масштабировать их легче. А вы пишите что нет.
Масштабировать сервисы — в целом да, проще. Микросервисы стартуют быстрее, да и масштабироваться будут только те части, на которые приходится нагрузка. Но во многих случаях узким местом является база данных. А там сервисы особо масштабировать не приходится. Если использовать асинхронность, несколько инстансов сервиса запросто упрутся именно в базу. При масштабируемом хранилище (что нужно закладывать при разработке!) — да, все чуть лучше.
А "проще" — это из-за некорректного сравнения происходит. Монолит и "микросервисы" имеют несравнимый возраст и историю. Смотрите, что происходит. Есть начальная команда, которая разрабатывает продукт. Это монолит, со внутренней модульюностью и более-менее успешной архитектурой. В течение 5 лет половина команды уходит на новые проекты. Другую половину эффективные менеджеры заменяют на более дешевых и управляемых сговорчивых разработчиков. Это поколение немножко забивает на границы между модулями и вводит ненужную связность. В коде образуется лишний coupling, но зато тикеты закрываются легко и весело. Приложение постепенно превращается в макаронного монстра (spaghetti monster). За следующие 5 лет половина разработчиков успешно фрустрирует и уходит. Другую половину эффективные менеджеры увольняют из-за снизившейся производительности (tech debt мешает, да) и нанимает еще более дешевых разработчиков. Это будет третье поколение. Новые разработчики дешевые, но существующий код читать не умеют. Про рефакторинги и приведение монолита в порядок даже и говорить не приходится. Зато они умеют писать новый код. Внешние костыли гордо называются микросервисами. Система может разиваться еще какое-то время. Еще через 5 лет организация получает уже распределенного макаронного монстра. И здесь вариантов уже совсем мало. Либо вообще закрыть продукт (через 15 лет много шансов, что он будет и так не нужен), либо нанимать специалистов за много денег приводить все это в порядок.
Т.е. "проще" — это обычно в условиях, когда монолит уже запущен и там скорее "совсем никак" с теми ресурсами, которые имеются в наличии. Еще на "проще" влияет первое впечатление. Пока сервисов мало (меньше 10) нефункциональные требования (reliability & co) не особо влияют. "Один" сервис в серднем скорее работает, чем нет. А вот когда сервисов много, начинаются отказы (просто статистически, когда сервисов много, больше шансов, что в каждый момент хоть что-то не работает). Так как про устойчивость (robustness) на начальных этапах "забывают", вся система регулярно рушится с громким грохотом.
Как SkyDance здесь уже отметил, микросервисы на раннем этапе всего-лишь позволяют предотвратить излишнюю связность. Особенно на нижнем уровне вроде базы данных. Это можно делать и в монолите, но нужна определенная политическая воля.
G>При использовании правильных средств в монолитном приложении запросы проверяются при компиляции.
Дело не в ошибках. Дело в количестве и (очень часто) черезмерной связанности (coupling). Там запросто правки вида "здесь всего в 5 местах поменять" преврашаются в приключение "оказалось, оно используется в 25 местах!". А потом через две недели вы внезапно узнаете, что этим рефакторингом еще и сорвали сроки релиза. Потому что другая команда тоже делала рефакторинг где-то в другом месте. Но несколько из этих 25 мест попали в затронутый ими код. И теперь им нужно еще несколько дней на все исправить, проверить и смержиться. Почему раньше не узнали? Да потому, что до них только сейчас дошла очередь мержится. А мержить master в рабочую ветку и гонять CI на каждое изменение там — слишком накладно. И это вполне типичная ситуация.
Если это из "как можно делать" — может быть. А вот микросервисы не получаются — в описании нет замкнутыых контествов ("bounded context") у сервисов. Тут Miroff и Cyberax прекрасно описали, как оно может быть и как бывает на практики. Даже в случае с FTP домены у клиники и лаборатории свои! Стороны общаются по протоколу. Часть вещей используют общие идентификаторы (например, стандартный классификатор анализов). То, что там FTP и опросы (polling) концептуально ничего не меняет.
S>могу сказать, что как раз связь с доменом "Справочники" очень хочется сделать "INNER JOIN"-ом. S>Но сделать так нельзя, потому, что справочник типов анализа должен быть доступен из обоих прикладных доменов: и для "Мед.карты", и для "Лаборатории".
Нет! Вы очень хотите сделать большой объект "справочник", который содержит кучу полей, используемых только в специальных ситуация. А на самом деле у вас разные домены и разные справочники. Для "мед карты" вам нужен вообще стандартный классификатор. Для больницы/терапии вам нужен терапевтический справочник. Т.е. какие диагнозы подтверждает анализ, границы нормы, плюсы/минусы данного типа анализов, альтернативы и дополнительные исследования. Справочник больницы может иметь ссылки на лаборатории (или поддерживаемые интеграции). А лаборатории нужен операционный справочник. Там написано, как проводить анализ, на каком оборудовании, сроки хранения материала, правила утилизации и т.п. Ее справочник может содержать (или включать) справочники на конкретные типы оборудования. Т.е. "используйте аппарат АБС, следуйте инструкции производителя здесь". И вот зачем вам в карте информация о том, какие коды нужно вводить на панели автоматизированного анализатора?
Что вам нужно, это некоторое согласование между доменами (карта — просто текст, больница — терапевтические данные, лаборатория — операционные). Для этого как раз используются стандартные коды и согласование справочников (по коду из внутреннего справочника можно получить коды во внешних). В крайнем случае — протаскивание кодов из мноих источников (т.е. в карте может быть текст, внутренний код лаборатори и отдельно код терапии). И join будет уже делаться с конкретной копией справочника в правильном домене.
Здравствуйте, rosencrantz, Вы писали:
R>Микросервисность — это в первую очередь про изоляцию команд друг от друга.
найти бы того дурачка который это написал изначально, а то в каждом первом топике про микросервисы слышу. Видимо нулевой идиот был менеджером.
Микросервисы и команды это перпендикулярные понятия. Всё что нужно для разделения на команды — это чётко очерченые скоупы функциональности и чёткие программные интерфейсы. Да, микросервисы форсят появление чётких скоупов функциональности и уж точно форсят появление чётких программных интерфейсов, но всё это возможно и без микросервисов. Windows, Linux, Microsoft Office, 1C, и прочие гроамадные продукты делают тысячи, десятки тысяч человек, а это самые что ни на есть монолиты. Поэтому не надо ставить телегу впереди лошади, пожалуйста. Микросервисы это про горизонтальное масштабирование и resilience, изоляция команд здесь глубоко вторична.
Здравствуйте, Умака Кумакаки, Вы писали:
УК>Здравствуйте, rosencrantz, Вы писали:
R>>Микросервисность — это в первую очередь про изоляцию команд друг от друга.
УК>найти бы того дурачка который это написал изначально, а то в каждом первом топике про микросервисы слышу. Видимо нулевой идиот был менеджером.
Дело в том, что продукт делается не программистами, а кучей разных людей. Насколько часто и хаотично будут появляться новые фичи? Насколько фичи связаны друг с другом? Насколько часто надо релизить? Вся эта ерунда не контролируется программистами. Она контролируется менеджерами. В худшем случае программистам это всё просто навязывается снаружи. В лучшем — программисты органично участвуют в определении стратегии разработки и отстаивают свой "рабочий комфорт".
УК>Микросервисы и команды это перпендикулярные понятия. Всё что нужно для разделения на команды — это чётко очерченые скоупы функциональности и чёткие программные интерфейсы. Да, микросервисы форсят появление чётких скоупов функциональности и уж точно форсят появление чётких программных интерфейсов, но всё это возможно и без микросервисов.
В ваших суждениях вы упускаете важную деталь: система это не только "начинка" (функциональность, интерфейсы — о чём вы пишете), но ещё и её жизненный цикл (о чём вы не пишете): как система появляется, как сопровождается, как ретайрится. Монолитный подход предлагает "систему, состоящую из подсистем" (жизненный цикл подсистем "подчиняется" жизненному циклу системы). Микросервисный подход предлагает "систему систем" (жизненный цикл у каждой системы — свой). Именно из этого отличия вытекает идея "изоляции команд" — у команд появляется возможность самостоятельно решить что, как и когда они будут делать. А так вы правы, да, если жизненные циклы игнорировать, один хрен.
УК>Windows, Linux, Microsoft Office, 1C, и прочие гроамадные продукты делают тысячи, десятки тысяч человек, а это самые что ни на есть монолиты. Поэтому не надо ставить телегу впереди лошади, пожалуйста.
Вот вы когда говорите Windows — вы что конкретно имеете в виду? Если смотреть с точки зрения продукта для конечного пользователя, Windows — это не монолит. Грубо одна команда делает ОС и выпускает когда хочет, другая команда делает Офис и выпускает когда хочет, параллельно с этим есть ещё маленькие команды, которые пилят улучшенный терминал и прочее такое. Люди — разные. Инструменты у них разные. Каденс релизов разный. Слово "микросервисный" тут конечно выглядит несколько нелепо, но вообще чем не микросервисы?
Здравствуйте, stomsky, Вы писали:
S>Здравствуйте, Miroff, Вы писали:
S>Ну ты немного другую архитектуру описал. У тебя справочник видов анализов (capabilities) хранится в "Лаборатории", а у white_znake он вынесен в отдельный сервис "Справочники":
Именно! Сервисы, хоть микро, хоть макро, определяются тем, что они делают, а не тем какие данных они хранят. Проектирование от данных, а не от обязанностей, это вернейший способ превратить любой проект в алтарь поклонения макаронному монстру.
Взять сервис "Справочники", что полезного он делает? Ничего не делает. Как он будет обрабатывать ситуацию когда есть две лаборатории, у которых отличаются наборы анализов? Или если у лаборатории ограниченная пропускная способность по какому-то исследованию. Никак не будет, если его не связать жестко с лабораторией. Наличие обязательно жесткой связи это хороший такой звоночек что граница сервиса выбрана неудачно.
BE>Расцвет микросервисов закончился. Uber преобразовывает тысячи микросервисов в более управляемое решение [1]; Келси Хайтауэр предсказывает, что будущее за монолитами [2]; и даже Сэм Ньюман заявляет, что микросервисы никогда не должны быть выбором по умолчанию, а скорее крайним средством [3].
BE>Что происходит? Почему так много проектов стало невозможно поддерживать, несмотря на обещание микросервисов простоты и гибкости? Или все-таки монолиты лучше?
BE>Я вот сам трушных микросервисов ни разу не встречал. Так что бы 1 сервис — 1 бд. Обычно делали 1 ил 2 бд к которым подключались несколько сервисов. BE>Либо же вообще за работу с каждой бд отвечал свой сервис, а остальные уже подключались к нему. BE>А вся эта куча сервисов как правило была доступна фронту через какой-либо api gateway типа ocelot.
BE>Несколько бд было только в том случае, если одна реляционная, а другая — нет.
BE>Кто как делает?
BE>Я тоже считаю, что плодить множество действительно микросервисов с кучей баз данных повышает трудоемкость разработки и поддержки проектов. В первую очередь — это необходимость согласовывать изменения между сервисами. И невозможность вытащить данные из одной бд sql запросом.
По мне собственное проблема не в этом. Разбить программу на модули не составляет труда, хоть через микросервисы, хоть как-то по другому. Проблема сделать что бы это все собиралось, обновлялось с учетом версий и по нажатию кнопки, а не через ковыряние простыней конфигов, запусков разных скриптов и других магических действий. Плюс нужно автоматизировать весь процесс разработки, что бы было удобно, а это в этом случае не так просто.
Здравствуйте, BlackEric, Вы писали:
BE>Я тоже считаю, что плодить множество действительно микросервисов с кучей баз данных повышает трудоемкость разработки
Пока проект маленький — да, повышает трудоемкость, но когда монолит становится большим появляется "синдром завтрашнего утра",
когда на мерж изменений сделанный командой которая работает уходит каждый день по пол дня.
Когда ревьюверы не досмотрели и в коде образовываются зависимости, потому что не все знаю архитектуру этого монолита.
Или какая-то команда залила изменения, которые все сломали, а ты смержил этот код и тестируешь и понимаешь что, что-то не работает, но не знаешь что.
А смоук, интеграционные, юнит тест на твоей машине работают больше часа.
Микросервисная архитектура прежде всего позволяет разбить проект на независимые модули, и там где код не самый важный отдать на разработку менее опытным разработчикам(или на аутсорс).
Підтримати Україну у боротьбі з країною-терористом.
Здравствуйте, Sharov, Вы писали:
S>Это что за зверь такой, на каком уровне он работает? На уровне api? Где про это почитать?
Да, это такой мок, но уже для целого внешнего приложения. Взаимодействие — через API. Точно так же, как с реальной системой. Обычно эмулируются внешние http-сервисы, но можно еще и всякие очереди сообщений обрабатывать. В зависимости от того, как именно у вас процесс построен, симулятор может запускаться отдельным приложением или изнутри теста (поднимать временный веб-сервис, опускать после завершения теста). Где почитать — не знаю, мы независимо это изобрели в рамках велосипедостроения .
Собственно, история. Мы первые симуляторы начали делать для проверки/тестирования нетривиальных настроек http-клиентов (у нас с десяток сервисов, использующих разные библиотеки). Если с базами данных более-менее все понятно (там соединений единицы, большинство пулов имеют какой-то разумный таймаут), то с http-клиентами беда. В них совершенно детское количество одновременных соединений (2-4 на целевой хост) по-умолчанию. В добавое еще огромные таймауты на все запросы и ожидание соединения из пула. Так что хотелось иметь возможность видеть, что оно не работает, а после изменения — работает. Поэтому на коленке были собраны простенькие симуляторы под каждое приложение. Почти все нужное (вроде асинхронных http-серверов на монадах) у нас было. Нужно было дописать только асинхронный sleep. Симуляторы были без логики, ответы — это подстановка одного-двух параметров в хардкоженый шаблон ответа. Ну и вообще работа с ними была плюс-минус ручная на первом этапе. Дописал метод, заменил вызов в маршрутизации на новый — и готово.
Следующим этапом было внедрение этих технологий в CI в новые сервисы (уже не для настройки пулов). Разработчикам было лень писать симулятор под каждый проект. Поэтому они написали один универсальный. Ему передается список URL, ответы и задержки для них. Конфигурация на отдельном порту. Поэтому в симуляторе можно вообще что угодно делать. Интеграционные тесты по необходимости конфигурируют ответы и гоняют сервис. И еще. Для CI есть обвязка, которая деплоит симулятор в кубернетес и настраивает приложение на его использование. Потом тесты деплоят приложение (с правильными лимитами) и все тестируется. Если поднимать сервер внутри тестового кода, в CI будет очень сложно передать правильный адрес (тест работает где-нибудь на worker node в совершенно другом пуле).
Эти симуляторы очень хорошо легли на нашу концепцию тестирования. У нас основные тесты — интеграционные. В коде много ручных частей, включая sql-запросы в базу и ручная же сериализация/парсинг в dto и внутренние структуры (зачем — отдельный большой разговор). И если парсинг еще можно проверить в юнит-тесте, то sql-запросы — нет. Поэтому автоматически нужна база и тесты становятся интеграционными. С эмуляторами можно проверить все уровни обработки сразу. Также можно эмулировать отказы (коды ошибок, таймауты и т.п.). Инфраструктура у нас со свободными лицензиями, поэтому можно все необходимое поднять локально. Разработчик может хоть в лесу сервис запускать и тестировать. А еще у нас build tool умеет запускать только "изменившиеся или упавшие тесты" в приложении. Поэтому в типичных сценариях разработки/отладки запускаются только релевантные сценарии. В общем, это все здорово уменьшает время обратной связи. Позволяет делать простые регрессии (можно взять реальный ответ сервера и сделать из него тестовый сценарий). Все это можно запускать на всех этапах начиная с локальной разработки и заканчивая CI. Вся эта схема еще и достаточно стабильна — тесты не падают из-за того, что что-то происходит с другой системой.
Сейчас у нас в коде идут сервис и симулятор его зависимостей. В планах переделать на "сервис и симулятор этого же сервиса". Симулятор публиковать в репозиторий. В этом случае CI может выкачивать симуляторы зависимостей и гонять тесты на них. Цель — чтобы симулятор был к коду основного приложения (он может и какую-то часть кода использовать). В этом случае при изменении API/поведения больше шансов сразу получить и обновленный симулятор. И следующий CI у пользователей уже будет тестировать код с использованием новой версии. Т.е. интеграционные ошибки будут находиться еще раньше. Но это пока мечты
Если что интересно — спрашивайте. Расскажу подробнее.
Здравствуйте, maxkar, Вы писали:
M>Здравствуйте, Sharov, Вы писали:
M>Если что интересно — спрашивайте. Расскажу подробнее.
Главный вопрос: Сколько времени у Вас потребуется программисту для добавления нового модуля(сервиса) в систему и довести его до продакшена. Предполагаем, что сервис примитивный, например складывает два числа и разного рода мастер-бд отсутствуют?
Здравствуйте, Qulac, Вы писали:
Q>Главный вопрос: Сколько времени у Вас потребуется программисту для добавления нового модуля(сервиса) в систему и довести его до продакшена.
Норматив — один рабочий день. Т.е. если в один день я на стендапе слышу "я начал минимальный сервис", на следующем я должен услышать "он был задеплоен, работаю над следующей задачей". Сколько там потратил программист — не важно. Если вдруг сервиса не будет — я уже буду разбираться, что и где пошло не так. Там не так много работы, но для нового сервиса есть некоторая специфика. Процесс примерно следующий: Взять скелет приложения. Отрезать лишнее, проверить базовые настройки, проверить настройки (пакеты в коде, имя приложения для деплоймента и мониторинга, требуемые ресурсы, autoscaling и прочие радости). Приложение "без базы" на данном этапе потребует чуть больше работы, чем с базой. У нас база в скелете . Сделать обработчик. Прогнать тест локально. На это уйдет полчаса-час.
Залить в source control, сделать MR.
Попинать CI, чтобы оно быстрее проект заметило (это я плохо пинаю ответственных за CI, чтобы сделать процесс чуть быстрее).
Дождаться аппрува на MR
Смержить
Найти ответственных за promotion (они вообще от времени года зависят!). Получить подтверждение, задеплоить. И так для каждой среды в цепочке.
Сделать операционную документацию. Вроде "сервис ничего не использует. Падать не должен. Если упадет — удивиться и перезапустить". По моим наблюдениям ее никто не читает. Но заполнять надо — традиция бюрократия. Полчаса примерно.
Сделать дашборды для метрик. Они как раз используются, когда операторы, не читавшие документацию из предыдущего пункта, пытаются сказать, что сервис не работает. А мы можем на метрики посмотреть и сказать, что все работает по плану. 15-30 минут.
Проверить, что логи видны.
Подумать про alerts. Сделать их или решить, что не нужно.
Вот это то, что у нас считается production приложением. И все из этого входит в норматив.
Сложности здесь скорее в переключениях типов работы. В промежутках разработчик может еще на какой-нибудь корпоративный митинг сходить (пока другие смотрят MR), выкурить чаю, откомментировать другие MR и т.п. В режиме буста (когда все рядом и готовы давать approval) часа за 2 можно все сделать. Часть — бюрократия вне нашего контроля. Еще часть не оптимизирована под новые приложения — новые сервисы не так часто делаются, чтобы инвестиции времени окупились.
Здравствуйте, maxkar, Вы писали:
M>Здравствуйте, Qulac, Вы писали:
Q>>Главный вопрос: Сколько времени у Вас потребуется программисту для добавления нового модуля(сервиса) в систему и довести его до продакшена.
M>Норматив — один рабочий день. Т.е. если в один день я на стендапе слышу "я начал минимальный сервис", на следующем я должен услышать "он был задеплоен, работаю над следующей задачей". Сколько там потратил программист — не важно. Если вдруг сервиса не будет — я уже буду разбираться, что и где пошло не так. Там не так много работы, но для нового сервиса есть некоторая специфика. Процесс примерно следующий: M> M> Взять скелет приложения. Отрезать лишнее, проверить базовые настройки, проверить настройки (пакеты в коде, имя приложения для деплоймента и мониторинга, требуемые ресурсы, autoscaling и прочие радости). Приложение "без базы" на данном этапе потребует чуть больше работы, чем с базой. У нас база в скелете . Сделать обработчик. Прогнать тест локально. На это уйдет полчаса-час. M> Залить в source control, сделать MR. M> Попинать CI, чтобы оно быстрее проект заметило (это я плохо пинаю ответственных за CI, чтобы сделать процесс чуть быстрее). M> Дождаться аппрува на MR M> Смержить M> Найти ответственных за promotion (они вообще от времени года зависят!). Получить подтверждение, задеплоить. И так для каждой среды в цепочке. M> Сделать операционную документацию. Вроде "сервис ничего не использует. Падать не должен. Если упадет — удивиться и перезапустить". По моим наблюдениям ее никто не читает. Но заполнять надо — традиция бюрократия. Полчаса примерно. M> Сделать дашборды для метрик. Они как раз используются, когда операторы, не читавшие документацию из предыдущего пункта, пытаются сказать, что сервис не работает. А мы можем на метрики посмотреть и сказать, что все работает по плану. 15-30 минут. M> Проверить, что логи видны. M> Подумать про alerts. Сделать их или решить, что не нужно. M>
M>Вот это то, что у нас считается production приложением. И все из этого входит в норматив.
M>Сложности здесь скорее в переключениях типов работы. В промежутках разработчик может еще на какой-нибудь корпоративный митинг сходить (пока другие смотрят MR), выкурить чаю, откомментировать другие MR и т.п. В режиме буста (когда все рядом и готовы давать approval) часа за 2 можно все сделать. Часть — бюрократия вне нашего контроля. Еще часть не оптимизирована под новые приложения — новые сервисы не так часто делаются, чтобы инвестиции времени окупились.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Qulac, Вы писали:
Q>>Спасибо. Но по моему это очень долго. S>Расскажите про ваш процесс. Лично я — очень впечатлён.
"Любая организация, которая строит системы... неизбежно произведет дизайн, структура которого является копией коммуникационной структуры организации". (с) Мелвин Конвей.
Конечно вместо статей на хабре я бы рекомендовал прочитать книгу от Сэма Ньюмена: "От монолита к микросервисам". Если еще не читали. Есть перевод на русском языке.
Там на эту тему идет более предметный разговор. С аргументами и доводами за и против.
Во-первых никто и не призывает везде лепить микросервисы. Монолиты живы и будут жить во многих проектах. С другой стороны и монолиты клепать везде где не попадя — каменный век.
Сделать микросервисы сложнее. Причем сделать правильно. И тут вопрос даже не в технических способностях. Посмотрите на цитату, с которой я начал этот пост. Вопрос, ни много ни мало, в организации разработки.
Это ничуть ни меньше про менеджмент разработки, чем про архитектуру. И это все более ни менее понимают. Поэтому так престижно говорить на конференции "А у нас микросервисы ...", остальные менеджеры/управленцы "Вау... да вы круты... Смогли организовать процесс!" Конечно, внутрь компании никто лезть не будет. Никто не будет выяснять есть ли там Entity Service в качестве антипаттерна.
Просто пойдет слух, что вот есть организация РосароконсалтТаргетинг у которой микросервисы и они передовые в плане выстраивания процессов.
Отсюда и беруться через пару лет все эти разочарования.
Но в самих микросервисах идея крайне простая и давным давно известная. Нужно сложную систему разбить на части и получить несколько слабо связанных между собой систем. У каждой системы своя команда. Свой деплой. Это известно уже тысячу лет... просто появился buzzword ну и некоторая систематизация практик и паттернов для этого.
И один из главных паттернов — если система не разбивается, то не разбивайте ее. Гемора получите больше выгод. Разве что где-то на конференции скажите "А у нас микросервисы..."
Здравствуйте, maxkar, Вы писали:
M>Здравствуйте, Qulac, Вы писали:
Q>>Главный вопрос: Сколько времени у Вас потребуется программисту для добавления нового модуля(сервиса) в систему и довести его до продакшена.
M>Норматив — один рабочий день. Т.е. если в один день я на стендапе слышу "я начал минимальный сервис", на следующем я должен услышать "он был задеплоен, работаю над следующей задачей". Сколько там потратил программист — не важно. Если вдруг сервиса не будет — я уже буду разбираться, что и где пошло не так. Там не так много работы, но для нового сервиса есть некоторая специфика. Процесс примерно следующий: M> M> Взять скелет приложения. Отрезать лишнее, проверить базовые настройки, проверить настройки (пакеты в коде, имя приложения для деплоймента и мониторинга, требуемые ресурсы, autoscaling и прочие радости). Приложение "без базы" на данном этапе потребует чуть больше работы, чем с базой. У нас база в скелете . Сделать обработчик. Прогнать тест локально. На это уйдет полчаса-час. M> Залить в source control, сделать MR. M> Попинать CI, чтобы оно быстрее проект заметило (это я плохо пинаю ответственных за CI, чтобы сделать процесс чуть быстрее). M> Дождаться аппрува на MR M> Смержить M> Найти ответственных за promotion (они вообще от времени года зависят!). Получить подтверждение, задеплоить. И так для каждой среды в цепочке. M> Сделать операционную документацию. Вроде "сервис ничего не использует. Падать не должен. Если упадет — удивиться и перезапустить". По моим наблюдениям ее никто не читает. Но заполнять надо — традиция бюрократия. Полчаса примерно. M> Сделать дашборды для метрик. Они как раз используются, когда операторы, не читавшие документацию из предыдущего пункта, пытаются сказать, что сервис не работает. А мы можем на метрики посмотреть и сказать, что все работает по плану. 15-30 минут. M> Проверить, что логи видны. M> Подумать про alerts. Сделать их или решить, что не нужно. M>M>Вот это то, что у нас считается production приложением. И все из этого входит в норматив. M>Сложности здесь скорее в переключениях типов работы. В промежутках разработчик может еще на какой-нибудь корпоративный митинг сходить (пока другие смотрят MR), выкурить чаю, откомментировать другие MR и т.п. В режиме буста (когда все рядом и готовы давать approval) часа за 2 можно все сделать. Часть — бюрократия вне нашего контроля. Еще часть не оптимизирована под новые приложения — новые сервисы не так часто делаются, чтобы инвестиции времени окупились.
А какая предментая область, если не секрет? И кто придумал этот пайплайн -- скопипастили у кого-то или продиктовано бизнес
потребностями?
Здравствуйте, Sharov, Вы писали:
S>А какая предментая область, если не секрет?
B2B2C. Если совсем упрощенно, мы делаем некоторые сервисы для интернет-магазинов. Т.е. наши клиенты — интернет-магазины. Но наши (условно) плагины видны посетителям интернет-магазинов. Моя команада отвечает за платежи и все, что с ними связано.
S>И кто придумал этот пайплайн -- скопипастили у кого-то или продиктовано бизнес потребностями?
Скорее так исторически сложилось на основе организационной структуры. Когда-то давно, может, и скопировали. Но с тех пор практически все уже поменялось. Например, изначально CI разрабатывался вообще отдельной командой без какой-либо связи с продуктовыми командами. Разработчикам спускались инструкции "пишите так и только так" (в виде огромного boilerplate для каждого проекта). Сейчас ситуация меняется, появляется обратная связь и больше свободы. Promotion approval — по большей части исторические. Зависят от уровня паранойи у руководства. При этом считаюстся по худшей команде. Т.е. косячит одна команда, а репрессии устраивают всем. Тоже есть подвижки в сторону упрощения. Хотя конкретно у нас какая-то часть будет идти строго из-за специфики платежей. Мы вообще PCI-certified, для этого нужно немного бюрократии. Логи/алерты — смесь "глобальных технических инициатив" и конкретно нашей команды.
Многие части процесса или особенности наши (определяются внутри команды). Они нам подходят и какого-то особого недовольства не доставляют.
Boilerplate/skeleton — это заготовка с основными аспектами (каркас web-обработчиков, логи, мониторинг, деплоймент, база), принадлежит нашей команде. Вообще у нас в команде достаточно радикальная политика по отношению к фреймворкам и библиотекам: "Если библиотека/фреймворк не устраивает — можно (и даже рекомендуется) велосипедить так, чтобы было удобно". Я не хочу, чтобы мы тратили время только потому, что когда-то приняли формальное решение. Это повышает требования к качеству библиотек. И особенно — к их модульности. Так что, с одной стороны, мы на конкретном проекте можем изменить конкретный выбор. Например, не нравится веб-уровень — можно сделать другой (бюрократии нет, но причины нужно где-нибудь записать). Или решить отдавать метрики в другом формате. Или, например, использовать какой-то специфический слой для базы. Но это же значит, что мы не можем просто "включить фреймворк" в котором есть все (потому что в нем со временем может оказаться куча ненужного). Так и появляесят полуфабрикат — все вроде есть, но можно открутить (сейчас или потом) что угодно. Стандартный набор велосипедов и деталей у нас удачный. Так что "взять базу и выпилить лишнее" работает хорошо и в краткосрочной, и в долгой перспективах.
Merge request — это правила хорошего тона уже практически везде. Плюс по нашим процессам я почти во всех outages участвую в группе поддержки. Поэтому мне лично интересно, чтобы если что-то падало, то падало в одном месте и заметно. А не отдавалось фантомными болями где-то далеко-далеко. И у меня обычно есть возможность быстро переключиться с текущей задачи и сделать ревью. CI у нас делает pre-merge. Проходит оно быстро (меньше 10 минут обычно), типичное ревью занимает больше времени. Так что merge check нас не замедляет. Иногда он даже падает (иначе бы упало после мержа), так что некоторая польза есть. А еще у нас члены команды имеют разные интересы (кому-то интереснее технические детали, кому-то — бизнес) и ревью дает разносторонние отзывы.
Так как мы платежи, тестироваться интеграционно с реальными системами нам сложно. А тестирование в pre-merge еще и не ложится в environments. Здесь нам очень помогают различные эмуляторы. Заодно мы можем эмулировать "особенности" наших поставщиков услуг. Заодно упрощается и локальная разработка. Честные "интеграционные" тесты мы тоже делаем вручную, но это долго, сложно и не автоматизируется.
Promotion я уже сказал. Частично — исторически-бюрократические, частично — для PCI и прочего legal.
Метрики — фишка нашей команды. Я лично считаю, что найти что-то в логах на хоть какой-то интересной нагрузке (допустим, мизерные 100 запросов в минуту) становится практически не реально. Если добавить несколько экземпляров сервиса и несколько других систем, все становится очень печально. В метриках можно делать почти все то же, что в логах (вместе с записью исключения можно и счетчик увеличить). Потом мы можем сначала посмотреть на дашборды а потом прогнать какие-нибудь ручные запросы по метрикам. Т.е. тормозит "все" или конкретные типы запросов? Привязано это к отдельной машине или медленно везде? Что у нас с вызовами persistence и внешних сервисов? И все это в динамике (сейчас, час назад, "обычно").
Логи в нашей организации — отдельная грустная история. Чтобы логи были полезны, они должны содержать достаточно информации. Поэтму они становятся "большими". Бизнес жалуется, что все дорого и просит логи почикать. А почиканные логи становятся бесполезными. В рамках "дорого" мы еще и несколько миграций logging system сделали. Поэтому "проверить, что логи видны" — суровая необходимость. Мало-ли что отвалится. А конкретные exception traces все же бывают полезны. Обычно уже после того, как что-то нашли в метриках. Или для новой функциональности, когда у нас все работает с тестовой средой вендора, а в production все ну совсем по-другому. Поэтому полностью отказаться от логов мы тоже не можем.
Alerts — это еще сверху к логам и метрикам. Мы 24/7 работаем и вроде как в надежности хотим минимум 99.9% доступности. Поэтому нужны alerts. Желательно — до того, как наши клиенты начали жаловаться (это добавляет необходимость успокаивать нашу команду поддержки). Обычно все сводится к "вендор упал — звоните им и спрашивайте", но иногда бывает и интереснее.
Лично мне процесс в целом нравится. Команде — тоже. Некоторые вещи можно сделать лучше, но не все зависит от нас. Alerts происходят напрямую из бизнес-требований. Часть — была задолго до меня (и вообще до нашей команды). Почти половину мы сделали сами в команде для себя. Если переводить на язык бизнеса — уменьшает время на разработку (boilerplate — локально и "сейчас", принципы — для того, чтобы в будущем не застопориться на каких-нибудь несовершенствах). Еще мы повышаем надежность в ревью/тестировании (вклад в количество девяток). Также имеем хороший observability (т.е. меньше времени требуется на обнаружение и исправление проблем, тоже в девятки идет).
Здравствуйте, BlackEric, Вы писали:
BE>Где наконец-то говорится
Наконец-то? Типа ты раньше об этом никогда не слышал?
BE>Я вот сам трушных микросервисов ни разу не встречал. Так что бы 1 сервис — 1 бд. Обычно делали 1 ил 2 бд к которым подключались несколько сервисов.
Я совсем не сторонник микросервисов, но расшаривание бд тоже несет много проблем, не меньше чем микросервисы.
BE>Либо же вообще за работу с каждой бд отвечал свой сервис, а остальные уже подключались к нему.
Ну и? Чем это не микросервисно?
BE>А вся эта куча сервисов как правило была доступна фронту через какой-либо api gateway типа ocelot.
Это тоже вполне себе microservices way.
BE>Я тоже считаю, что плодить множество действительно микросервисов с кучей баз данных
Здравствуйте, Nikita Lyapin, Вы писали:
NL>"Любая организация, которая строит системы... неизбежно произведет дизайн, структура которого является копией коммуникационной структуры организации". (с) Мелвин Конвей.
Хрень полная.
NL>Во-первых никто и не призывает везде лепить микросервисы.
Вот прям уж так и никто?
NL>Сделать микросервисы сложнее. Причем сделать правильно.
Если совместить это утверждение с заявленными целями микросервисов, то выходит что микросервисы не выполняют свою задачу.
NL>Но в самих микросервисах идея крайне простая и давным давно известная. Нужно сложную систему разбить на части
Вот только микросервисы предлагают не просто разбивать на части, а разбивать на части очень жестким образом, оставляя между частями только крайне слабую связь в виде REST API. А без этого важного уточнения, опять же, вся идея микросервисов теряет смысл.
NL>И один из главных паттернов — если система не разбивается, то не разбивайте ее.
Ага, мыши, станьте ежиками. При должном уровне старания разбить можно все. И на вопрос нужно ли разбивать твое банальное утверждение никак не отвечает.
Здравствуйте, vaa, Вы писали:
vaa>там он предлагает уходит от "программирования на месте" к иммутабельному ФП аргументируя это тем что уже 5-10 лет железо не проблема. хватит мол экономить на байтах.
Ну да, в 2012 для некоторых может оно так и было. А в 2021 каждый сэкономленный байт выливается во вполне конкретные деньги, не потраченные на лишнюю ВМ.
Здравствуйте, Умака Кумакаки, Вы писали:
УК>Микросервисы и команды это перпендикулярные понятия.
Это прямо противоречит определению микросервисов.
A microservice architecture – a variant of the service-oriented architecture (SOA) structural style – arranges an application as a collection of loosely-coupled services. In a microservices architecture, services are fine-grained and the protocols are lightweight. The goal is that teams can bring their services to life independent of others.
Если кто то делает микросервисы, но при этом они перпендикулярны командам — это карго культ в чистом виде.
Здравствуйте, gyraboo, Вы писали:
G>Под перезатиранием БД я имею ввиду, что монолиты часто проектируются так, как будто бы у 1 экземпляра монолита 1 БД в эксклюзивном доступе, без оглядки на то, что одой БД могут пользоваться несколько копий монолита.
Здесь нет никакой связи с монолитной архитектурой. Либо приложение проектируется под один инстанс (что нынче редкость, потому что, помимо масштабируемости естиь еще и high availability), либо под несколько. А попытка притянуть сюда микросервисы похоже на необходимость придумать хоть что то, что оправдывает лишние телодвижения в разработке.
Здравствуйте, gyraboo, Вы писали:
G>А разве не возможность делать изи горизонтальное масштабирование?
Масштабирование становится совсем не изи, одна попытка определить, какие микросервисы в системе из нескольких десятков нужно масштабировать и по каким метрикам — отдельная работа тянущая минимум на десятки часов.
Представь, что у тебя система из 30 сервисов, у каждого своя база/монга/редис/memcached все они связаны кафкой/кроликом и дергают друг-друга внутри. Здесь хотя бы начальные ресурсы на все расчитать, не говоря уже о том, что их потом надо научиться масштабировать от нагрузки.
Здравствуйте, Ziaw, Вы писали:
G>>А разве не возможность делать изи горизонтальное масштабирование?
Z>Масштабирование становится совсем не изи, одна попытка определить, какие микросервисы в системе из нескольких десятков нужно масштабировать и по каким метрикам — отдельная работа тянущая минимум на десятки часов.
Z>Представь, что у тебя система из 30 сервисов, у каждого своя база/монга/редис/memcached все они связаны кафкой/кроликом и дергают друг-друга внутри. Здесь хотя бы начальные ресурсы на все расчитать, не говоря уже о том, что их потом надо научиться масштабировать от нагрузки.
Ну так в любой нормальной конторе, которая переходит на микросервисы, разворачивается и система мониторинга и сбора метрик, и они постоянно анализируются, особенно на проде. Узкие места выявляются достаточно быстро. Не вижу здесь проблемы.
А начальные ресурсы рассчитываются по такой схеме: SLA по микросервису от аналитиков и бизнеса -> разрабы делают первую сборку микросервиса -> команда НТ проводит тестирование по SLA из ТЗ и выдает заключение, на основании которого делается вывод о том, нужно ли увеличивать мощности, масштабирование или оптимизировать код чтобы уложиться в целевые SLA
Мне кажется, микросервисы уже достаточно зрелая технология, все такие моменты уже имеют стандартные и отработанные решения.
Здравствуйте, gyraboo, Вы писали:
G>Ну так в любой нормальной конторе, которая переходит на микросервисы, разворачивается и система мониторинга и сбора метрик, и они постоянно анализируются, особенно на проде. Узкие места выявляются достаточно быстро. Не вижу здесь проблемы. G>А начальные ресурсы рассчитываются по такой схеме: SLA по микросервису от аналитиков и бизнеса -> разрабы делают первую сборку микросервиса -> команда НТ проводит тестирование по SLA из ТЗ и выдает заключение, на основании которого делается вывод о том, нужно ли увеличивать мощности, масштабирование или оптимизировать код чтобы уложиться в целевые SLA G>Мне кажется, микросервисы уже достаточно зрелая технология, все такие моменты уже имеют стандартные и отработанные решения.
Так изи или нужен немалый труд нескольких команд специалистов? Про зрелость технологии дискутировать не буду, а вот то, что простые и дешевые решения на ней становятся дорогими и сложными это факт. Ну и цена ошибки просто зашкаливает, аналитики выдали что-то типа — сервис должен выдерживать работу 20к посетителей в час, а потом выясняется, что эти посетители приходят на событие в час в одно и то же время и логин 20к в течении минуты кладет все. Да и без этих ошибок, вывод состоит в том, что мы провели НТ и система не выдержала, надо увеличивать мощности или оптимизировть код. Потом начинается работа по апроксимации этого вывода в дорогие и неоднозначные решения, посколько сказать заранее сколько потребуется мощности в пике нагрузки или насколько мы сможем что-то оптимизировать можно с очень небольшой точностью, так как стоимость железа в RPS превращается очень опосредовано, а уж время программистов на оптимизацию и эффект от нее часто оценивается либо интуитивно, либо программисты говорят что-то типа "да, мы знаем, что здесь O(N!) и это превращается в O(log N) парой строк, но тогда не стали заморачиваться premature optimization".
У меня лично складывается такое впечатление от МС архитектуры
1. Ничего, что сейчас сложно и нужно 20 человек там, где могут справиться 2, зато потом будет все легко и просто.
2. wtf???... неделя поиска распределенного бага, фуух, зато мы получили классный опыт
3. Добавить крупную фичу? Это легко и просто. Нужно два месяца проектирования, две недели совещаний с разработчиками нужных сервисов, месяц разработки, потом месяц регресса. А что вы хотели, это айти, здесь не бывает дешевых решений. Зато нам не страшно, что любой человек уволится, поддерживать его микросервис может любой другой, так как там три строки бизнес кода, остальное — инфраструктура по взаимодействию с остальными. Вон Вася легко сможет поддерживать еще один, все равно его микросервис с прошлого года не требовал изменений. А всего три месяца онбординга и новый программист поймет, как у нас здесь все работает и снимет допнагрузку с Васи.
Здравствуйте, gyraboo, Вы писали:
G>Ну так в любой нормальной конторе, которая переходит на микросервисы, разворачивается и система мониторинга и сбора метрик, и они постоянно анализируются, особенно на проде. Узкие места выявляются достаточно быстро. Не вижу здесь проблемы.
Система мониторинга и сбора метрик разворачивается в любом проекте, к микросервисам это отношения не имеет. У микросервисов здесь только недостаток — метрик в разы больше и их корелляции могут быть супер неожиданны. Более того, кроме метрик обязательно еще и трейсинги, без которых вполне можно обойтись на монолите.
G>А начальные ресурсы рассчитываются по такой схеме: SLA по микросервису от аналитиков и бизнеса -> разрабы делают первую сборку микросервиса -> команда НТ проводит тестирование по SLA из ТЗ и выдает заключение, на основании которого делается вывод о том, нужно ли увеличивать мощности, масштабирование или оптимизировать код чтобы уложиться в целевые SLA G>Мне кажется, микросервисы уже достаточно зрелая технология, все такие моменты уже имеют стандартные и отработанные решения.
А где же про эти решения можно почитать? Допустим мы нагрузили, latency 50 микросервисов начало расти с разным коэффициентом геометрической прогрессии от RPS (в реальности зависимости гораздо сложнее и найти закономерности почти нереально, но пусть будет так). В разных нагрузочных сценариях эти коэффициенты разные и задействованы разные микросервисы. Бизнес месяц провел в совещаниях по планируемой нагрузке и пришел с конкретными цифрами: говорит, что система должна выдерживать миллион пользователей в день, что бы они не захотели делать на платформе.
На одном сценарии вебморда стейджа у нас ложится по таймаутам на 5к RPS, на втором на 3К, не третьем не держит и 500RPS. Какие решения нам предложит достаточно зрелая технология, как считаешь? Как найти узкие места и что именно улучшать?
Это я еще не учел всякие сюрпризы типа cache hit ratio и зависимости от конкретных данных.
Здравствуйте, Ziaw, Вы писали:
G>>Ну так в любой нормальной конторе, которая переходит на микросервисы, разворачивается и система мониторинга и сбора метрик, и они постоянно анализируются, особенно на проде. Узкие места выявляются достаточно быстро. Не вижу здесь проблемы.
Z>Система мониторинга и сбора метрик разворачивается в любом проекте, к микросервисам это отношения не имеет. У микросервисов здесь только недостаток — метрик в разы больше и их корелляции могут быть супер неожиданны. Более того, кроме метрик обязательно еще и трейсинги, без которых вполне можно обойтись на монолите.
Ну так трейсинг же из коробки делается, библиотеками типа sleuth, zipkin, там тебе даже фронт готовый есть для анализа трейсов. Просто юзай трейсы и наслаждайся. Как и многие другие вещи, в экосистеме Spring Cloud, скажем обнаружение сервисов или их конфигурирование (я про проект Spring Cloud Config Server), для всего в спринге есть решения, пусть не всегда идеальные, но они идут в единой связке.
G>>А начальные ресурсы рассчитываются по такой схеме: SLA по микросервису от аналитиков и бизнеса -> разрабы делают первую сборку микросервиса -> команда НТ проводит тестирование по SLA из ТЗ и выдает заключение, на основании которого делается вывод о том, нужно ли увеличивать мощности, масштабирование или оптимизировать код чтобы уложиться в целевые SLA G>>Мне кажется, микросервисы уже достаточно зрелая технология, все такие моменты уже имеют стандартные и отработанные решения.
Z>А где же про эти решения можно почитать? Допустим мы нагрузили, latency 50 микросервисов начало расти с разным коэффициентом геометрической прогрессии от RPS (в реальности зависимости гораздо сложнее и найти закономерности почти нереально, но пусть будет так). В разных нагрузочных сценариях эти коэффициенты разные и задействованы разные микросервисы. Бизнес месяц провел в совещаниях по планируемой нагрузке и пришел с конкретными цифрами: говорит, что система должна выдерживать миллион пользователей в день, что бы они не захотели делать на платформе.
>А где же про эти решения можно почитать? — например в книгах и статьях про Spring Cloud, про реактивный подход или про современные паттерны отказоустойчивости. Также есть статьи и блоги про стек нетфликса, нетфликс как раз одна из компаний, которая многие такие вещи придумала и внедрила, т.к. столкнулась с большой нагрузкой на микросервисы.
Z>На одном сценарии вебморда стейджа у нас ложится по таймаутам на 5к RPS, на втором на 3К, не третьем не держит и 500RPS. Какие решения нам предложит достаточно зрелая технология, как считаешь? Как найти узкие места и что именно улучшать?
Какая технология? Ну так реактивщину придумал и для этих задач (повышение перформанса) + паттерны отказоустойчивости (например, из библиотеки resilience). В частности, если у вас кто-то ложится по таймаутам, реализуйте паттерны Circuit Breaker и Bulkhead (https://sysout.ru/otkazoustojchivost-mikroservisov-shablon-circuit-breaker/). Это позволит проблемному микросервису обслуживать больший спектр запросов, а не ложиться от нагрузки на однотипных запросах. Спектр можно распределить по разным параметрам, например по конкретным эндпоинтам.
Как найти узкие места — анализ метрик, прогон микросервиса с профайлером. Тут уже всё упирается к компетенции разрабов. С монолитом точно так же приходится анализировать перформанс, только вот в монолите бывает тяжело провести оптимизацию, если она упирается в монолитную природу. Не раз с этим сталкивался, т.е. проводим анализ перформанса профалингом, находим узкие места в монолите, но понимаем, что проще вынести точки нагрузки в отдельные микросервисы на физические узлы, чем заниматься миллионом микро-оптимизаций монолита, которые все равно не гарантируют что узкое место будет устранено. А при выносе точки нагрузки в микросервис можно просто написать код без этих оптимизационных заморочек, что выйдет дешевле и быстрее.
Z>Это я еще не учел всякие сюрпризы типа cache hit ratio и зависимости от конкретных данных.
Я не спорю, что задачи при разработке микросервисов непростые. Но моё мнение, что с монолитом эти задачи решать намного тяжелее.
Здравствуйте, Ziaw, Вы писали:
G>>Ну так в любой нормальной конторе, которая переходит на микросервисы, разворачивается и система мониторинга и сбора метрик, и они постоянно анализируются, особенно на проде. Узкие места выявляются достаточно быстро. Не вижу здесь проблемы. G>>А начальные ресурсы рассчитываются по такой схеме: SLA по микросервису от аналитиков и бизнеса -> разрабы делают первую сборку микросервиса -> команда НТ проводит тестирование по SLA из ТЗ и выдает заключение, на основании которого делается вывод о том, нужно ли увеличивать мощности, масштабирование или оптимизировать код чтобы уложиться в целевые SLA G>>Мне кажется, микросервисы уже достаточно зрелая технология, все такие моменты уже имеют стандартные и отработанные решения.
Z>Так изи или нужен немалый труд нескольких команд специалистов? Про зрелость технологии дискутировать не буду, а вот то, что простые и дешевые решения на ней становятся дорогими и сложными это факт. Ну и цена ошибки просто зашкаливает, аналитики выдали что-то типа — сервис должен выдерживать работу 20к посетителей в час, а потом выясняется, что эти посетители приходят на событие в час в одно и то же время и логин 20к в течении минуты кладет все. Да и без этих ошибок, вывод состоит в том, что мы провели НТ и система не выдержала, надо увеличивать мощности или оптимизировть код. Потом начинается работа по апроксимации этого вывода в дорогие и неоднозначные решения, посколько сказать заранее сколько потребуется мощности в пике нагрузки или насколько мы сможем что-то оптимизировать можно с очень небольшой точностью, так как стоимость железа в RPS превращается очень опосредовано, а уж время программистов на оптимизацию и эффект от нее часто оценивается либо интуитивно, либо программисты говорят что-то типа "да, мы знаем, что здесь O(N!) и это превращается в O(log N) парой строк, но тогда не стали заморачиваться premature optimization".
Z>У меня лично складывается такое впечатление от МС архитектуры Z>1. Ничего, что сейчас сложно и нужно 20 человек там, где могут справиться 2, зато потом будет все легко и просто. Z>2. wtf???... неделя поиска распределенного бага, фуух, зато мы получили классный опыт Z>3. Добавить крупную фичу? Это легко и просто. Нужно два месяца проектирования, две недели совещаний с разработчиками нужных сервисов, месяц разработки, потом месяц регресса. А что вы хотели, это айти, здесь не бывает дешевых решений. Зато нам не страшно, что любой человек уволится, поддерживать его микросервис может любой другой, так как там три строки бизнес кода, остальное — инфраструктура по взаимодействию с остальными. Вон Вася легко сможет поддерживать еще один, все равно его микросервис с прошлого года не требовал изменений. А всего три месяца онбординга и новый программист поймет, как у нас здесь все работает и снимет допнагрузку с Васи.
Мне кажется, ты смешал в одну кучу бюрократические корпоративные проблемы процесса разработки и технологии МС. В крупных компаниях или банках и раньше, по монолитам, были миллион совещаний и утверждений, и целая толпа непонятных людей — возможно потому, что цена ошибки в крупной компании слишком высока, на каждое изменение в коде нужно найти ответственного, разделить все обязанности и т.д. и т.п.. А в мелких конторах микросервисы пиляться быстро и споро, особенно если используется экосистема типа Spring Cloud. Выкатили баг на прод — ниче страшного, ща исправим, "компания у нас мелкая, никто из клиентов сильно не пострадает, зато быстро всё выкатываем".
Здравствуйте, gyraboo, Вы писали:
G>Ну так трейсинг же из коробки делается, библиотеками типа sleuth, zipkin, там тебе даже фронт готовый есть для анализа трейсов. Просто юзай трейсы и наслаждайся. Как и многие другие вещи, в экосистеме Spring Cloud, скажем обнаружение сервисов или их конфигурирование (я про проект Spring Cloud Config Server), для всего в спринге есть решения, пусть не всегда идеальные, но они идут в единой связке.
Ты прав, не только трейсинг, еще и обнаружение сервисов.
G>Какая технология?
Мне кажется, микросервисы уже достаточно зрелая технология, все такие моменты уже имеют стандартные и отработанные решения.
Какие стандартные отработанные решения в зрелой технологии позволяют прогнозировать SLA? Вот я привел тебе гипотетический пример SLA и результатов НТ. Как тебе может помочь здесь микросервисная технология?
G>Я не спорю, что задачи при разработке микросервисов непростые. Но моё мнение, что с монолитом эти задачи решать намного тяжелее.
Я как раз хочу понять, что они такого предлагают, что вдруг стало легче? Куда делать объективная сложность, если ее помножили на сложность взаимодействия множества микросервисов? Пока получаю ответы в стиле — теперь легко делать трейсинг и сервис локаторы. Такой себе профит, по сравнению с отсутствием необходимости их делать.
Ты говоришь, что запущенный код монолита в одном месте оптимизировать сложно. Это далеко не во всех стеках так. В идеале монолит содержит минимум общих архитектурных решений, которые могут мешать оптимизировать какую-то его часть. Впрочем я проектировал и жесткие монолиты с кучей слоев, каждый из которых был прибит гвоздями и диктовал много чего, могу представить проблемы о которых ты говоришь. Но это не обязательно, понятие монолит диктует лишь общую кодовую базу. В которой легко отслеживать консистетность разных модулей, легко реюзать алгоритмы, легко джойнить данные, обмениваться ими и трансформировать. А делать так, чтобы что-то мешало оптимизировать один вызов совсем не обязательно.
Самой серьезной проблемой монолита я считаю возможность протащить туда фиговую архитектуру, рефакторинг которой станет фактически невозможным в реалиях скрама и всего такого.
Здравствуйте, gyraboo, Вы писали:
G>Какая технология? Ну так реактивщину придумал и для этих задач (повышение перформанса) + паттерны отказоустойчивости (например, из библиотеки resilience). В частности, если у вас кто-то ложится по таймаутам, реализуйте паттерны Circuit Breaker и Bulkhead (https://sysout.ru/otkazoustojchivost-mikroservisov-shablon-circuit-breaker/).
Почитал.
Ведь известно, что на каждый запрос выделяется отдельный тред. Запрос /animals/any заставляет тред веб-сервера Zoo висеть в ожидании ответа от Random Animal — то есть не дает треду быстро освободиться. А пул тредов на веб-сервере ограничен и един: он обслуживает и запросы /animals/any, и запросы /ticket и любые другие.
Уах-хах-хаа!
Просто не делайте так, детишки. Не надо выделять по треду на запрос, и хипстерские паттерны станут не нужны
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, white_znake, Вы писали:
_>В некоторых проектах такое норм. В некоторых не прохиляет. Смотри пример. В одном из проектов нужно было распознавать объекты с потокового видео. _>Так, вот сервис этот был ресурсозатратным и дорогим, естественно, его масштабировали при достижении пиковых нагрузок, разворачивая довольно дорогие инстансы виртуалок в облаке. _>А был ряд сервисов по-проще, у которых нагрузка была гораздо меньшей. И за чем эти сервисы хостить на дорогих инстансах? _>И тут встает финансовый вопрос. Если у нас монолит, то при необходимости масштабировать сервисы, которые требуют минимальных ресурсов, придется их деплоить на более производительные инстансы. _>Или задача автоматического масштабирования становится очень интересной.
Монолит не подразумевает отсутствие сервисов. Более того, все, что можно вынести в сервисы — выносится. Распознавание отличный пример.
_>Тут дело не только в масштабировании бд. _>Для сущностей одного домена лучше подойдет реляционная бд, для сущностей другого домена лучше подойдет джокументная бд, для сущностей 3-го домена, лучше подойдет графовая бд. _>Понятно, что все можно запилить на реляционной БД, но в некоторых случаях — это будет сложнее.
Монолит может спокойно юзать все эти разные БД. Можно сделать монолит на домен. Для этого не обязательно переходить на микросервисы.
_>P.S. В общем, все зависит от задачи.
Здравствуйте, Ziaw, Вы писали:
Z>Какие стандартные отработанные решения в зрелой технологии позволяют прогнозировать SLA? Вот я привел тебе гипотетический пример SLA и результатов НТ. Как тебе может помочь здесь микросервисная технология?
Да ровно те же что и в монолите. Берешь сценарии, которые составляют SLA, определяешь сервисы, которые в них задействованы, тестируешь, снимаешь метрики, анализируешь. Плюс именно микросервисов в грануляции метрик. В монолите ты получаешь ответ "приложение делает 100RPS на стенде" и делай с таким ответом что хочешь, ни в чем себе не отказывай. Можешь профайлер запустить, если не встраивает. В микросервисах ты получаешь ответ "сервис А делает 20k RPS, Сервис Б делает 100k RPS, сервис В делает 100RPS и упирается в CPU" и тебе понятно что и как нужно масштабировать. Более того, ты эти же метрики получаешь и из продакшена и имеешь относительно адекватные профили нагрузки именно для твоего сервиса, без необходимости извлекать их из зашумленных профилей всего приложения.
Z>Я как раз хочу понять, что они такого предлагают, что вдруг стало легче? Куда делать объективная сложность, если ее помножили на сложность взаимодействия множества микросервисов? Пока получаю ответы в стиле — теперь легко делать трейсинг и сервис локаторы. Такой себе профит, по сравнению с отсутствием необходимости их делать.
Сложность, как метрика неоднородности, естественно никуда не делась. Микросервисная архитектура упрощает лишь организацию разработки путем навязывания нормальных инструментов для формализации API, мониторинга, тестирования и деплоя. Без таких инструментов микросервисы не взлетают. В отличие от монолита, где все это внедряется по остаточному принципу когда уже зад начинает пригорать. Микросервисная архитектура упрощает взаимодействие между командами благодаря тому, что у них остается меньше точек взаимодействия.
Z>Самой серьезной проблемой монолита я считаю возможность протащить туда фиговую архитектуру, рефакторинг которой станет фактически невозможным в реалиях скрама и всего такого.
2 человека и даже 20 человек это вообще не про микросервисы. Ну т.е. можно поиграться, но профита не будет. Вот 200 человек это про микросервисы. Представь себе монолит с командой в 200 человек. Да плевать уже на переиспользование алгоритмов, у них даже мердж веток в мастер будет требовать отдельного протокола и занимать недели. С микросервисами ты делишь эти 200 человек на ~20 команд которые пилят собственные модули, версионируют и документируют API, независимо деплоятся и взаимодействуют друг с другом очень ограниченно. Не особо важно что они не могут переиспользовать алгоритмы, когда одна команда пишет на python и tensorflow, а другая на Java и SQL.
Здравствуйте, Sinclair, Вы писали:
S>Просто не делайте так, детишки. Не надо выделять по треду на запрос, и хипстерские паттерны станут не нужны
Если уделенный сервер не отвечает, не имеет значения, выделяешь ты по треду на запрос, используешь асинхронный io или сервер очередей. В любом случае на вызывающей стороне начинают копиться запросы и она рано или поздно падает по исчерпанию ресурса. Какой именно ресурс исчерпается первым, не очень важно. А когда принимающая сторона оживет ее завалит лавиной запросов и все вообще встанет. Каскадные отказы это действительно серьезная проблема для любых систем, даже энергосистемы с многократным резервированием, бывает, разваливаются.
Здравствуйте, Ziaw, Вы писали:
Z>Монолит не подразумевает отсутствие сервисов. Более того, все, что можно вынести в сервисы — выносится. Распознавание отличный пример.
И в чем же тогда разница между микросервисами и монолитом?
Здравствуйте, Miroff, Вы писали:
M>И в чем же тогда разница между микросервисами и монолитом?
В микросервисной архитектуре сервис выполняет одну простую функцию и крайне рекомендуется не шарить одно хранилище между несколькими микросервисами. Нет какого-то главного микросервиса.
У монолита есть крупное основное приложение с основных хранилищем, возможно какие-то изолированные сервисы развернуты отдельно.
Здравствуйте, Miroff, Вы писали:
M>Да ровно те же что и в монолите. Берешь сценарии, которые составляют SLA, определяешь сервисы, которые в них задействованы, тестируешь, снимаешь метрики, анализируешь. Плюс именно микросервисов в грануляции метрик. В монолите ты получаешь ответ "приложение делает 100RPS на стенде" и делай с таким ответом что хочешь, ни в чем себе не отказывай. Можешь профайлер запустить, если не встраивает. В микросервисах ты получаешь ответ "сервис А делает 20k RPS, Сервис Б делает 100k RPS, сервис В делает 100RPS и упирается в CPU" и тебе понятно что и как нужно масштабировать. Более того, ты эти же метрики получаешь и из продакшена и имеешь относительно адекватные профили нагрузки именно для твоего сервиса, без необходимости извлекать их из зашумленных профилей всего приложения.
Чтобы было ровно то же, метрик должно быть столько же, а это не так, метрик на порядок больше и 100% CPU на одном сервисе в НТ на стейдже нам говорит только о том, что дав этому сервису больше CPU мы возможно что-то ускорим. Это собственно все, остальное исследуем на проде.
M>Сложность, как метрика неоднородности, естественно никуда не делась. Микросервисная архитектура упрощает лишь организацию разработки путем навязывания нормальных инструментов для формализации API, мониторинга, тестирования и деплоя. Без таких инструментов микросервисы не взлетают. В отличие от монолита, где все это внедряется по остаточному принципу когда уже зад начинает пригорать. Микросервисная архитектура упрощает взаимодействие между командами благодаря тому, что у них остается меньше точек взаимодействия.
Формализация API, мониторинг, тестирование и деплой маст хев в любом случае.
M>2 человека и даже 20 человек это вообще не про микросервисы.
Это как пример перехода.
M>Ну т.е. можно поиграться, но профита не будет. Вот 200 человек это про микросервисы. Представь себе монолит с командой в 200 человек. Да плевать уже на переиспользование алгоритмов, у них даже мердж веток в мастер будет требовать отдельного протокола и занимать недели. С микросервисами ты делишь эти 200 человек на ~20 команд которые пилят собственные модули, версионируют и документируют API, независимо деплоятся и взаимодействуют друг с другом очень ограниченно. Не особо важно что они не могут переиспользовать алгоритмы, когда одна команда пишет на python и tensorflow, а другая на Java и SQL.
200 это именно комиттеры или общий размер команд? Если комиттеры именно в один неделимый проект, то понятное дело, что таких проектов единицы и к ним надо подходить с особыми мерками. Монолит с командой в несколько десятков комитеров мне и представлять не нужно, есть опыт. Разбить его на микросервисы и 200 человек не хватит потом для поддержки.
Здравствуйте, Sinclair, Вы писали:
S>Просто не делайте так, детишки. Не надо выделять по треду на запрос, и хипстерские паттерны станут не нужны
Но в этом случае отвалится вся видимость (observability)! И с доступом к базе данных могут быть забавные эффекты. В Spring и вообще большинстве java-инструментом много чего завязано на потоковые переменные (ThreadLocal). Например, идентификаторы запроса (для distributed tracing) будут в этих переменных.
У нас как-то добавили мониторинг из серии "просто добавь агента". Самое заметное — трассы запросов вида "мы ответили за 1 секунду, из которой 1.5 секунды заняло обращение к внешнему сервису". Диалог с их продажниками:
— А что у вас мониторинг чушь показывает?
— Вы многопоточность используете?
— Ну да, а как еще?
— А мы такое не поддерживаем.
Через какое-то время. Тот же сервис, тот же мониторинг. Прибегает высокое начальство.
— А что у вас все тормозит???
По трейсам — среднее время больше 5 секунд. Какие-то запросы вообще нарисованы по 30 секунд. Я смотрю в альтернативный мониторинг (у нас свой рукопашный, который умеет все, что нужно):
— А в чем проблема? Большинство запросов выполняются меньше 3 секунд (там вызовы других сервисов, которые всегда были медленные). Больше 5 секунд вообще не вижу запросов. И вообще мы же выяснили, что многопоточность ваш мониторинг не поддерживают .
— Ну как же? Раз графики фигню показывают, нужно чинить! Как вы там вообще без статистики?
— (Зло, так как систему без нас выбирали). Кому надо? У меня свои метрики, там все видно и нормально. Вам надо? Бэклог вот там. И он вашими хотелками забит. Приоритизируете ваши графики — с удовольствием сделаю. (в бэклоге лежит огромный compliance, который много времени занимает в том числе из-за того, что нам не давали времени на рефакторинг).
Ну ладно, там Akka. Может там сложности с инструментацией какие. Все-таки не стандарт. Но у нас есть и совершенно станартное JEE-приложение с использованием внедренной (embedded) Jetty. Так там мониторинг вообще стабильно показывает несколько миллисекунд на запрос (при фактическом времени 1-3 секунды). А все почему? Да потому что стандартные асинхронные сервлеты выглядят в духе
public void doRequest(HttpRequest request, HttpResponse response) {
AsyncContext ctx = request.startAsync();
// send context to the pool, complete on ctx later.
}
И вот их "инструментирование" вызов doRequest измеряет! А вот более сложно подменять (и измерять) request им было лень. Видимо, не нужно это никому
Здрав ствуйте, gyraboo, Вы писали:
G>А начальные ресурсы рассчитываются по такой схеме: SLA по микросервису от аналитиков и бизнеса -> разрабы делают первую сборку микросервиса -> команда НТ проводит тестирование по SLA из ТЗ и выдает заключение, на основании которого делается вывод о том, нужно ли увеличивать мощности, масштабирование или оптимизировать код чтобы уложиться в целевые SLA G>Мне кажется, микросервисы уже достаточно зрелая технология, все такие моменты уже имеют стандартные и отработанные решения.
Это все красивая теория. На практике с "современными технологиями" можно прекрасно наблюдать эффекты интерференции между приложениями.
У нас тоже есть прекрасно обстрелянное нагрузкой приложение. С реальными k8s cpu constraints и симуляторами внешних сервисов (с необходимой задержкой "обработки"). И вот в какой-то момент выясняется, что один экземпляр приложения тормозит в боевой системе на нагрузке заметно ниже рассчетной. Я иду наезжать на наших опсов и архитекторов, отвечающих за k8s. Какого, мол, у вас среда такая? В perf были нормальные машины, а на проде вы закупили каких-то pentium pro. Дайте мне на perf самое худшее, что вообще бывает! Я тогда пропишу самые пессимистичные лимиты и все будет хорошо. Ну они поразбирались, все оказалось еще интереснее.
Наш экземпляр (который тормозит), попал на машину с тяжелой нагрузкой (для сравнения — у нас лимит в 1CPU, у них что-то вроде 4CPU). Вроде как эта нагрузка привела к троттлингу CPU. Планировщик считает CPU Time (не такты), так что зацепило вообще все приложения на хосте. И тут что тестируй, что не тестируй — все равно тормоза. В теории есть еше эффекты на CPU Cache (больше проявляются если много мелких приложений). Как-то вроде разрулили. Дали тяжелым задачам отдельный пул. Но осадочек остался.
Конкретно у k8s в его стандартных настройках есть и еще один замечательный эффект. При планировании исполнения k8s считает, что есть 150% CPU от того, что на хосте. Это хорошо подоходит Гуглу. У них много разноплановых приложений, какие-то работают близко к пределу, другие — используют минимум ресурсов. А у нас не так! У нас основное бизнес-приложение одно. Когда увеличивается входящая нагрузка, она разливается и по остальным зависимостям. Т.е. большинство сервисов приближаются к верхней границе потребностей одновременно. В результате на одном хосте потребность (demand) превышает 100% CPU, все начинает тормозить. И приводит к каскадным эффектам, замедляет обработку запросов выше, повышает требования по памяти. Ну и да, CPU опять греется и троттлится (или просто кончается burst capacity).
S>Ведь известно, что на каждый запрос выделяется отдельный тред. Запрос /animals/any заставляет тред веб-сервера Zoo висеть в ожидании ответа от Random Animal — то есть не дает треду быстро освободиться. А пул тредов на веб-сервере ограничен и един: он обслуживает и запросы /animals/any, и запросы /ticket и любые другие.
S>Уах-хах-хаа! S>Просто не делайте так, детишки. Не надо выделять по треду на запрос, и хипстерские паттерны станут не нужны
Поток-на-запрос — это единственный нормальный метод. Всё остальное — удаление гландов через задницу.
Просто нужны легковесные потоки, как в Go или будущей Java Project Loom (когда их оракловские жопорукие программисты допилят таки).
M>Есть начальная команда, которая разрабатывает продукт. Это монолит, со внутренней модульюностью и более-менее успешной архитектурой. В течение 5 лет половина команды уходит на новые проекты. Другую половину эффективные менеджеры заменяют на более дешевых и управляемых сговорчивых разработчиков. Это поколение немножко забивает на границы между модулями и вводит ненужную связность. В коде образуется лишний coupling, но зато тикеты закрываются легко и весело. Приложение постепенно превращается в макаронного монстра (spaghetti monster). За следующие 5 лет половина разработчиков успешно фрустрирует и уходит. Другую половину эффективные менеджеры увольняют из-за снизившейся производительности (tech debt мешает, да) и нанимает еще более дешевых разработчиков. Это будет третье поколение. Новые разработчики дешевые, но существующий код читать не умеют. Про рефакторинги и приведение монолита в порядок даже и говорить не приходится. Зато они умеют писать новый код. Внешние костыли гордо называются микросервисами. Система может разиваться еще какое-то время. Еще через 5 лет организация получает уже распределенного макаронного монстра.
Уже за один лишь этот абзац ставлю "Спасибо".
Все остальное, впрочем, тоже верно.
S>Расскажите про ваш процесс. Лично я — очень впечатлён.
Я сначала было тоже, а потом сообразил, что до основной-то работы этот процесс еще не дошел.
Работа начинается в тот момент, когда поднятный сервис требуется использовать по назначению (production rollout). Вот там уже все может быть довольно долго, типа "выкатываем на внутренних юзеров и ждем жалоб неделю", "выкатываем на бета-юзеров", "выкатываем на % юзеров" и так далее.
Так-то поднять endpoint по готовому шаблону можно за пару часов. Какой-нибудь gigalixir или его аналоги где-нибудь в digitalocean так и вовсе за час.
Здравствуйте, Ziaw, Вы писали:
Z>1. Ничего, что сейчас сложно и нужно 20 человек там, где могут справиться 2, зато потом будет все легко и просто. Z>2. wtf???... неделя поиска распределенного бага, фуух, зато мы получили классный опыт Z>3. Добавить крупную фичу? Это легко и просто. Нужно два месяца проектирования, две недели совещаний с разработчиками нужных сервисов, месяц разработки, потом месяц регресса. А что вы хотели, это айти, здесь не бывает дешевых решений. Зато нам не страшно, что любой человек уволится, поддерживать его микросервис может любой другой, так как там три строки бизнес кода, остальное — инфраструктура по взаимодействию с остальными. Вон Вася легко сможет поддерживать еще один, все равно его микросервис с прошлого года не требовал изменений. А всего три месяца онбординга и новый программист поймет, как у нас здесь все работает и снимет допнагрузку с Васи.
Все круто, но при чем тут микросервисы? Вероятность таких проблем в монолитах точно такая же. Ты, случаем, не путаешь монолитную архитектуру и полное отсутствие масштабирования и HA?
Здравствуйте, Ziaw, Вы писали:
Z>А где же про эти решения можно почитать? Допустим мы нагрузили, latency 50 микросервисов начало расти с разным коэффициентом геометрической прогрессии от RPS (в реальности зависимости гораздо сложнее и найти закономерности почти нереально, но пусть будет так).
Включаешь трейсинг и смотришь в каком нибудь егере где мы утыкаемся. И 50 сервисов схлопываются до одного.
Z> В разных нагрузочных сценариях эти коэффициенты разные и задействованы разные микросервисы.
Значит снимаешь трейсинг для разных сценариев. Тебе продакты придут и скажут какой именно сценарий не удовлетворяет SLA. И микросервисы тут, опять же, совершенно не причем.
Здравствуйте, Ziaw, Вы писали:
Z>В микросервисной архитектуре сервис выполняет одну простую функцию и крайне рекомендуется не шарить одно хранилище между несколькими микросервисами. Нет какого-то главного микросервиса. Z>У монолита есть крупное основное приложение с основных хранилищем, возможно какие-то изолированные сервисы развернуты отдельно.
Микросервисы это, во главе угла, прежде всего про процессы разработки. А архитектура это уже следствие.
Основное ради чего весь этот сыр-бор — максимальная изоляция компетенций по единицам деплоймента. Т.е. каждая конкретная команда решает свою узкую задачу независимо. Максимально независимо. И изменения деплоятся тоже независимо. А вот чтобы это обеспечить как раз и придумана та туча микросервисных технологий.
Монолит же, это когда у нас есть одна большая суперкоманда (пусть и состоящая внутри из нескольких команд), которая и обладает всеми необходимыми компетенциями. Характерный признак монолита — большие релизы, когда несколько разных сервисов, пусть и написанных разными командами, в итоге где то собираются в единое целое, и это целое сперва тестируется именно как целое, а затем и деплоится целиком. А сколько там физических сервисов и как расшарена БД — совершенно пофигу.
Здравствуйте, Ziaw, Вы писали:
Z>Самой серьезной проблемой монолита я считаю возможность протащить туда фиговую архитектуру, рефакторинг которой станет фактически невозможным в реалиях скрама и всего такого.
Это с точки зрения программиста. А с точки зрения продукта основная проблема — долгие большие релизы, и, как следствие, неконкурентный time to market новых фич.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Это с точки зрения программиста. А с точки зрения продукта основная проблема — долгие большие релизы, и, как следствие, неконкурентный time to market новых фич.
О да, это какой-то пинцет.
С другой стороны, микросервисы — тоже не всегда панацея. Там начинаются какие-то адские цепочки зависимостей, которые рано или поздно упираются в компонент с самым медленным релизным циклом.
Но это в любом случае не хуже, чем расписание релизов монолита.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>С другой стороны, микросервисы — тоже не всегда панацея.
Микросервисы это необходимое, но не достаточное условие.
S> Там начинаются какие-то адские цепочки зависимостей, которые рано или поздно упираются в компонент с самым медленным релизным циклом.
Наоборот же. Проблемы вызывают быстро меняющиеся с потерей обратной совместимости компоненты. Что при этом дают микросервисы?
1) Локальность. Т.е. ты вполне можешь проапгрейдить компонент только в одном сервисе, а в остальных оставить старый.
2) REST API на границах микросервисов значительно гибче и слабее, чем интерфейсы дотнета. Т.е. оно намного чаще и проще позволяет сохранять обратную совместимость.
Все это, разумеется, небесплатно, и проблемы тоже привносятся. Основные:
1) Сильно усложняется разработка, когда история требует согласованного изменения нескольких компонентов и сервисов. Вместо одного релиза приходится делать несколько, причем в строго определенном порядке. И каждый шаг несет ровно тот же риск, сколько и одиночный накат релиза монолита. Тестерам, разумеется, требуется прогонять полный цикл тестирования для каждого шага цепочки.
2) Сильно усложняется обеспечение совместимости в сквозной функциональности. Т.е. если у тебя, скажем, есть некий общий трейсинг, то тебе нужно при внесении изменений держать в голове возможность одновременной работы нескольких его версий. И если вдруг такое обеспечить нельзя — мы приходим к монолит-лайк релизу, с даунтаймов, осложненному существенно большим количеством независимых деплойментов.
Здравствуйте, Sinclair, Вы писали:
НС>>Это с точки зрения программиста. А с точки зрения продукта основная проблема — долгие большие релизы, и, как следствие, неконкурентный time to market новых фич. S>О да, это какой-то пинцет. S>С другой стороны, микросервисы — тоже не всегда панацея. Там начинаются какие-то адские цепочки зависимостей, которые рано или поздно упираются в компонент с самым медленным релизным циклом.
Тогда на практике в больших компаниях просто этот компонент переписывают, причём независимо от старой команды.
Здравствуйте, Cyberax, Вы писали: C>Тогда на практике в больших компаниях просто этот компонент переписывают, причём независимо от старой команды.
Не понял, это как? То есть в понедельник приходит команда, которая отвечает за микросервис "верификация телефонного номера", а им говорят: "посоны, теперь у нас две реализации этого микросервиса — ваша, и та, которая с воскресенья в проде" — так что ли?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
C>>Тогда на практике в больших компаниях просто этот компонент переписывают, причём независимо от старой команды. S>Не понял, это как? То есть в понедельник приходит команда, которая отвечает за микросервис "верификация телефонного номера", а им говорят: "посоны, теперь у нас две реализации этого микросервиса — ваша, и та, которая с воскресенья в проде" — так что ли?
Примерно.
Реальный сценарий, который у меня был на практике:
1. Есть сервис (будем считать, что для верификации номеров), который написан и поддерживается Равшаном и Джамшутом из отдела "А". Все вызовы сервиса — синхронные, и могут висеть по 5 минут до получения ответа.
2. Многие клиентские библиотеки от такого немного фигеют, и требуют специально крутить таймауты. Всех это достаёт, и отдел "Б" делает обёртку, которая скрывает синхронный интерфейс за асинхронным фасадом, с поддержкой нотификаций через местную систему сообщений.
3. Обёртка заворачивается в REST-интерфейс и начинает использоваться внутри проектов отдела "Б".
4. Отдел "В", которой тоже осточертели те же проблемы сервиса, замечает этот фасад и просит отдел "Б" дать им доступ к сервису-фасаду. Отдел "Б" соглашается (а чего бы не помочь хорошим людям?).
5. Шаг 4 повторяется несколько раз.
6. Менеджер отдела "Б" замечает, что REST-обёртка сервиса верификации — это уже неплохой внутренний продукт, и нанимает под него менеджера и программистов.
7. Выделенный менеджер и программисты замечают, что вообще-то самим реализовать верификацию не так уж и сложно, и тогда можно избавиться от вызовов к сервису "А" совсем.
Усё. Имеем два сервиса с одинаковой функциональностью. Причём достаточно разнесённые по иерархии менеджмента, так что "дефрагментировать" их никого особо не тянет. Исходный сервис после этого может постепенно умереть своей смертью.
Разные вариации на эту тему видел лично несколько раз. Вариант "вот это, но с перламутровыми крылышками" даже сам писал из-за того, что другая команда по идеологическим причинам не хотела добавлять нужный функционал.
Здравствуйте, maxkar, Вы писали:
G>>Так всетаки микросервисы проще монолитов или сложнее? M>Сложнее. И требуют более высокой кваливикации разработчиков, чтобы начать делать хорошо.
Круто. Начинали с того что микросервисы нужны для того чтобы снизить требования к квалификации разработчиков (это design goal такой). А закончили тем что они требуют более выской квалификации.
it allows organizations developing software to grow fast, and big, as well as use off the shelf services easier. Communication requirements are less.
Вобщем, ты явно что то путаешь.
M>На архитектурном уровне вместе с микросервисами приходит eventual consistency. В монолите можно сделать большую транзакцию, в микросервисах — в целом нет.
Распределенная транзакция с попыткой обеспечить ACID сложнее и требует более высокой квалификации, нежели eventual consistency. Аргумент твой доказывает обратное заявленному.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Круто. Начинали с того что микросервисы нужны для того чтобы снизить требования к квалификации разработчиков (это design goal такой). А закончили тем что они требуют более выской квалификации. НС>
НС>it allows organizations developing software to grow fast, and big, as well as use off the shelf services easier. Communication requirements are less.
НС>https://en.wikipedia.org/wiki/Microservices
НС>Вобщем, ты явно что то путаешь.
Я не путаю. В приведенной цитате да и вообще в статье нет ничего про стоимость и квалификацию. Более того, вводный параграф вообще функциональность приложения обходит стороной. Противоречия здесь никакого нет. Можно нанять много разработчиков, они все будут очень-очень заняты. А на выходе — прямо как в анекдоте: "Я могу печатать 600 символов в минуту но получается какая-то фигня". Для того, чтобы все более-менее работало (и работало 24/7) нужна будет квалификация. В другую сторону тоже работает — если получится найти сильных разработчиков в качестве лидеров команд, законченный продукт можно получить быстро.
Да и вообще вообще вся статья писалась по "вражеским" материалам. Например:
A microservice architecture – a variant of the service-oriented architecture (SOA) structural style
Я учил архитектурные стили по Neal Ford и Mark Richards. У них микросеврисы стоят рядом с SOA и не являются её разновидностью (bounded contexts — microservices, infrastructure services & service per business function — SOA). Микросервисы в разновидность SOA очень любят записывать консультанты вроде IBM. Это им нужно, чтобы продавать infrastructure services (общие пользователи и т.п.), которые в микросервисы не вписываются. Еще консультантам очень интересно продать как можно больше консультантов (organization grow fast). В большинстве случаев оплата идет по time & materials, и становится выгодно, чтобы проекты не заканчивались в срок. Если переборщить с communications are less, как раз получится мифический человекомесяц, когда все сервисы есть но не интегрируются друг с другом.
M>>На архитектурном уровне вместе с микросервисами приходит eventual consistency. В монолите можно сделать большую транзакцию, в микросервисах — в целом нет. НС>Распределенная транзакция с попыткой обеспечить ACID сложнее и требует более высокой квалификации, нежели eventual consistency. Аргумент твой доказывает обратное заявленному.
Так в монолите же нет распределения через границы сервисов. А для транзакций внутри монолита (но через разные хранилища) решения разработаны уже давным давно. В JEE/JTA стандартные интерфейсы (javax.transaction.xa) для координатора транзакций были уже 17 лет назад. Поэтому "сложность разработки" сводится к использованию аннотации @Transactional по поводу и без. Настраивается это все один раз в начале проекта знающими людьми. А вот в микросеврисах такая магия не работает. Я вот часто вижу (и на rsdn темы периодически поднимаются), что делают rpc over http вместо rest. Об обработке ошибок даже не задумываются. Ты думаешь, с этими разработчиками можно конструктивно говорить про eventual consistency? А вот в монолите local procedure call прекрасно работает. Инфраструктура с транзакцией разберется если что-то пойдет не так.
Здравствуйте, maxkar, Вы писали:
M>Я не путаю. В приведенной цитате да и вообще в статье нет ничего про стоимость и квалификацию.
Естественно прямо тебе никто не скажет, что эту технологию придумали чторбы эффективнее использовать стадо индусов. Но намек про это вполне прозрачен.
M>А на выходе — прямо как в анекдоте: "Я могу печатать 600 символов в минуту но получается какая-то фигня".
Именно. И микросервисы позволяют вот эту фигню изолировать в маленьком кусочке и остальным от нее не так сильно страдать, как в монолите.
M>Я учил архитектурные стили по Neal Ford и Mark Richards. У них микросеврисы стоят рядом с SOA
Микросервисы и SOA, при внешней похожести, все таки сильно не одно и тоже. SOA породили архитекты-теоретики, пытаясь пропихнуть некий концепт. А микросервисы наоборот, родились "от сохи". Когда адепты SOA начали ощущая загибание этой самой SOA со всеми причиндалами типа SOAP и WCF, вот тогда они и начали усиленно натягивать SOA на микросервисы.
M>Микросервисы в разновидность SOA очень любят записывать консультанты вроде IBM.
Вот вот. Не могут же они сказать, что то что они впаривали за гигабаксы до этого оказалось фигней.
M>Еще консультантам очень интересно продать как можно больше консультантов (organization grow fast).
Ты неверно интерпретировал фразу. organization grow fast это когда мы покупаем за внезапно полученные от инвесторов бабки кучу индусов, и после этого начинаем думать как же нам со всей этой сомнительной толпой наконец начинать что то делать. Микросервисы — отличный подход. Пилим систему на кучу почти несвязанных кусков, а потом отдаем индусам всю эту тряхомудию. А микросервисы позволяют этому хоть как то взлететь.
НС>>Распределенная транзакция с попыткой обеспечить ACID сложнее и требует более высокой квалификации, нежели eventual consistency. Аргумент твой доказывает обратное заявленному. M>Так в монолите же нет распределения через границы сервисов.
Это чего вдруг? Эра односерверных решений ушла в прошлое, они не годятся для high load, и даже монолитам надо уметь как минимум HA, а лучше все таки уметь в скейлинг.
Здравствуйте, Ночной Смотрящий, Вы писали:
M>>Сложнее. И требуют более высокой кваливикации разработчиков, чтобы начать делать хорошо. НС>Круто. Начинали с того что микросервисы нужны для того чтобы снизить требования к квалификации разработчиков (это design goal такой). А закончили тем что они требуют более выской квалификации. НС>
НС>it allows organizations developing software to grow fast, and big, as well as use off the shelf services easier. Communication requirements are less.
Смысл цитировать эти манифесты за все хорошее? Люди пишут эти манифесты опробовав на маленькой выборке,
теоретики типа. У Нетфликса получилось, давайте все делать как Нетфликс. Зачастую это либо реально сложно из-за предметной
области, либо просто не нужно. На счет требований к инженерам -- ну вот какие навыки нужны от программиста в монолитном
сервисе? Язык, предметная область, sql+ еще какой-нибудь dsl, паттерны проектирования.
Требования к программисту микросервисов -- тоже самое + знание распределенных систем, ну хотя бы
на уровне Fallacies&pitfalls of distr. computing, типа что сеть не надежна,
пакеты теряются. Далее, писать соотв. образом, чтобы можно было без проблем перезапускать упавший сервис, т.е. грамотно
работать с локальным состоянием, знать про service discovery и прочие паттерны вроде sidecar, уметь заворачивать
свой сервис в докер, облачные технологии и т.п. вещи, nosql (event. consistency). Сразу куча вещей, которые надо
изучать и инвестировать не мало своего времени на это. Те же, по сути, требования что и к монолоиту+еще куча всего.
Сразу оговорюсь, у меня нету опыта работа над микросервисной архитектурой, соотв. про требования я взял из описания вакансий+
мое понимание работы и устройства микросервисных систем и архитектур. Я не очень понимаю, за счет чего требования к
квалификации программистов должны снизится, если наоборот, должны вырасти?
C>Усё. Имеем два сервиса с одинаковой функциональностью. Причём достаточно разнесённые по иерархии менеджмента, так что "дефрагментировать" их никого особо не тянет. [Исходный сервис после этого может постепенно умереть своей смертью.
Проблема в том, что выделенное обычно попросту не происходит. Две (а по факту много больше) инфраструктуры существуют параллельно. Так что разработчикам приходится еще и мучаться с "интеграцией" этого добра, а также учить свои сервисы поддерживать оба варианта.
C>Разные вариации на эту тему видел лично несколько раз. Вариант "вот это, но с перламутровыми крылышками" даже сам писал из-за того, что другая команда по идеологическим причинам не хотела добавлять нужный функционал.
Мне неоднократно доводилось стоять с другой стороны баррикад. В большинстве случаев вовсе не Равшан и Джамшут сделали сервис А. Чаще все наоборот. Процитирую:
Есть начальная команда, <...> эффективные менеджеры заменяют на более дешевых и управляемых <...> нанимает еще более дешевых разработчиков. Это будет третье поколение. Новые разработчики дешевые, но существующий код читать не умеют. Про рефакторинги и приведение монолита в порядок даже и говорить не приходится. Зато они умеют писать новый код. Внешние костыли гордо называются микросервисами.
Как раз "вот это, но с перламутровыми крылышками" и есть та стадия, когда "новые разработчики дешевые, но существующий код читать не умеют, зато умеют писать новый код" — те самые крылышки. Сплошь и рядом разработчики прикладного уровня даже не пытаются разобраться, как пользоваться существующими инструментами. Зато горазды велосипеды строить.
А далее по накатанной: параллельная реализация "с перламутром" оригинальными разработчиками с гордым видом сдается куда-нибудь в инфра-команду, с выражением "смотрите, вот мы сделали новую классную штуку, а поддерживать — это нам не с руки, мучайтесь сами, делайте что хотите, но сохраните вот этот вот API". И там, конечно, жуть и кошмар, сплошные макароны, обычно с минимумом тестов, в лучшем случае покрывающем нужды только оригинального разработчика. Почти всегда с текущими абстракциями, настолько затрудняющими рефакторинг (и сведение двух параллельных систем к одной).
Так вот, возвращаясь к "сам писал, потому что другая команда по идеологическим причинам не хотела". Причины очень часто не "идеологические", а банальная сложность поддержки костылей, которые просят натыкать, или абстракций, которые могут протечь, если продырявить "перламутровую пуговицу" где не надо. Монолит, конечно, упрощает такое, но и в случае с микросервисами выставить кишки наружу (и тем самым считай что запретить рефакторинг) — очень частая забава в "быстро растущем продукте".
Здравствуйте, SkyDance, Вы писали:
C>>Усё. Имеем два сервиса с одинаковой функциональностью. Причём достаточно разнесённые по иерархии менеджмента, так что "дефрагментировать" их никого особо не тянет. [Исходный сервис после этого может постепенно умереть своей смертью. SD>Проблема в том, что выделенное обычно попросту не происходит. Две (а по факту много больше) инфраструктуры существуют параллельно. Так что разработчикам приходится еще и мучаться с "интеграцией" этого добра,
Пусть существуют. Компания большая, выдержит.
Это куда лучше, чем борьба внутри "монолита" по поводу того, как развивать его.
SD>а также учить свои сервисы поддерживать оба варианта.
Тут не очень понятно зачем. Потребители будут просто выбирать один из сервисов. Поддерживать все варианты нужно будет только в каких-то очень специфических случаях.
SD>
SD>Есть начальная команда, <...> эффективные менеджеры заменяют на более дешевых и управляемых <...> нанимает еще более дешевых разработчиков. Это будет третье поколение. Новые разработчики дешевые, но существующий код читать не умеют. Про рефакторинги и приведение монолита в порядок даже и говорить не приходится. Зато они умеют писать новый код. Внешние костыли гордо называются микросервисами.
И причём тут микросервисы? В монолите будет всё так же, но ещё хуже.
SD>А далее по накатанной: параллельная реализация "с перламутром" оригинальными разработчиками с гордым видом сдается куда-нибудь в инфра-команду, с выражением "смотрите, вот мы сделали новую классную штуку, а поддерживать — это нам не с руки, мучайтесь сами, делайте что хотите, но сохраните вот этот вот API". И там, конечно, жуть и кошмар, сплошные макароны, обычно с минимумом тестов, в лучшем случае покрывающем нужды только оригинального разработчика. Почти всегда с текущими абстракциями, настолько затрудняющими рефакторинг (и сведение двух параллельных систем к одной).
Это решается удалением такого понятия как "инрфа-команды". Те кто пишет сервис — поддерживают его во время его жизни.
SD>Так вот, возвращаясь к "сам писал, потому что другая команда по идеологическим причинам не хотела". Причины очень часто не "идеологические", а банальная сложность поддержки костылей, которые просят натыкать, или абстракций, которые могут протечь, если продырявить "перламутровую пуговицу" где не надо.
Там была чистая идеология, реализация с нуля с нужным функционалом заняла несколько недель.
SD>Монолит, конечно, упрощает такое, но и в случае с микросервисами выставить кишки наружу (и тем самым считай что запретить рефакторинг) — очень частая забава в "быстро растущем продукте".
Как раз наоборот. В монолите будет препятствие в виде идеологии. Причём непреодолимое.
Здравствуйте, Sharov, Вы писали:
S>Здравствуйте, Ночной Смотрящий, Вы писали:
M>>>Сложнее. И требуют более высокой кваливикации разработчиков, чтобы начать делать хорошо. НС>>Круто. Начинали с того что микросервисы нужны для того чтобы снизить требования к квалификации разработчиков (это design goal такой). А закончили тем что они требуют более выской квалификации. НС>>
НС>>it allows organizations developing software to grow fast, and big, as well as use off the shelf services easier. Communication requirements are less.
НС>>https://en.wikipedia.org/wiki/Microservices НС>>Вобщем, ты явно что то путаешь.
S>Смысл цитировать эти манифесты за все хорошее? Люди пишут эти манифесты опробовав на маленькой выборке, S>теоретики типа. У Нетфликса получилось, давайте все делать как Нетфликс. Зачастую это либо реально сложно из-за предметной S>области, либо просто не нужно. На счет требований к инженерам -- ну вот какие навыки нужны от программиста в монолитном S>сервисе? Язык, предметная область, sql+ еще какой-нибудь dsl, паттерны проектирования. S>Требования к программисту микросервисов -- тоже самое + знание распределенных систем, ну хотя бы S>на уровне Fallacies&pitfalls of distr. computing, типа что сеть не надежна, S>пакеты теряются. Далее, писать соотв. образом, чтобы можно было без проблем перезапускать упавший сервис, т.е. грамотно S>работать с локальным состоянием, знать про service discovery и прочие паттерны вроде sidecar, уметь заворачивать S>свой сервис в докер, облачные технологии и т.п. вещи, nosql (event. consistency). Сразу куча вещей, которые надо S>изучать и инвестировать не мало своего времени на это. Те же, по сути, требования что и к монолоиту+еще куча всего.
S>Сразу оговорюсь, у меня нету опыта работа над микросервисной архитектурой, соотв. про требования я взял из описания вакансий+ S>мое понимание работы и устройства микросервисных систем и архитектур. Я не очень понимаю, за счет чего требования к S>квалификации программистов должны снизится, если наоборот, должны вырасти?
Микросервисы меньше размерами, удержать к голове архитектуру гораздо проще, проще сам процесс разработки, отладки, тестирования.
Размер в общем имеет значение. Я как-то работал с довольно большим, мягко говоря, монолитом, из несколько сотен Java модулей,
где разные части написаны как попало и как попало синтегрированы. Новому разработчику чтобы войти в курс дела и что-то начать
продуктивное писать не наломав дров сразу же, требуется где-то 3 месяца. Практически никто не видит полной картины, как вся система
работает, поэтому регулярно случались истории типа, что-то переместил в одном месте, отвалилось совсем в другом (и это удача если
это другое место было покрыто тестами. тестов там было много, но покрыть прямо все нереально).
По сравнению с этим, сложности микросервисов которые были упомянуты, они есть, но ими как правило занимаются специальные люди,
то есть при грамотной архитектуре, разработчик прикладной части микросервисов с ними не так много сталкивается.
Хотя сталкивается конечно, но это просто специфика, которая есть в каждом проекте. Я бы не сказал что нужна большая
квалификация разработчикам микросервисов. Но и что меньшая — тоже. Вообще здесь нет какого-то общего случая, может быть и так и эдак.
Однозначный плюс микросервисов — это размер, как я уже упомянул пару раз. Из-за него существенная часть сложности уходит.
Людей буквально заставляют делить большой проект на части физически, что в какой-то степени уменьшает степень макаронности кода.
Можно конечно и с микросервисами спагетти написать мама не горюй если архитектурой не занимаются вообще, но это все-таки
не так распространено как в монолитах.
Здравствуйте, maxkar, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>Так всетаки микросервисы проще монолитов или сложнее?
M>Сложнее. И требуют более высокой кваливикации разработчиков, чтобы начать делать хорошо.
M>Как SkyDance здесь уже отметил, микросервисы на раннем этапе всего-лишь позволяют предотвратить излишнюю связность. Особенно на нижнем уровне вроде базы данных. Это можно делать и в монолите, но нужна определенная политическая воля.
Это "всего-лишь" довольно дорогого стоит на самом деле.
Если мы говорим про длительный отрезок времени (10-15-20 лет), это (политическая воля и все такое) 99.9% нереально. Ну то есть политическая воля нужна на самом-самом верху, да и это может не помочь, потому что CEO приходят и уходят, да и основатели компании могут уже уйти к тому времени.
А типичный и всеми используемый процесс разработки оперирует краткосрочными целями (квартал, ну максимум год), долгосрочный tech debt всем пофигу по большому счету, на всех уровнях менеджмента.
То есть превращение монолита в макаронного монстра просто-напросто неизбежно, можно сказать заложено силами природы . Ну или корпоративной практики, что в данном случае одно и то же.
С микросервисами из-за на порядки меньшего размера, рефакторинг и приведение кода в порядок не становится запретительно дорогой операцией (как с монолитом) и может проводиться более-менее регулярно.
Здравствуйте, VladiCh, Вы писали:
VC>С микросервисами из-за на порядки меньшего размера, рефакторинг и приведение кода в порядок не становится запретительно дорогой операцией (как с монолитом) и может проводиться более-менее регулярно.
Зато рефакторить интерфейсы между сервисами становится практически невозможно поскольку для этого надо распинать кучу соседних команд. А у них у всех лапки и они ничего не хотят делать.
Здравствуйте, Sharov, Вы писали:
S>Смысл цитировать эти манифесты за все хорошее? Люди пишут эти манифесты опробовав на маленькой выборке,
Или нет.
S>У Нетфликса получилось, давайте все делать как Нетфликс.
А как надо?
S> Зачастую это либо реально сложно из-за предметной области, либо просто не нужно.
Зачастую? У тебя есть статистика?
S>На счет требований к инженерам -- ну вот какие навыки нужны от программиста в монолитном S>сервисе? Язык, предметная область, sql+ еще какой-нибудь dsl, паттерны проектирования.
Нужно умение хорошо структурировать код. И чем больше размер монолита, тем важнее это умение.
Интерфейсы языка программирования намного богаче и позволяют делать очень высокую связность, особенно если пользоваться ими неумело. А вот микросервисы принудительно вводят очень жесткие границы, не позволяющие высокой связности в силу специфики REST API.
S>тоже самое + знание распределенных систем, ну хотя бы на уровне Fallacies&pitfalls of distr. computing, типа что сеть не надежна, S>пакеты теряются. Далее, писать соотв. образом, чтобы можно было без проблем перезапускать упавший сервис, т.е. грамотно S>работать с локальным состоянием, знать про service discovery и прочие паттерны вроде sidecar, уметь заворачивать S>свой сервис в докер, облачные технологии и т.п. вещи, nosql (event. consistency). Сразу куча вещей, которые надо S>изучать и инвестировать не мало своего времени на это.
Почти все это нужно и для монолита. Ты же не сравниваешь всерьез микросервисы с системой, состоящей из одного сервера, надеюсь?
S>Сразу оговорюсь, у меня нету опыта работа над микросервисной архитектурой
S>>Смысл цитировать эти манифесты за все хорошее? Люди пишут эти манифесты опробовав на маленькой выборке, НС>Или нет.
Или да. Сначала пишут манифесты, потом начинается хайп, потом всплывает куча проблем что не всем и не всегда это
надо. Квалификация программистов, оказывается, нужна выше, а не ниже и т.д.
S>>У Нетфликса получилось, давайте все делать как Нетфликс. НС>А как надо?
Прежде как, а оно вообще надо? Т.е. на эти вопросы надо сначала ответить.
S>> Зачастую это либо реально сложно из-за предметной области, либо просто не нужно. НС>Зачастую? У тебя есть статистика?
Нету, кроме общих рассуждений и, по сути, заваленного проекта на фирме.
S>>На счет требований к инженерам -- ну вот какие навыки нужны от программиста в монолитном S>>сервисе? Язык, предметная область, sql+ еще какой-нибудь dsl, паттерны проектирования. НС>Нужно умение хорошо структурировать код. И чем больше размер монолита, тем важнее это умение. НС>Интерфейсы языка программирования намного богаче и позволяют делать очень высокую связность, особенно если пользоваться ими неумело. А вот микросервисы принудительно вводят очень жесткие границы, не позволяющие высокой связности в силу специфики REST API.
Допустим, а если разработчики монолита будут думать в терминах api, а не интерфейсов? В чем тогда выгода микросервисов?
S>>тоже самое + знание распределенных систем, ну хотя бы на уровне Fallacies&pitfalls of distr. computing, типа что сеть не надежна, S>>пакеты теряются. Далее, писать соотв. образом, чтобы можно было без проблем перезапускать упавший сервис, т.е. грамотно S>>работать с локальным состоянием, знать про service discovery и прочие паттерны вроде sidecar, уметь заворачивать S>>свой сервис в докер, облачные технологии и т.п. вещи, nosql (event. consistency). Сразу куча вещей, которые надо S>>изучать и инвестировать не мало своего времени на это. НС>Почти все это нужно и для монолита. Ты же не сравниваешь всерьез микросервисы с системой, состоящей из одного сервера, надеюсь?
В целом сравниваю. Ну не одно систему, а 2-3 пилят на 10 мелких. Опять же, надо определиться под тем, что называется
монолит. Много кода в едином адресном пространстве -- это оно?
S>>Сразу оговорюсь, у меня нету опыта работа над микросервисной архитектурой НС>А опыт работы над современными монолитами есть?
Опыт работы над небольшими проектами, группой 2-3 человек, на 1-2 года работы. Иногда группы из 4-5 человек.
Взгляд со стороны, а не изнутри.
НС>Интерфейсы языка программирования намного богаче и позволяют делать очень высокую связность, особенно если пользоваться ими неумело. А вот микросервисы принудительно вводят очень жесткие границы, не позволяющие высокой связности в силу специфики REST API.
Если уж на то пошло, REST API далеко не единственный и уж точно не лучший вариант для формализации общения между сервисами. Низкая эффективность, высокие накладные расходы и куча не совсем осмысленных ограничений.
Куда логичнее было бы применить какой-нибудь message passing interface. Чтобы у сервисо-писателей даже не возникало чесотки сделать очередные RPC тут и там. Но вот же беда, пресловутых 100.000 индусов научить мыслить в терминах распределенной (и по определению асинхронной) системы куда сложнее, чем дать возможность совершать [local] blocking calls. В итоге практика показывает, что микросервисы попросту превращаются в еще более страшный кошмар архитектора — распределенный монолит. Когда на вид там микросервисы, но протекшие абстракциями отовсюду. И везде сплошные crawler'ы, постоянно шерстящие систему в поисках разных там tombstones, orphan entities и прочего забытого добра. А потом, конечно, скандалы, "компания G годами не удаляла данные пользователей, которые хотели удалить эти данные в соответствии с GDPR, ах эти G, злые они, так и хотят украсть что-то, нельзя им верить".
VC>С микросервисами из-за на порядки меньшего размера, рефакторинг и приведение кода в порядок не становится запретительно дорогой операцией (как с монолитом) и может проводиться более-менее регулярно.
Рефакторинг одного микросервиса и в самом деле становится дешевле. Но их же много, причем, как уже было отмечено выше, вдобавок еще и есть варианты того же "с перламутровыми крылышками". Поэтому сравнивать нужно сравнимое. Рефакторинг монолита правильно сравнивать с рефакторингом всех микросервисов сразу.
Плюс еще тонкий момент с тестированием. Как уже было указано выше, чтобы иметь возможность хоть как-то тестировать "свой" сервис, нужно иметь возможность запустить либо тестовые экземпляры, либо моки всех зависимостей (хотя для e2e этот вариант может и не подойти). Как правило поднять экземпляр монолита проще, чем все зависимости "перламутровых пуговиц" микросервисов, где каждый кто во что горазд.
Короче говоря, серебряной пули нет. И так и этак нужна железная воля руководства, чтобы держать возникающую на пустом месте сложность в узде. А это, однако, редко встречается, ибо, как тоже уже было указано, горизонты планирования большинства контор сейчас от силы год, а реально еще короче. Это пару веков назад можно было себе представить проект на всю жизнь, где можно было держать марку качества. А сейчас если продукт не скатился в <...> за двадцать лет — это, однако, круто!
И то правда. В самом деле, так даже лучше, headcount больше, можно назваться "менеджером 3 команд". Это ничего, что там 3 дубликата одного и того же, зато 15 человек вместо 5. Более важный начальник, уже не просто менеджер, а менеджер менеджеров.
C>Там была чистая идеология, реализация с нуля с нужным функционалом заняла несколько недель. C>Как раз наоборот. В монолите будет препятствие в виде идеологии. Причём непреодолимое.
Конкретно ваш случай обсуждать не стану, ибо конкретики не знаю. Но подобных ситуаций я наблюдал очень много. Обычно заявления "вон та команда по идеологическим причинам не делает то, что я хочу" возникают при низкой квалификации требующего, который не в состоянии понять, почему отказ "вытащить вот те данные" является не идеологическим. В самом деле, вот почему бы не вытащить кишки sk_buff через какие-нибудь sysctl, так удобно было б по-быстрому подсмотреть всякие кастомные битики в заголовках IP, или еще что такое.
Также встречаются банальные провалы менеджмента. Когда команде "А" неповезло, и ее менеджер не в состоянии выбить headcount. Поэтому у команды постоянно аврал, вечно растущие backlog'и, постоянная дерготня от смены приоритетов (сегодня пришли из payments, давайте спешно их требования удовлетворять, а завтра пришли из кернел, ну надо значит им теперь помочь). У команды "Б" же, наоборот, людям заняться нечем (начальник у них оказался пронырливый, headcount выбил, но чем теперь людей занять, не знает). Вот тогда "Б" и начинают городить параллельную инфраструктуру. Иногда от нечего делать, иногда "to unblock ourselves". И нет бы им разобраться да помочь "А", написать тесты, сделать нужные pull request. Нет, что вы, это ж надо в чужом коде разобраться. Но команда "Б" пришла не для этого, им свое хочется.
Заканчивается подобное тем, что рано или позно для команды "Б" таки находится чем заняться, и начинается какой-то проект. А параллельная инфраструктура, поскольку уж очень она похожа на продукт команды "А", как раз и сваливается на "поддержку" (стало быть, merge & deprecate) в ту самую команду "А". Чем вызывает вполне законную злость представителей "А" на товарищей из "Б", последними принимаемыми за "идеологическое препятствие". Однако ж никакой там идеологии нет, просто уровень знаний повыше.
PS: если что, мой сын тоже ведь считает, что я ему исключительно по идеологическим причинам не даю круглосуточно сидеть в онлайн-играх, жрать чипсы и прочую дрянь. Ужасная идеология! А, вот еще, зубы чистить — ну просто высшее проявление идеологии. Он ведь уже несколько раз проверял, не почистил — ничего не случилось. Зачем вообще чистить, кроме как по идеологическим причинам.
Здравствуйте, Sharov, Вы писали:
S>>>Смысл цитировать эти манифесты за все хорошее? Люди пишут эти манифесты опробовав на маленькой выборке, НС>>Или нет. S>Или да.
Т.е. аргументов у тебя нет. ЧТД.
S>>>У Нетфликса получилось, давайте все делать как Нетфликс. НС>>А как надо? S>Прежде как, а оно вообще надо?
Что вообще надо? Архитектуру какую то? Обычно надо.
S>Допустим, а если разработчики монолита будут думать в терминах api, а не интерфейсов?
И как ты это проконтролируешь?
S>В чем тогда выгода микросервисов?
В том что испохабить всю систему из одного микросервиса намного сложнее, чем из модуля монолита.
НС>>Почти все это нужно и для монолита. Ты же не сравниваешь всерьез микросервисы с системой, состоящей из одного сервера, надеюсь? S>В целом сравниваю.
Тогда не вижу предмета для разговора.
S>Ну не одно систему, а 2-3 пилят на 10 мелких.
Пилят на микросервисы систему, которая изначально на одном сервере работает, я верно тебя понял?
S> Опять же, надо определиться под тем, что называется монолит. Много кода в едином адресном пространстве -- это оно?
Нет. https://whatis.techtarget.com/definition/monolithic-architecture
S>>>Сразу оговорюсь, у меня нету опыта работа над микросервисной архитектурой НС>>А опыт работы над современными монолитами есть? S>Опыт работы над небольшими проектами, группой 2-3 человек, на 1-2 года работы. Иногда группы из 4-5 человек. S>Взгляд со стороны, а не изнутри.
Ну то есть все сервисы исключительно single instance?
Здравствуйте, SkyDance, Вы писали:
НС>>Интерфейсы языка программирования намного богаче и позволяют делать очень высокую связность, особенно если пользоваться ими неумело. А вот микросервисы принудительно вводят очень жесткие границы, не позволяющие высокой связности в силу специфики REST API.
SD>Если уж на то пошло, REST API далеко не единственный и уж точно не лучший вариант для формализации общения между сервисами. Низкая эффективность, высокие накладные расходы и куча не совсем осмысленных ограничений.
В контексте разговора эффективность не принципиальна. Главное что не очередная разновидность OORPC.
SD>Но вот же беда, пресловутых 100.000 индусов научить мыслить в терминах распределенной (и по определению асинхронной) системы куда сложнее, чем дать возможность совершать [local] blocking calls.
А им и не нужно мыслить. Их задача обычно диктуется уже спроектированным API и наложенными на них ограничениями в виде лимитов пода и SLA. Как это все будет натягиваться на реальную инфраструктуру — задача уже других людей.
При этом, конечно, если забить на нормальных девопсов и посадить все это натягивать на инфраструктуру таких же индусов — фейл неизбежен и никакие микросервисы не спасут.
НС>А им и не нужно мыслить. Их задача обычно диктуется уже спроектированным API и наложенными на них ограничениями в виде лимитов пода и SLA. Как это все будет натягиваться на реальную инфраструктуру — задача уже других людей. НС>При этом, конечно, если забить на нормальных девопсов и посадить все это натягивать на инфраструктуру таких же индусов — фейл неизбежен и никакие микросервисы не спасут.
Я правильно понимаю, что если раньше тем самым "другим людям" (и "нормальным девопсам") достаточно было просто диктовать архитектуру и не давать руководству заменять дешевых разработчиков на дорогих, то сейчас вдогонку к тому нужно еще успеть уследить на 100.000 индусов, чтобы те не проторчали кишки во все стороны? Не, эт дохлый номер, оно так не сработает. Просто теперь расходы на такой проект вырастут на те самые 100.000 индусов и их менеджеров, плюс потребуется еще больше грамотных людей. Понимаю, что линейным менеджерам это только на руку, но с точки зрения компании выигрыш неочевиден.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Круто. Начинали с того что микросервисы нужны для того чтобы снизить требования к квалификации разработчиков (это design goal такой). А закончили тем что они требуют более выской квалификации. НС>
НС>it allows organizations developing software to grow fast, and big, as well as use off the shelf services easier. Communication requirements are less.
Это не maxkar, похоже, путает -- вот тут, по ссылке из ссылки выше, пишут в cons для микросервисов:
But the switch to microservices comes with its fair share of costs, particularly when it comes to app monitoring and the toll it can take on developers. Adopters will have to consider factors such as:
Team expertise: The benefits of microservices are moot without a prepared staff. You should assess the skills of your team members before moving forward with a microservices architecture.
Testing and monitoring: Once you break apps into components, you'll have more moving parts to track and eventually fix. Without the right testing and monitoring tools in place, things could quickly spin out of control.
Здравствуйте, SkyDance, Вы писали:
SD>Я правильно понимаю, что если раньше тем самым "другим людям" (и "нормальным девопсам") достаточно было просто диктовать архитектуру и не давать руководству заменять дешевых разработчиков на дорогих, то сейчас вдогонку к тому нужно еще успеть уследить на 100.000 индусов, чтобы те не проторчали кишки во все стороны?
Нет, не правильно. Следить за 100000 индусов нужно в любом случае, но в микросервисной архитектуре это делать намного проще.
SD>Понимаю, что линейным менеджерам это только на руку, но с точки зрения компании выигрыш неочевиден.
Тем не менее аутсорс в Индию продолжает цвести буйным цветом.
Здравствуйте, SkyDance, Вы писали:
VC>>С микросервисами из-за на порядки меньшего размера, рефакторинг и приведение кода в порядок не становится запретительно дорогой операцией (как с монолитом) и может проводиться более-менее регулярно.
SD>Рефакторинг одного микросервиса и в самом деле становится дешевле. Но их же много, причем, как уже было отмечено выше, вдобавок еще и есть варианты того же "с перламутровыми крылышками". Поэтому сравнивать нужно сравнимое. Рефакторинг монолита правильно сравнивать с рефакторингом всех микросервисов сразу.
SD>Плюс еще тонкий момент с тестированием. Как уже было указано выше, чтобы иметь возможность хоть как-то тестировать "свой" сервис, нужно иметь возможность запустить либо тестовые экземпляры, либо моки всех зависимостей (хотя для e2e этот вариант может и не подойти). Как правило поднять экземпляр монолита проще, чем все зависимости "перламутровых пуговиц" микросервисов, где каждый кто во что горазд.
SD>Короче говоря, серебряной пули нет. И так и этак нужна железная воля руководства, чтобы держать возникающую на пустом месте сложность в узде. А это, однако, редко встречается, ибо, как тоже уже было указано, горизонты планирования большинства контор сейчас от силы год, а реально еще короче. Это пару веков назад можно было себе представить проект на всю жизнь, где можно было держать марку качества. А сейчас если продукт не скатился в <...> за двадцать лет — это, однако, круто!
Рефакторинг всех микросервисов сразу требуется куда реже (если их границы были выбраны правильно изначально). Может быть, да, в случае когда какая-то глобальная система меняется, что-нибудь типа авторизации / аутентификации, затрагивающее все микросервисы.
Или там переезд на другой сторидж, или другую систему очередей. Это вообще не рефакторинг уже, а редизайн, a редизайн любой большой системы это сильно дорогостоящая операция.
Я кстати совсем не уверен что в случае микросервисов это обойдется дороже — там чаще всего будет возможен вариант редизайна по частям, что в случае с монолитом обычно нереально.
Если же говорить про типовой рефакторинг для уменьшения tech debt, то это то что в монолите довольно часто просто нереально.
Просто потому что там с какого-то момента невозможно рефакторить "по частям", а глобальный рефакторинг такой же дорогостоящий как и редизайн.
Тестирование микросервисов более сложное, тут вопросов нет. То есть и в том и в другом подходе есть слабые стороны. Но, если развитие системы планируется надолго, монолит — это все-таки рискованная штука на длительном промежутке времени.
Я пока не видел ни одного крупного монолита, который бы развивался > 10 лет и не скатился в УГ. Правда, если честно, микросервисов которые столько бы прожили, тоже пока не видел .
Это все-таки более новые веяния, пока тому что я видел нет столько лет.
Здравствуйте, Miroff, Вы писали:
M>Здравствуйте, VladiCh, Вы писали:
VC>>С микросервисами из-за на порядки меньшего размера, рефакторинг и приведение кода в порядок не становится запретительно дорогой операцией (как с монолитом) и может проводиться более-менее регулярно.
M>Зато рефакторить интерфейсы между сервисами становится практически невозможно поскольку для этого надо распинать кучу соседних команд. А у них у всех лапки и они ничего не хотят делать.
Интерфейсы между сервисами как правило никто не рефакторит, просто выкатывают новую версию интерфейса (или новый сервис) для замены старой (старого сервиса).
Это во всяком случае более поэтапный и управляемый процесс, чем рефакторинг чего-то в монолите.
И я не вижу в чем тут невозможность — такое происходит сплошь и рядом.
Здравствуйте, Sharov, Вы писали:
S>Здравствуйте, Ночной Смотрящий, Вы писали:
НС>>Круто. Начинали с того что микросервисы нужны для того чтобы снизить требования к квалификации разработчиков (это design goal такой). А закончили тем что они требуют более выской квалификации. НС>>
НС>>it allows organizations developing software to grow fast, and big, as well as use off the shelf services easier. Communication requirements are less.
НС>>https://en.wikipedia.org/wiki/Microservices НС>>Вобщем, ты явно что то путаешь.
S>Это не maxkar, похоже, путает -- вот тут, по ссылке из ссылки выше, пишут в cons для микросервисов: S>
S>But the switch to microservices comes with its fair share of costs, particularly when it comes to app monitoring and the toll it can take on developers. Adopters will have to consider factors such as:
S> Team expertise: The benefits of microservices are moot without a prepared staff. You should assess the skills of your team members before moving forward with a microservices architecture.
S> Testing and monitoring: Once you break apps into components, you'll have more moving parts to track and eventually fix. Without the right testing and monitoring tools in place, things could quickly spin out of control.
S>Можно сказать, что design goal не удался.
Для того чтобы перелезть на микросервисную архитектуру, нужна большая подготовительная работа — автоматизация создания этих самых микросервисов и управления ими — с мониторингом, логгингом, алертами, всяческими настройками автоскейлинга и т.п.
Это требует интеграции кучи различных систем. Если этого нет и делать это все вручную для каждого микросервиса, то можно во всех этих мелочах закопаться и общий результат будет печален.
Поэтому сейчас важность девопсов сильно возросла, потому как крупные компании всю эту работу автоматизируют.
Но, если эта автоматизация есть, то с собственно разработчиков микросервисов эта вся нагрузка снимается, им как правило это все настраивать не нужно и оно работает из коробки.
Здравствуйте, SkyDance, Вы писали:
C>>Пусть существуют. Компания большая, выдержит. SD>И то правда. В самом деле, так даже лучше, headcount больше, можно назваться "менеджером 3 команд". Это ничего, что там 3 дубликата одного и того же, зато 15 человек вместо 5. Более важный начальник, уже не просто менеджер, а менеджер менеджеров.
Ну да. А что делать? Хотя бы таким образом этот "важный начальник" ограничен своей песочницей, и не мешает развивать другие проекты.
Как минимизировать такую ситуацию организационными методами — это уже вопрос для высшего менеджмента.
SD>Но команда "Б" пришла не для этого, им свое хочется.
Ну и что? Смысл сервисной архитектуры в том, что она работают даже в неоптимальных организационных условиях. А неоптимальные условия будут в любой большой компании, это просто закон природы такой.
Да, возможно теряем производительность разработчиков за счёт дублирования функционала, но при этом выигрываем время за счёт того, что уменьшаем зависимости между командами.
SD>PS: если что, мой сын тоже ведь считает, что я ему исключительно по идеологическим причинам не даю круглосуточно сидеть в онлайн-играх, жрать чипсы и прочую дрянь. Ужасная идеология! А, вот еще, зубы чистить — ну просто высшее проявление идеологии. Он ведь уже несколько раз проверял, не почистил — ничего не случилось. Зачем вообще чистить, кроме как по идеологическим причинам.
Да, там была примерно та же причина: "Надо чистить зубы, и зубной врач не будет нужен! Потому поддержку зубных больниц мы добавлять не собираемся! И пофиг, что они на практике таки нужны".
Здравствуйте, VladiCh, Вы писали:
S>>Это не maxkar, похоже, путает -- вот тут, по ссылке из ссылки выше, пишут в cons для микросервисов: S>>
S>>But the switch to microservices comes with its fair share of costs, particularly when it comes to app monitoring and the toll it can take on developers. Adopters will have to consider factors such as:
S>> Team expertise: The benefits of microservices are moot without a prepared staff. You should assess the skills of your team members before moving forward with a microservices architecture.
S>> Testing and monitoring: Once you break apps into components, you'll have more moving parts to track and eventually fix. Without the right testing and monitoring tools in place, things could quickly spin out of control.
S>>Можно сказать, что design goal не удался. VC>Для того чтобы перелезть на микросервисную архитектуру, нужна большая подготовительная работа — автоматизация создания этих самых микросервисов и управления ими — с мониторингом, логгингом, алертами, всяческими настройками автоскейлинга и т.п. VC>Это требует интеграции кучи различных систем. Если этого нет и делать это все вручную для каждого микросервиса, то можно во всех этих мелочах закопаться и общий результат будет печален. VC>Поэтому сейчас важность девопсов сильно возросла, потому как крупные компании всю эту работу автоматизируют. VC>Но, если эта автоматизация есть, то с собственно разработчиков микросервисов эта вся нагрузка снимается, им как правило это все настраивать не нужно и оно работает из коробки.
Безусловно, нагрузка деплоймента и прочее code as infrasuructure с разработчика снимается, но как это сказывается
на требованиях и знания, которые я написал выше? Dockerfile писать надо? Надо. Т.е. надо изучать docker. Писать
код, который корректно и грамотно работает с локальным состоянимем, полностью с нуля развитие и поддержка локального
хранилища, а раньше была одна (край две) бд со спец. людьми на них. Теперь изоляция по хранилищу. Т.е. я ни разу
не говорю, что микросервисная арх-ра плоха. Она предъявляет большие требования к квалификации чем
монолит. Что-то стало делать проще, бизнес код стал проще, но у всего есть цена,
всяческих объвязок и прочей инфраструктуры стало больше.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>>>Или нет. S>>Или да. НС>Т.е. аргументов у тебя нет. ЧТД.
Сложно аргументировать "Или нет", тем более если резать по цитатам -- целиком было:
Или да. Сначала пишут манифесты, потом начинается хайп, потом всплывает куча проблем что не всем и не всегда это
надо. Квалификация программистов, оказывается, нужна выше, а не ниже и т.д.
S>>Прежде как, а оно вообще надо? НС>Что вообще надо? Архитектуру какую то? Обычно надо.
Но почему сразу микросервисную?
S>>Допустим, а если разработчики монолита будут думать в терминах api, а не интерфейсов? НС>И как ты это проконтролируешь?
А как в мире разработки ПО что-либо контролируется? CR, wiki.
S >>В чем тогда выгода микросервисов? НС>В том что испохабить всю систему из одного микросервиса намного сложнее, чем из модуля монолита.
В целом справедливо, согласен. Доступность повышается.
НС>>>Почти все это нужно и для монолита. Ты же не сравниваешь всерьез микросервисы с системой, состоящей из одного сервера, надеюсь? S>>В целом сравниваю. НС>Тогда не вижу предмета для разговора.
Хорошо, не одна машина, а 2-3 машины. Что поменяется?
Почему сразу нет? Частный случай из определения по ссылке.
Monolithic software is designed to be self-contained; components of the program are interconnected and interdependent rather than loosely coupled as is the case with modular software programs. In a tightly-coupled architecture, each component and its associated components must be present in order for code to be executed or compiled.
Еще вопрос -- вот у нас монолит, с кучей dll и отличнейший loose coupling, продуманный api, интерфейсы и т.п.
Т.е. один exe и много dll, чем это не микросервисная арх-ра?
S>>Опыт работы над небольшими проектами, группой 2-3 человек, на 1-2 года работы. Иногда группы из 4-5 человек. S>>Взгляд со стороны, а не изнутри. НС>Ну то есть все сервисы исключительно single instance?
По-разному: от ui desktop, до обработчиков в сервиcной арх-ре с rmq. Т.е. экземпляров много (процесса), но машина одна.
Здравствуйте, Sharov, Вы писали:
НС>>Т.е. аргументов у тебя нет. ЧТД.
S>Сложно аргументировать "Или нет"
Аргументировать следовало вот это:
Люди пишут эти манифесты опробовав на маленькой выборке, теоретики типа.
На поверку пока что теоретиком оказался ты, а не они.
S>>>Прежде как, а оно вообще надо? НС>>Что вообще надо? Архитектуру какую то? Обычно надо. S>Но почему сразу микросервисную?
Кто сказал что сразу микросервисную?
S>>>Допустим, а если разработчики монолита будут думать в терминах api, а не интерфейсов? НС>>И как ты это проконтролируешь? S>А как в мире разработки ПО что-либо контролируется?
Ты это серьезно спрашиваешь?
НС>>Тогда не вижу предмета для разговора. S>Хорошо, не одна машина, а 2-3 машины. Что поменяется?
2-3 машины это уже распределенная система.
S>>> Опять же, надо определиться под тем, что называется монолит. Много кода в едином адресном пространстве -- это оно? НС>>Нет. https://whatis.techtarget.com/definition/monolithic-architecture S>Почему сразу нет?
Потому что монолит это про код, а не про количество инстансов.
S>Еще вопрос -- вот у нас монолит, с кучей dll и отличнейший loose coupling, продуманный api, интерфейсы и т.п. S>Т.е. один exe и много dll, чем это не микросервисная арх-ра?
Тем что связность модулей намного выше. Зачем задавать один и тот же вопрос несколько раз, если уже написан ответ?
НС>>Ну то есть все сервисы исключительно single instance? S>По-разному: от ui desktop, до обработчиков в сервиcной арх-ре с rmq. Т.е. экземпляров много (процесса), но машина одна.
Здравствуйте, VladiCh, Вы писали:
VC>Для того чтобы перелезть на микросервисную архитектуру, нужна большая подготовительная работа — автоматизация создания этих самых микросервисов и управления ими — с мониторингом, логгингом, алертами, всяческими настройками автоскейлинга и т.п.
Есть готовые решения. Если нет желания сразу много инвестировать в микросервисную инфраструктуру — тот же istio отличный пример.
Здравствуйте, VladiCh, Вы писали:
VC>Интерфейсы между сервисами как правило никто не рефакторит, просто выкатывают новую версию интерфейса (или новый сервис) для замены старой (старого сервиса). VC>Это во всяком случае более поэтапный и управляемый процесс, чем рефакторинг чего-то в монолите. VC>И я не вижу в чем тут невозможность — такое происходит сплошь и рядом.
Ровно поэтому API между сервисами и не рефакторят, что бесполезно. Выкатишь новую версию, а ресурсов ссадить пользователей со старой силенок не хватит. В результате поддерживаешь две версии непонятно зачем. И я не говорю про более серьезные преобразования, типа объединить два сервиса в один или перенести часть функционала в другой сервис. Ни один вменяемый менеджер не возьмет в свой отдел лишний кусок работы и не отдаст крайне необходимый кусок ресурсов. Поэтому, кстати, архитектура системы и копирует архитектуру организации, как еще во времена Брукса заметили. Мелкие рефакторинги в своей песочнице, пожалуйста, хоть все на хаскель перепишите. А что-то более серьезное завязнет еще на этапе согласования.
Здравствуйте, Ночной Смотрящий, Вы писали:
S>> Т.е. надо изучать docker. НС>Здесь нет специфики микросервисов.
Серьезно, а специфика чего здесь есть? Монолитов?
S>>Писать код, который корректно и грамотно работает с локальным состоянимем, НС>Здесь нет специфики микросервисов.
Как же нет, когда надо писать код так, чтобы можно было как минимум легко перезапустить сервис.
Т.е. не только бизнес логика, а еще специфика окружения -- распределенная система.
S>> полностью с нуля развитие и поддержка локального хранилища, НС>Вообще не понял о чем ты.
На этом форуме писали, что суть микросервисов это изоляция хранилища, как осн. источник связности.
Соотв. каждый микросервис имеет свое хранилище.
S>>Она предъявляет большие требования к квалификации чем монолит. НС>К кому то большие, к кому то меньше. В девопсам большие, к разработчикам меньшие.
К девопсам не то что больше, они появились благодаря этому подходу.
S>> Что-то стало делать проще, бизнес код стал проще НС>Бизнес-код остался таким же. Стал проще код интеграционный.
Почему проще, при монолитах он был сложнее? Бизнес код остался таким же, но писать его надо
с учетом совершенно другой, ненадежной, среды.
S>>, но у всего есть цена, всяческих объвязок и прочей инфраструктуры стало больше. НС>И? Ты к чему ведешь? Что микросервисы не серебряная пуля? Да кто бы сомневался.
Я ни к чему не веду. Мы начали с полярного понимания к требованиям квалификации программистов микросервиса.
Таки требования в случае мс к ним больше.
Здравствуйте, Miroff, Вы писали:
M>Здравствуйте, VladiCh, Вы писали:
VC>>Интерфейсы между сервисами как правило никто не рефакторит, просто выкатывают новую версию интерфейса (или новый сервис) для замены старой (старого сервиса). VC>>Это во всяком случае более поэтапный и управляемый процесс, чем рефакторинг чего-то в монолите. VC>>И я не вижу в чем тут невозможность — такое происходит сплошь и рядом.
M>Ровно поэтому API между сервисами и не рефакторят, что бесполезно. Выкатишь новую версию, а ресурсов ссадить пользователей со старой силенок не хватит.
Это издержки распределенной системы. Но в то же время и ее преимущество — она заставляет делать версионность API. В монолите в теории можно отрефакторить всю систему за раз, но на практике такие идеи заметают под ковер,
потому что любые крупные изменения или останавливают разработку везде, или мерж будет адский и сломает половину системы.
M>В результате поддерживаешь две версии непонятно зачем. И я не говорю про более серьезные преобразования, типа объединить два сервиса в один или перенести часть функционала в другой сервис. Ни один вменяемый менеджер не возьмет в свой отдел лишний кусок работы и не отдаст крайне необходимый кусок ресурсов.
Понятно зачем. Насколько долго будет старая версия жить — ну это уже от конкретного случая зависит и конкретной организации. Если есть политическая воля, про которую выше говорилось... (и тут ее нужно гораздо меньше, чем в случае постоянного контроля за tech debt).
Нужно согласование между всеми командами, в случае их большого количества это непростой процесс, но для этого есть специальные люди.
M>Поэтому, кстати, архитектура системы и копирует архитектуру организации, как еще во времена Брукса заметили.
Это не баг а фича в данном случае. Одна из причин почему вообще микросервисный подход работает.
M>Мелкие рефакторинги в своей песочнице, пожалуйста, хоть все на хаскель перепишите. А что-то более серьезное завязнет еще на этапе согласования.
Ну так... Как я и сказал, это и есть одна из целей — команды получают контроль над изменениями в своих песочницах, хотя бы.
С монолитным подходом этого нет.
Здравствуйте, Sharov, Вы писали:
S>>> Т.е. надо изучать docker. НС>>Здесь нет специфики микросервисов. S>Серьезно, а специфика чего здесь есть? Монолитов?
Здесь специфика современных средств деплоймента. Просто в микросервисах оно критично, а с монолитами еще можно пытаться жить по старинке, с виртуалками. Но, в целом, для новых проектов однозначно следует предпочесть контейнеры, вне зависимости от архитектуры.
S>>>Писать код, который корректно и грамотно работает с локальным состоянимем, НС>>Здесь нет специфики микросервисов. S>Как же нет, когда надо писать код так, чтобы можно было как минимум легко перезапустить сервис.
Возможность перезапуска критична для любой архитектуры, включая монолиты. Тут скорее сервисы позволяют сэкономить, отказавшись от пула воркеров внутри веб-сервера в пользу пула подов. Это упрощает сервис, так как вместо танцев с бубном со всякими внешними средствами хранения стейтов и хаками по запуску фоновых задач у условиях воркера, которого в любой момент может грохнуть веб-сервер мы просто пишем обычное консольное приложение с обычным стейтом, инициализируемым при стартапе.
S>Т.е. не только бизнес логика, а еще специфика окружения -- распределенная система.
Еще раз — распределенная система это не эквивалентное понятие микросервисам. Распределенность диктуется в первую очередь твоими задачами, и если требования по перфу выше того, что способна одна машина — у тебя просто других вариантов нет, при любой архитектуре.
А вот если тебе хватает с запасом одного сервера, и нет никаких требований HA и запрета на даунтайм даже при обновлении версии, то микросервисы точно не для этого кейса. И для маленькой команды на весь продукт микросервисы тоже негодный выбор.
S>>> полностью с нуля развитие и поддержка локального хранилища, НС>>Вообще не понял о чем ты. S>На этом форуме писали, что суть микросервисов это изоляция хранилища,
Не видел такого, чтобы именно суть. Но если писали, то это глупость. Суть микросервисов — выделение сравнительно небольшого функционала в сервис, связанный с остальным функционалом только через REST API (grpc, message bus etc). А изоляция хранилищ уже следствие, так как при расшаривании хранилища между несколькими сервисами между ними появляются плохо контролируемые паразитные связи.
При этом никакого абсолютного запрета нет. Если у тебя уже есть legacy БД с долгой историей разработки, толстым слоем изоляции средствами БД (хранимки и вьюхи) и целой кучей заинтегрированного через нее софта (совершенно типичная ситуация для крупных банков со своими отделами разработки, к примеру), то нужно быть безумцем чтобы пытаться нарезать ее на микрокусочки.
С другой стороны, даже для монолитов, состоящий из пары-тройки типов сервисов взаимодействие через общую БД довольно спорный выбор, так как порождает кучу неожиданных проблем при изменении схемы той БД. У меня прошлый проект как раз и был монолит с тремя типами узлов (и один из типов еще собирался из плагинов, эдаких куберовских подов для бедных). И вот там как раз была интеграция через общую БД. И вот эта интеграция была однозначно одним из основных источников проблем, так что ее долго и больно приходилось изживать.
S>>>Она предъявляет большие требования к квалификации чем монолит. НС>>К кому то большие, к кому то меньше. В девопсам большие, к разработчикам меньшие. S>К девопсам не то что больше, они появились благодаря этому подходу.
Нет. Девопсы появились в основном в связи с усложнением CI и появлением CD.
Из википедии:
In 2009, the first conference named devopsdays was held in Ghent, Belgium. The conference was founded by Belgian consultant, project manager and agile practitioner Patrick Debois.
2009 это самый расцвет SOAP и прочего аналогичного стаффа. А о микросервисах всерьез заговорили где то в районе 2012.
S>>> Что-то стало делать проще, бизнес код стал проще НС>>Бизнес-код остался таким же. Стал проще код интеграционный. S>Почему проще,
Потому что связи проще и беднее. Это вынуждает больше внимания уделять REST API. Как следствие, использовать среднепотолочный REST API сильно проще, чем среднепотолочный языковый фреймворк аналогичной сложности.
S>Бизнес код остался таким же, но писать его надо с учетом совершенно другой, ненадежной, среды.
Монолит точно так же ненадежен, и даже еще менее (ты вот явно не заморачиваешься НА и хелсчеками). ИМХО ты опять путаешь распределенные решения и микросервисы.
Опять же, для совсем ленивых есть istio, который утаскивает все заморочки с ненадежностью типа ретраев на инфраструктурный уровень, оставляя код без этих заморочек.
S>>>, но у всего есть цена, всяческих объвязок и прочей инфраструктуры стало больше. НС>>И? Ты к чему ведешь? Что микросервисы не серебряная пуля? Да кто бы сомневался. S>Я ни к чему не веду. Мы начали с полярного понимания к требованиям квалификации программистов микросервиса. S>Таки требования в случае мс к ним больше.
Ты не смог пока этого доказать. У тебя какое то очень странное понимание того, что требуется именно от программистов в случае микросервисов. В то время как на практике код типичного микросервиса кардинально проще аналогичного модуля монолита, сложность зачастую на уровне студенческого курсового и примерно такие же требования по качеству реализации. Сложность, она не в том чтобы прочитать какой нибудь простенький rest guidlines или прочий толмуд про основные шаблоны микросервисов. Сложность в том чтобы написать простой и качественный код, и вот тут монолиты однозначно в большом проигрыше, просто в силу объема и связности кодовой базы, а так же потенциальным эффектам от проблем в ней. И чем сложнее система в целом, тем больше микросервисы выигрывают в плане требований к квалификации над монолитом.
Здравствуйте, Miroff, Вы писали:
M>Ровно поэтому API между сервисами и не рефакторят, что бесполезно. Выкатишь новую версию, а ресурсов ссадить пользователей со старой силенок не хватит.
Странное заявление. Все зависит от конкретных команд. У нас, к примеру, есть вполне формальная политика в таких ситуациях: в версии А старый интерфейс объявляется deprecated (что приводит к исчезновению из swagger и пометке Obsolete/Deprecated в штатных клиентах). А в следующей мажорной версии API перестает поддерживаться. Это если речь про внутрикластерные API.
С публичными API посложнее, но их обычно сильно меньше. Да и с публичными тоже со временем процесс происходит, достаточно посмотреть на тот же MS, Google или Dropbox. Просто процесс занимает больше времени, 1-2 года обычно.
VC>Рефакторинг всех микросервисов сразу требуется куда реже (если их границы были выбраны правильно изначально).
Что считать рефакторингом?
И где граница работы команды? Вот, скажем, может ли команда выбирать технологии для постройки микросервиса? А до какого уровня? А можно вместо Linux использовать FreeBSD? А вместо виртуалок — bare metal?
Тут-то и находит коса на камень. Оказывается, что в каком-то месте "микросервисы" лежат поверх существующей инфраструктуры. И чем "микрее" сервисы, тем толще получается эта самая "инфра".
Но ведь ей, инфре, тоже нужно развиваться. А для этого нужно и рефакторинг производить. Да, в инфре. Это равносильно рефакторингу всех микросервисов сразу. Я именно про такой рефакторинг, а не когда в каком-то одном микросервисе "рефакторят" MySQL на MariaDB.
VC>Я пока не видел ни одного крупного монолита, который бы развивался > 10 лет и не скатился в УГ. Правда, если честно, микросервисов которые столько бы прожили, тоже пока не видел .
О, золотые слова Как обычно, все упирается не в технологии, а в людей и масштабы.
C>Ну да. А что делать? Хотя бы таким образом этот "важный начальник" ограничен своей песочницей, и не мешает развивать другие проекты. C>Как минимизировать такую ситуацию организационными методами — это уже вопрос для высшего менеджмента. C>Да, возможно теряем производительность разработчиков за счёт дублирования функционала, но при этом выигрываем время за счёт того, что уменьшаем зависимости между командами.
То есть с помощью микросервисов можно "масштабировать компанию". Но не в плане возможностей. А всего лишь в количестве наемных работников, суть расходов на R&D. Сам продукт при этом поначала будет развиваться быстрее. Это факт, ибо развитие идет в долг (создаются копии, параллельные сервисы, дубликаты инфры и т.п.). Но потом наступает довольно резкая остановка в развитии, потому что система превращается в распределенный монолит, который развивать становится еще сложнее. И вот тогда-то приходят молодые конкуренты, которые пока еще на предыдущей стадии ("резкий рост").
Да, знакомо.
Но называть это "правильным" или "хорошим" подходом я бы не стал.
M>Ровно поэтому API между сервисами и не рефакторят, что бесполезно. Выкатишь новую версию, а ресурсов ссадить пользователей со старой силенок не хватит. В результате поддерживаешь две версии непонятно зачем.
Именно так все и происходит
Разве что найдутся в компании герои, которые по сути пожертвуют себя ради вычистки конюшен, просто из чувства прекрасного. Но — только один раз, потому что будучи похлопанными по плечу "ма-ла-дец" за совершенный подвиг, но никак не будучи за это вознагражденными, такие герои теряют мотивацию и больше не совершают подвиги (собсно, то самое "выгорание", когда человек старался, стремился, шел — получил пшик и огорчился).
НС>Опять же, для совсем ленивых есть istio, который утаскивает все заморочки с ненадежностью типа ретраев на инфраструктурный уровень, оставляя код без этих заморочек.
Сильное заявление. Сами по себе "ретраи" то еще зло. Работоспособное только в случае идемпотентных изменений или linearisability.
Здравствуйте, SkyDance, Вы писали:
C>>Да, возможно теряем производительность разработчиков за счёт дублирования функционала, но при этом выигрываем время за счёт того, что уменьшаем зависимости между командами. SD>То есть с помощью микросервисов можно "масштабировать компанию". Но не в плане возможностей. А всего лишь в количестве наемных работников, суть расходов на R&D.
В плане возможностей тоже. В качестве примера — практически все облачные провайдеры.
Например, ядро AWS переписали с монолита на сервисную систему. С тех пор количество новых фич и улучшение текущих зашкаливает, даже следить сложно.
SD>Сам продукт при этом поначала будет развиваться быстрее. Это факт, ибо развитие идет в долг (создаются копии, параллельные сервисы, дубликаты инфры и т.п.). Но потом наступает довольно резкая остановка в развитии, потому что система превращается в распределенный монолит, который развивать становится еще сложнее. И вот тогда-то приходят молодые конкуренты, которые пока еще на предыдущей стадии ("резкий рост").
При хорошем управлении, количество дубликатов остаётся небольшим.
SD>Но называть это "правильным" или "хорошим" подходом я бы не стал.
А других нет.
Здравствуйте, SkyDance, Вы писали:
НС>>Опять же, для совсем ленивых есть istio, который утаскивает все заморочки с ненадежностью типа ретраев на инфраструктурный уровень, оставляя код без этих заморочек. SD>Сильное заявление. Сами по себе "ретраи" то еще зло. Работоспособное только в случае идемпотентных изменений или linearisability.
"Вы ещё делаете неидемпотентное API? Тогда мы идём к вам!"
Здравствуйте, SkyDance, Вы писали:
VC>>Рефакторинг всех микросервисов сразу требуется куда реже (если их границы были выбраны правильно изначально). SD>Что считать рефакторингом?
Что-то, что влияет на все сервисы.
SD>И где граница работы команды? Вот, скажем, может ли команда выбирать технологии для постройки микросервиса? А до какого уровня? А можно вместо Linux использовать FreeBSD? А вместо виртуалок — bare metal?
Зависит от конкретной компании, но в теории нет ничего, что этому бы препятствовало. Сервис общается с внешним миром миром через чётко определённый интерфейс, а как он внутри реализован — дело конкретной команды.
Простор воображения будет ограничен только общекорпоративными стандартами.
SD>Тут-то и находит коса на камень. Оказывается, что в каком-то месте "микросервисы" лежат поверх существующей инфраструктуры. И чем "микрее" сервисы, тем толще получается эта самая "инфра".
Не особо. Я вообще не люблю слово "микросервис" — так как реально всегда получается "сервис" (без "микро-").
SD>Но ведь ей, инфре, тоже нужно развиваться. А для этого нужно и рефакторинг производить. Да, в инфре.
И что? Инфраструктура для сервисов — это всякая аутентификация/авторизация, роутинг и метрики/логи. Всё это прекрасно обновляется.
Например, в AWS делали рефакторинг авторизации — переходили на "service linked role" вместо "injection token" во всех внутренних сервисах. Это делалось так:
1. Принимается решение на высшем уровне о том, что переход нужен. Это решение доводится до всех в виде обязательных OKR.
2. Команда, поддерживающая старый механизм, делает "отчёт позора" со списком клиентов, вызывающий старый API. Этот отчёт каждую неделю отсылается в рассылку для менеджеров.
3. Все постепенно переходят на новый механизм. После исчезновения всех своих сервисов из "отчёта позора", каждая команда устраивает праздник с пиццей и пивом.
4. За полгода до окончания срока, все менеджеры сервисов из "отчёта позора" приглашаются на профилактические мероприятия к высшему менеджменту.
5. Каждый месяц профилактические мероприятия становятся всё строже.
6. Успех.
ЧСХ, в монолитах большой рефакторинг происходит примерно аналогичным образом.
Здравствуйте, SkyDance, Вы писали:
VC>>Рефакторинг всех микросервисов сразу требуется куда реже (если их границы были выбраны правильно изначально).
SD>Что считать рефакторингом?
Точно не смену инфраструктуры. Инфраструктура — это часть изначального дизайна
SD>И где граница работы команды? Вот, скажем, может ли команда выбирать технологии для постройки микросервиса? А до какого уровня? А можно вместо Linux использовать FreeBSD? А вместо виртуалок — bare metal? SD>Тут-то и находит коса на камень. Оказывается, что в каком-то месте "микросервисы" лежат поверх существующей инфраструктуры. И чем "микрее" сервисы, тем толще получается эта самая "инфра".
Непонятно в чем тут сложности с поэтапным переездом на новую инфраструктуру Смена Linux на FreeBSD или виртуалок на bare metal для приложения может быть вообще прозрачной, в зависимости от дизайна этого приложения.
SD>Но ведь ей, инфре, тоже нужно развиваться. А для этого нужно и рефакторинг производить. Да, в инфре. Это равносильно рефакторингу всех микросервисов сразу. Я именно про такой рефакторинг, а не когда в каком-то одном микросервисе "рефакторят" MySQL на MariaDB.
Приведи конкретный пример когда это создаст необходимость рефакторинга всех микросервисов сразу и этого нельзя будет избежать.
C>С тех пор количество новых фич и улучшение текущих зашкаливает, даже следить сложно.
Это потому, что фичи стали микроскопические. Примерно как SEO-странички, раньше обзор был из одной длинной страницы, теперь же 12 коротеньких.
C>При хорошем управлении, количество дубликатов остаётся небольшим.
Возвращаемся к вопросу о "политической воле". Собственно, в нее, волю, все всегда и упирается.
Здравствуйте, SkyDance, Вы писали:
M>>Ровно поэтому API между сервисами и не рефакторят, что бесполезно. Выкатишь новую версию, а ресурсов ссадить пользователей со старой силенок не хватит. В результате поддерживаешь две версии непонятно зачем.
SD>Именно так все и происходит
SD>Разве что найдутся в компании герои, которые по сути пожертвуют себя ради вычистки конюшен, просто из чувства прекрасного. Но — только один раз, потому что будучи похлопанными по плечу "ма-ла-дец" за совершенный подвиг, но никак не будучи за это вознагражденными, такие герои теряют мотивацию и больше не совершают подвиги (собсно, то самое "выгорание", когда человек старался, стремился, шел — получил пшик и огорчился).
Происходит по-разному, зависит от той самой "политической воли", потому как переход требует ресурсов (т.е. денег), эти ресурсы должны быть запланированы, выделены и учтены корпоративной бюрократией.
Соответственно пендель должен быть дан с более высокого уровня. Когда он есть в наличии, то все крутится, работает и апгрейдится на новую версию. Если его нет — ну тогда на верхнем уровне пофигу на это, и пендель может прийти
от кого-то еще выше уровнем. А если они там все мух не ловят, ну значит так им и надо, получат в результате свалку мусора в API рано или поздно.
C>Зависит от конкретной компании, но в теории нет ничего, что этому бы препятствовало. Сервис общается с внешним миром миром через чётко определённый интерфейс, а как он внутри реализован — дело конкретной команды. C>Простор воображения будет ограничен только общекорпоративными стандартами.
Кто-то же должен реализовывать эти "общекорпоративные стандарты". Вот это я и называют "инфраструктура". Поддерживать эту инфраструктуру для микросервисов куда сложнее, чем для монолитов, потому что для каждого сервиса — свои погремушки, свои deprecation schedule и все прочее. Рефакторинг чего-то в инфре и выливается в жуткую головную боль.
C>И что? Инфраструктура для сервисов — это всякая аутентификация/авторизация, роутинг и метрики/логи. Всё это прекрасно обновляется. C>Например, в AWS делали рефакторинг авторизации — переходили на "service linked role" вместо "injection token" во всех внутренних сервисах. Это делалось так:
Дай угадаю, тебе не приходилось долго работать в инфраструктуре. Конечно, тем кто не работает над инфрой, все видится как "просто и прекрасно". И даже процесс перехода с "А" на "Б", видится безоблачным:
C>1. Принимается решение на высшем уровне о том, что переход нужен. Это решение доводится до всех в виде обязательных OKR.
Ха. Это было б счастьем, коли такое бы существовало. Но в реальности основной головняк инфра-команды идет _ДО_ того, как "решение на высшем уровне" принимается. Собственно, айсберг как раз там, в том, чтобы вообще сдвинуть эту гору, и заставить принять официальное решение. Особенно если менеджмент не понимает, о чем идет речь. И совсем уж тяжело если эта инициатива идет снизу (от тех же инфра-команд, которым приходится поддерживать этот зоопарк).
C>3. Все постепенно переходят на новый механизм. После исчезновения всех своих сервисов из "отчёта позора", каждая команда устраивает праздник с пиццей и пивом.
Это в теории, а на практике, у каждой команды возникает своя отписка из серии "у нас другие приоритеты", "у нас нет ресурство" и т.п..
C>5. Каждый месяц профилактические мероприятия становятся всё строже. C>6. Успех.
В теории так, но на практике все упирается в post-completion error, когда все вроде бы доложили "мы перешли!", но старый сервис удалить нельзя, т.к. где-то там остались какие-то легаси системы, и никто не работает над их выкашиванием из прода. Часто случается, что менеджменту доложили "мы все сделали", те далее по цепочке передали до самого верха, где решение принималось. А то, что на самом деле старая система никуда не делась, менеджменту проверить уже нет возможностей, слишком уж менеджмент удален от тех, кто работает в поле.
VC>Точно не смену инфраструктуры. Инфраструктура — это часть изначального дизайна
Ха. То есть давайте самую сложную часть системы назовем "инфраструктурой" и заметем проблему туда, под коврик. Пусть другие мучаются с монолитом инфраструктуры, зато у нас все хорошо с микросервисами.
Хорошо бы, конечно. Но это ж какие должны умы работать в той самой инфраструктуре.
VC>Непонятно в чем тут сложности с поэтапным переездом на новую инфраструктуру Смена Linux на FreeBSD или виртуалок на bare metal для приложения может быть вообще прозрачной, в зависимости от дизайна этого приложения.
Сам процесс поэтапного переезда и есть проект высочайшей сложности, ничуть не отличающийся от рефакторинга монолита. В конечном счете что монолит могут рефакторить только избранные Нео, что переделывать инфраструктуру в понимании микросервисов.
Иногда еще эту инфраструктуру называют "платформой". И там нужны самые сильные кадры. Вот только где ж их взять, да еще удержать от rage quit, когда очередной раз в инфраструктуру сваливаются "перламутровые пуговицы", которые кто-то из работающих над микросервисами выкатил как "очередной прорывный фреймворк".
VC>Происходит по-разному, зависит от той самой "политической воли"
Думаю, на этом и сойдемся
Монолит, микросервисы... как в "Армаггедоне", "Русская электроника, американская электроника... все сделано на Тайване!"
В конечном итоге "быстрое движение" всегда наблюдается в долг. Переход от одной схемы к другой (разнесение на сервисвы) — когда тот самый долг чутка отдали, а значит, можно снова двинуться вперед с высокой скоростью. И дело не в переходе с монолита на микросервисы, а просто в том, что возникла политическая сила этот технический долг вернуть. Под соусом ли перехода на сервисы, или как-то иначе, уже не критично.
Здравствуйте, SkyDance, Вы писали:
VC>>Точно не смену инфраструктуры. Инфраструктура — это часть изначального дизайна
SD>Ха. То есть давайте самую сложную часть системы назовем "инфраструктурой" и заметем проблему туда, под коврик. Пусть другие мучаются с монолитом инфраструктуры, зато у нас все хорошо с микросервисами. SD>Хорошо бы, конечно. Но это ж какие должны умы работать в той самой инфраструктуре.
Большинство компаний сейчас не держит своей инфраструктуры как таковой, аутсорсит ее в какой-нибудь AWS или там GCP — пусть у них голова болит.
Ну во всяком случае нижний уровень этой инфраструктуры. Все что поверх этого это уже чем девопсы занимаются — развертывание, масштабирование, обвязка всякими логгингами, трейсингами, мониторингами и проч.
VC>>Непонятно в чем тут сложности с поэтапным переездом на новую инфраструктуру Смена Linux на FreeBSD или виртуалок на bare metal для приложения может быть вообще прозрачной, в зависимости от дизайна этого приложения.
SD>Сам процесс поэтапного переезда и есть проект высочайшей сложности, ничуть не отличающийся от рефакторинга монолита. В конечном счете что монолит могут рефакторить только избранные Нео, что переделывать инфраструктуру в понимании микросервисов. SD>Иногда еще эту инфраструктуру называют "платформой". И там нужны самые сильные кадры. Вот только где ж их взять, да еще удержать от rage quit, когда очередной раз в инфраструктуру сваливаются "перламутровые пуговицы", которые кто-то из работающих над микросервисами выкатил как "очередной прорывный фреймворк".
Пример плиз... Что за проекты высочайшей сложности от рефакторинга инфраструктуры (рефакторинг инфраструктуры это оксюморон какой-то как по мне).
Если речь вообще про смену скажем одной облачной инфраструктуры на другую — это понятно, но это уже не рефакторинг ни в каком виде.
Это аналог фактически переписывания системы с нуля, в большинстве случаев. Ну и подобные переезд будет одинаково неподъемен что для микросервисов что для монолита.
Здравствуйте, SkyDance, Вы писали:
VC>>Происходит по-разному, зависит от той самой "политической воли"
SD>Думаю, на этом и сойдемся
SD>Монолит, микросервисы... как в "Армаггедоне", "Русская электроника, американская электроника... все сделано на Тайване!"
SD>В конечном итоге "быстрое движение" всегда наблюдается в долг. Переход от одной схемы к другой (разнесение на сервисвы) — когда тот самый долг чутка отдали, а значит, можно снова двинуться вперед с высокой скоростью. И дело не в переходе с монолита на микросервисы, а просто в том, что возникла политическая сила этот технический долг вернуть. Под соусом ли перехода на сервисы, или как-то иначе, уже не критично.
Скорее не "долг отдали", а ввели законы, запрещающие давать в долг под процент выше фиксированного .
Здравствуйте, Cyberax, Вы писали:
C>Например, ядро AWS переписали с монолита на сервисную систему. С тех пор количество новых фич и улучшение текущих зашкаливает, даже следить сложно.
А как планировали жить с этим монолитом с самого начала интересно? Т.е. n-ое количество крутых серверов для HA?
VC>Большинство компаний сейчас не держит своей инфраструктуры как таковой, аутсорсит ее в какой-нибудь AWS или там GCP — пусть у них голова болит.
В таком варианте принимается. Только надо понимать, во сколько это все обходится. Я тут как раз сейчас должен занимается чем-то подобным, и маржа на этом самом "аутсорсинге" очень впечатляет. Нормальная такая пратика, нарезАть серверы за $400/мес по 32 пода, и каждый продавать поа по $60/мес (дешевые DigitalOcean) или ~$120/мес (AWS).
VC>Ну во всяком случае нижний уровень этой инфраструктуры. Все что поверх этого это уже чем девопсы занимаются — развертывание, масштабирование, обвязка всякими логгингами, трейсингами, мониторингами и проч.
Теперь представь, что какой-то особо ретивый инженер заявил "а я свой микросервис хочу писать на расте, делайте мне развертывание, масштабирование, и прочие логгинги, а еще не забудьте про удобства разработки". Ну ладно, одного-то может просто лесом пошлют. Но теперь представь, завтра приходят и говорят "мы тут купили стартам рога-и-копыта, у него классный продукт, который дубликат нашего, но на другом стеке, сделайте интеграцию, и чтоб ничего не сломалось".
И так каждые 3-4 месяца.
VC>Пример плиз... Что за проекты высочайшей сложности от рефакторинга инфраструктуры (рефакторинг инфраструктуры это оксюморон какой-то как по мне).
Один пример — переезд с bare metal и как следует оптимизированного софта для вполне конкретного metal на некую generic cloud provider infra. Хотя, эх, если б на generic, а то ведь чаще всего не на generic, а "вот ту, на которую у нас есть лицензия, и которую мы уже оплачиваем".
VC>Если речь вообще про смену скажем одной облачной инфраструктуры на другую — это понятно, но это уже не рефакторинг ни в каком виде. VC>Это аналог фактически переписывания системы с нуля, в большинстве случаев. Ну и подобные переезд будет одинаково неподъемен что для микросервисов что для монолита.
Ну что ж, даже не знаю, то ли плакать с горя, то ли от гордости раздуться, ибо как раз подобными вещами и приходилось заниматься.
VC>Скорее не "долг отдали", а ввели законы, запрещающие давать в долг под процент выше фиксированного .
Нет-нет, именно что "долг отдали".
Сначала набрали много в долг (наделали "макаронных связей" в монолите).
Потом решили перебраться на микросервисы, и в процессе этого переезда, само собой, вынуждены были эти API привести в сколь-нибудь подобие порядка (то бишь отдали тех. долг — в этом, собственно, и состоит force function микросервисов).
Затем с новыми силами говнокодили ускоренно развивали продукт.
На выходе — распределенный монолит. Даже более сложная схема, чем просто монолит.
Скрытый текст
На этом месте неплохо бы зайти на очередной виток спирали, с еще более новым баззвордом, ценность которого, как обычно, будет заключаться в вызове необходимой "политической воли" для возврата хотя бы части тех. долга. Кто готов придумать термин? Такая ведь отличная возможность вписать имя в историю.
Что будет после микросервисов?
Если что, service mesh не считается, я бы вообще это называть service spaghetti. Ибо mesh ведь и есть спагетти.
Здравствуйте, Sharov, Вы писали:
C>>Например, ядро AWS переписали с монолита на сервисную систему. С тех пор количество новых фич и улучшение текущих зашкаливает, даже следить сложно. S>А как планировали жить с этим монолитом с самого начала интересно? Т.е. n-ое количество крутых серверов для HA?
Ага. В одном большом проекте был маршрутизатор, система защиты от DDoS, и реализация некоторых сервисов. Оно работало в нескольких режимах на кластерах.
Ошибку такого подхода поняли достаточно быстро, но полный переход на сервисы занял что-то около 10 лет.
Здравствуйте, SkyDance, Вы писали:
SD>Теперь представь, что какой-то особо ретивый инженер заявил "а я свой микросервис хочу писать на расте, делайте мне развертывание, масштабирование, и прочие логгинги, а еще не забудьте про удобства разработки". Ну ладно, одного-то может просто лесом пошлют. Но теперь представь, завтра приходят и говорят "мы тут купили стартам рога-и-копыта, у него классный продукт, который дубликат нашего, но на другом стеке, сделайте интеграцию, и чтоб ничего не сломалось".
Ну вот я прямо недавно этим занимался из-за вот этого: https://www.renewableenergyworld.com/solar/aurora-solar-strengthens-commercial-offering-with-acquisition-of-helioscope/#gref
Совсем разные стеки, но у обоих компаний сервисная архитектура. Так что замена системы управления журналами, распределённой трассировки, миграция БД и прочее заключалась просто в большом количестве исправлений в конфигах.
SD>Один пример — переезд с bare metal и как следует оптимизированного софта для вполне конкретного metal на некую generic cloud provider infra. Хотя, эх, если б на generic, а то ведь чаще всего не на generic, а "вот ту, на которую у нас есть лицензия, и которую мы уже оплачиваем".
Ну значит, не надо такой софт использовать.
Здравствуйте, SkyDance, Вы писали:
C>>С тех пор количество новых фич и улучшение текущих зашкаливает, даже следить сложно. SD>Это потому, что фичи стали микроскопические. Примерно как SEO-странички, раньше обзор был из одной длинной страницы, теперь же 12 коротеньких.
Хм. Нет. См.: EFS, например. Или Serverless DB.
C>>При хорошем управлении, количество дубликатов остаётся небольшим. SD>Возвращаемся к вопросу о "политической воле". Собственно, в нее, волю, все всегда и упирается.
Да. Но в монолите никакая воля не спасает.
Здравствуйте, SkyDance, Вы писали:
C>>Простор воображения будет ограничен только общекорпоративными стандартами. SD>Кто-то же должен реализовывать эти "общекорпоративные стандарты". Вот это я и называют "инфраструктура". Поддерживать эту инфраструктуру для микросервисов куда сложнее, чем для монолитов, потому что для каждого сервиса — свои погремушки, свои deprecation schedule и все прочее. Рефакторинг чего-то в инфре и выливается в жуткую головную боль.
С точностью до "наоборот". В монолите, обычно, инфраструктура очень странная, так как его изначально делают как "уникальную снежинку".
C>>Например, в AWS делали рефакторинг авторизации — переходили на "service linked role" вместо "injection token" во всех внутренних сервисах. Это делалось так: SD>Дай угадаю, тебе не приходилось долго работать в инфраструктуре. Конечно, тем кто не работает над инфрой, все видится как "просто и прекрасно".
Мимо. Я вообще почти всю профессиональную жизнь занимаюсь инфраструктурой.
SD>Ха. Это было б счастьем, коли такое бы существовало. Но в реальности основной головняк инфра-команды идет _ДО_ того, как "решение на высшем уровне" принимается. Собственно, айсберг как раз там, в том, чтобы вообще сдвинуть эту гору, и заставить принять официальное решение. Особенно если менеджмент не понимает, о чем идет речь. И совсем уж тяжело если эта инициатива идет снизу (от тех же инфра-команд, которым приходится поддерживать этот зоопарк).
Ну так и в монолите будет точно так же. Менеджмент в любом случае нужен.
C>>3. Все постепенно переходят на новый механизм. После исчезновения всех своих сервисов из "отчёта позора", каждая команда устраивает праздник с пиццей и пивом. SD>Это в теории, а на практике, у каждой команды возникает своя отписка из серии "у нас другие приоритеты", "у нас нет ресурство" и т.п..
Необходимость соблюдать общие OKR донесут во время профилактических мероприятий. После чего приоритеты ВНЕЗАПНО меняются.
C>>5. Каждый месяц профилактические мероприятия становятся всё строже. C>>6. Успех. SD>В теории так, но на практике все упирается в post-completion error, когда все вроде бы доложили "мы перешли!", но старый сервис удалить нельзя, т.к. где-то там остались какие-то легаси системы, и никто не работает над их выкашиванием из прода.
Эти сервисы передаются тем, кто компетентен. Менеджеры, которые получили повышения из команды этих сервисов, получают втык.
Тут как раз всё очень просто. Есть сервис, его авторы известны. Так что нет никаких оправданий вида: "а мы эти классы не писали, это команда XXXXX всё виновата, мы их просто потом доработали".
SD>Часто случается, что менеджменту доложили "мы все сделали", те далее по цепочке передали до самого верха, где решение принималось. А то, что на самом деле старая система никуда не делась, менеджменту проверить уже нет возможностей, слишком уж менеджмент удален от тех, кто работает в поле.
То есть? Отчёт есть. Он простой и объективный, так что и OKR получается простой и бинарный. Высший менеджмент прекрасно такие вещи понимает.
Здравствуйте, SkyDance, Вы писали:
VC>>Большинство компаний сейчас не держит своей инфраструктуры как таковой, аутсорсит ее в какой-нибудь AWS или там GCP — пусть у них голова болит.
SD>В таком варианте принимается. Только надо понимать, во сколько это все обходится. Я тут как раз сейчас должен занимается чем-то подобным, и маржа на этом самом "аутсорсинге" очень впечатляет. Нормальная такая пратика, нарезАть серверы за $400/мес по 32 пода, и каждый продавать поа по $60/мес (дешевые DigitalOcean) или ~$120/мес (AWS).
Все равно выходит дешевле чем держать собственную инфраструктуру, до определенных, довольно крупных, масштабов. Слишком высоки фиксированные затраты, и по деньгам и по времени, а нужно это все как правило здесь и сейчас.
VC>>Ну во всяком случае нижний уровень этой инфраструктуры. Все что поверх этого это уже чем девопсы занимаются — развертывание, масштабирование, обвязка всякими логгингами, трейсингами, мониторингами и проч.
SD>Теперь представь, что какой-то особо ретивый инженер заявил "а я свой микросервис хочу писать на расте, делайте мне развертывание, масштабирование, и прочие логгинги, а еще не забудьте про удобства разработки". Ну ладно, одного-то может просто лесом пошлют. Но теперь представь, завтра приходят и говорят "мы тут купили стартам рога-и-копыта, у него классный продукт, который дубликат нашего, но на другом стеке, сделайте интеграцию, и чтоб ничего не сломалось".
SD>И так каждые 3-4 месяца.
Одного то пошлют безусловно. И команду пошлют. Если купили стартап, тут конечно деваться некуда, будут интегрировать. И потом настойчиво пинать чтобы постепенно переезжали на основной стек, потому как дополнительные риски связанные с поддержкой этого добра.
VC>>Пример плиз... Что за проекты высочайшей сложности от рефакторинга инфраструктуры (рефакторинг инфраструктуры это оксюморон какой-то как по мне).
SD>Один пример — переезд с bare metal и как следует оптимизированного софта для вполне конкретного metal на некую generic cloud provider infra. Хотя, эх, если б на generic, а то ведь чаще всего не на generic, а "вот ту, на которую у нас есть лицензия, и которую мы уже оплачиваем".
Здесь-то как раз не должно быть больших проблем, так как нет архитектурной завязки на сервисы конкретного клауд провайдера.
Любые провайдеры предоставляют и bare metal тоже, так что физически перетащить и потом адаптировать к новой инфраструктуре можно постепенно.
VC>>Если речь вообще про смену скажем одной облачной инфраструктуры на другую — это понятно, но это уже не рефакторинг ни в каком виде. VC>>Это аналог фактически переписывания системы с нуля, в большинстве случаев. Ну и подобные переезд будет одинаково неподъемен что для микросервисов что для монолита.
SD>Ну что ж, даже не знаю, то ли плакать с горя, то ли от гордости раздуться, ибо как раз подобными вещами и приходилось заниматься.
Я больше думал про миграцию наоборот — с клауд провайдера или на другого клауд провайдера, или на bare metal — вот здесь можно наесться по самые помидоры,
если уже прилично завязан архитектурно на сервисы текущего провайдера.
Здравствуйте, SkyDance, Вы писали:
VC>>Скорее не "долг отдали", а ввели законы, запрещающие давать в долг под процент выше фиксированного .
SD>Нет-нет, именно что "долг отдали". SD>Сначала набрали много в долг (наделали "макаронных связей" в монолите). SD>Потом решили перебраться на микросервисы, и в процессе этого переезда, само собой, вынуждены были эти API привести в сколь-нибудь подобие порядка (то бишь отдали тех. долг — в этом, собственно, и состоит force function микросервисов). SD>Затем с новыми силами говнокодили ускоренно развивали продукт.
Если бы просто отдали — это не так интересно. Интересно чтобы новая архитектура препятствовала накоплению нового тех долга (что микросервисы в какой-то степени и делают, и что я и имел в виду сказав про "запрет давать в долг").
SD>На выходе — распределенный монолит. Даже более сложная схема, чем просто монолит.
Ну это не обязательно, чтоб распределенный монолит получить это еще постараться надо. Это как — сервисы завязаны один на другой и не могут деплоиться независимо?
Разные сервисы работают с одной и тем же слоем хранения? Ну как бы сделать то такое конечно можно, но кто в здравом уме будет?
SD>[cut] SD>На этом месте неплохо бы зайти на очередной виток спирали, с еще более новым баззвордом, ценность которого, как обычно, будет заключаться в вызове необходимой "политической воли" для возврата хотя бы части тех. долга. Кто готов придумать термин? Такая ведь отличная возможность вписать имя в историю. SD>Что будет после микросервисов?
Здравствуйте, SkyDance, Вы писали:
SD>Что считать рефакторингом?
code refactoring is the process of restructuring existing computer code—changing the factoring—without changing its external behavior.
SD>И где граница работы команды?
Какой команды?
SD> Вот, скажем, может ли команда выбирать технологии для постройки микросервиса? А до какого уровня? А можно вместо Linux использовать FreeBSD?
Контейнеры же.
SD> А вместо виртуалок — bare metal?
С кубером это не особо совместимо, а остальные оркестраторы, даже если кто то из них умеет управлять голым железом, медленно и стабильно сползают в маргинальщину.
SD>Но ведь ей, инфре, тоже нужно развиваться. А для этого нужно и рефакторинг производить. Да, в инфре. Это равносильно рефакторингу всех микросервисов сразу.
Далеко не всегда. И это, чаще всего, либо вообще не затрагивает код и команды, его пишущие, либо затрагивает слабо.
SD>О, золотые слова Как обычно, все упирается не в технологии, а в людей и масштабы.
Упирается и в технологии, и в людей, и в кучу чего еще, и оно все между собой сильно связано. А логика "раз у нас с людьми есть проблемы мы положим на технологии болт" работает фигово.
Здравствуйте, Sharov, Вы писали:
S>Serverless, это разве не оно?
Нет, не оно. Это ортогональное понятие. Serverless вполне себе работает вместе с микросервисами. В том же ажуре кластер AKS вполне может выделять и классические виртуалки под ноды, и использовать ACI.
Здравствуйте, SkyDance, Вы писали:
SD>То есть с помощью микросервисов можно "масштабировать компанию". Но не в плане возможностей. А всего лишь в количестве наемных работников, суть расходов на R&D.
Это ты, фактически, процитировал определение микросервисов. С этим кроме Sharov кто то тут не согласен?
SD> Сам продукт при этом поначала будет развиваться быстрее. Это факт, ибо развитие идет в долг (создаются копии, параллельные сервисы, дубликаты инфры и т.п.). Но потом наступает довольно резкая остановка в развитии,
Ровно как и в случае монолита. Причем в микросервисах эта остановка наступает позднее. Ценой того, что само развитие идет заметно медленее монолита.
SD> потому что система превращается в распределенный монолит
Это почему вдруг она обязана превратиться в монолит? При соблюдении ряда базовых принципов этого не должно происходить.
Здравствуйте, SkyDance, Вы писали:
SD>Ха. То есть давайте самую сложную часть системы назовем "инфраструктурой"
Вот так, без каких то уточнений, это крайне спорное заявление. В текущем проекте, к примеру, инфраструктура отъедает процентов 10-15 общих ресурсов на разработку. И, что интересно, после релиза эта доля довольно активно начинает сокращаться.
SD> и заметем проблему туда, под коврик.
Никто ее не заметает. Еще раз — микросервисы это про разделение компетенций. В микросервисах инфраструктурой занимаются не авторы сервисов и даже не программисты, а специальные люди со специфической компетенцией — девопсы.
А вот если посадить заниматься инфрой программистов — тут да, легко можно потратить на нее больше половины разработки.
SD>Сам процесс поэтапного переезда и есть проект высочайшей сложности
Он может и высочайшей, но по этому пути уже многие прошли, и повторяемость решений там намного выше реюза в коде.
SD>Иногда еще эту инфраструктуру называют "платформой".
Никогда не слышал. Платформой обычно обзывают код и базовый слой библиотек и сервисов (что то типа SDK). А инфраструктура это оркестратор и сервисы, создаваемые вне собственных команд.
SD> И там нужны самые сильные кадры.
Нужны. Поэтому средняя зарплата девопса выше средней зарплаты программиста. Но девопсов нужно сильно меньше (при достаточном размере проекта, разумеется).
Здравствуйте, SkyDance, Вы писали:
SD>Нормальная такая пратика, нарезАть серверы за $400/мес по 32 пода, и каждый продавать поа по $60/мес (дешевые DigitalOcean) или ~$120/мес (AWS).
Тарифицируются обычно не поды, а ноды (в serverless некие попугаи CPU). Количество нод определяется не количеством подов, а нагрузкой. А сколько там подов ты на одну ноду взгромоздишь — неважно, главное лимиты правильно выставить.
SD>Теперь представь, что какой-то особо ретивый инженер заявил "а я свой микросервис хочу писать на расте, делайте мне развертывание, масштабирование, и прочие логгинги,
И при чем тут раст? От ретивого инженера требуется не раст, а готовый контейнер. А уж как он его соберет — его личные половые трудности.
Здравствуйте, Ночной Смотрящий, Вы писали:
SD>> А вместо виртуалок — bare metal? НС>С кубером это не особо совместимо
Всё вполне совместимо. Видел реализованную на K8s систему, где внутри контейнеров запускаются вложенные виртуалки. Работает поверх того самого bare metal.
Выглядит немного странно, но с задачей справляется.
Здравствуйте, Ночной Смотрящий, Вы писали:
SD>>То есть с помощью микросервисов можно "масштабировать компанию". Но не в плане возможностей. А всего лишь в количестве наемных работников, суть расходов на R&D. НС>Это ты, фактически, процитировал определение микросервисов. С этим кроме Sharov кто то тут не согласен?
С чем конкретно я не согласен и спорю помимо требований к квалификации к разработчикам микросервисов?
Здравствуйте, VladiCh, Вы писали:
VC>Ну это не обязательно, чтоб распределенный монолит получить это еще постараться надо. Это как — сервисы завязаны один на другой и не могут деплоиться независимо? VC>Разные сервисы работают с одной и тем же слоем хранения? Ну как бы сделать то такое конечно можно, но кто в здравом уме будет?
Ну все сервисы зависят от авторизации например, и без этого сервиса ничего работать не будет. Также и возможны некоторые бизнес
зависимости, т.е. доменные зависимости, которые и на уровне микросервисов сохраняются. Вот и распределенный монолит.
Здравствуйте, Sharov, Вы писали:
SD>>>То есть с помощью микросервисов можно "масштабировать компанию". Но не в плане возможностей. А всего лишь в количестве наемных работников, суть расходов на R&D. НС>>Это ты, фактически, процитировал определение микросервисов. С этим кроме Sharov кто то тут не согласен? S>С чем конкретно я не согласен и спорю
С определением.
Люди пишут эти манифесты опробовав на маленькой выборке, теоретики типа.
Здравствуйте, Cyberax, Вы писали:
НС>>С кубером это не особо совместимо C>Всё вполне совместимо. Видел реализованную на K8s систему, где внутри контейнеров запускаются вложенные виртуалки. Работает поверх того самого bare metal. C>Выглядит немного странно, но с задачей справляется.
Да понятно что напильником можно доточить. Но это, мягко говоря, не самое распространенное решение.
Здравствуйте, Sharov, Вы писали:
S>Ну все сервисы зависят от авторизации например, и без этого сервиса ничего работать не будет.
Совсем не обязательно. Иногда внутри кластера DMZ, так что аутентификация нужна только внешним сервисам. А внешние сервисы иногда в одном экземпляре, например используется API Gateway. Так что вся эта аутентификационная шняга касается только одного сервиса в системе.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>С определением. НС>
НС>Люди пишут эти манифесты опробовав на маленькой выборке, теоретики типа.
Это естественно, т.к. сначала появилась концепция, потом началось внедрение. Испытателей концепции было немного,
по сравнение с общим числом компаний и бизнесов. Это факт. А вообще спор начался из-за требований к квалификации.
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Ну все сервисы зависят от авторизации например, и без этого сервиса ничего работать не будет. НС>Совсем не обязательно. Иногда внутри кластера DMZ, так что аутентификация нужна только внешним сервисам. А внешние сервисы иногда в одном экземпляре, например используется API Gateway. Так что вся эта аутентификационная шняга касается только одного сервиса в системе.
Это не опровергает тезис бизнес зависимостей. Т.е. сервис A зависит от сервиса B, который зависит от С.
Т.е. имеет смысл вообще было разбивать сервисы на A,B,C или лучше монолит ABC?
Т.е. крайне высокая связанность в самой предметной области.
НС>Почти все это нужно и для монолита. Ты же не сравниваешь всерьез микросервисы с системой, состоящей из одного сервера, надеюсь?
Т.е. мс, работающий на одном сервере это ок?
S>>Еще вопрос -- вот у нас монолит, с кучей dll и отличнейший loose coupling, продуманный api, интерфейсы и т.п. S>>Т.е. один exe и много dll, чем это не микросервисная арх-ра? НС>Тем что связность модулей намного выше. Зачем задавать один и тот же вопрос несколько раз, если уже написан ответ?
А почему связанность модулей намного выше? Если взаимодействие через api, in-proc rest какой-нибудь?
Т.е. никакой связанности кроме единого адресного пр-ва я не вижу.
S>>По-разному: от ui desktop, до обработчиков в сервиcной арх-ре с rmq. Т.е. экземпляров много (процесса), но машина одна. НС>RMQ на одной машине? Необычная архитектура.
RMQ -- это отдельная машина в сети, а мн-во обработчиков на др. машине, которые прослушивают очередь rmq.
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Серьезно, а специфика чего здесь есть? Монолитов? НС>Здесь специфика современных средств деплоймента. Просто в микросервисах оно критично, а с монолитами еще можно пытаться жить по старинке, с виртуалками. Но, в целом, для новых проектов однозначно следует предпочесть контейнеры, вне зависимости от архитектуры.
Как Вы себе представляете монолит на контейнерах? Т.е. вместо 10 маленьких 2 больших контейнера?
S>>>>Писать код, который корректно и грамотно работает с локальным состоянимем, НС>>>Здесь нет специфики микросервисов. S>>Как же нет, когда надо писать код так, чтобы можно было как минимум легко перезапустить сервис.
НС>Возможность перезапуска критична для любой архитектуры, включая монолиты.
Для монолитов этот код надо писать не всем разработчикам.
S>>Т.е. не только бизнес логика, а еще специфика окружения -- распределенная система. НС>Еще раз — распределенная система это не эквивалентное понятие микросервисам. Распределенность диктуется в первую очередь твоими задачами, и если требования по перфу выше того, что способна одна машина — у тебя просто других вариантов нет, при любой архитектуре. НС>А вот если тебе хватает с запасом одного сервера, и нет никаких требований HA и запрета на даунтайм даже при обновлении версии, то микросервисы точно не для этого кейса. И для маленькой команды на весь продукт микросервисы тоже негодный выбор.
То что они не эквивалентны согласен, но ведь микросервисная арх-ра осуществляется поверх распр. систем, т.е.
одна кодовая база разнесена по разным машинам. Т.е. говорим микросервисы на концептуальном уровне, понимаем
распр. систему как реализацию этой концепции. Т.е. на одной машине мс никто же не делает
S>>На этом форуме писали, что суть микросервисов это изоляция хранилища, НС>Не видел такого, чтобы именно суть. Но если писали, то это глупость. Суть микросервисов — выделение сравнительно небольшого функционала в сервис, связанный с остальным функционалом только через REST API (grpc, message bus etc). А изоляция хранилищ уже следствие, так как при расшаривании хранилища между несколькими сервисами между ними появляются плохо контролируемые паразитные связи.
У меня (было) ровно такое же понимание, но объяснили что суть именно в изоляции хранилища.
Если у нас нет никакого состояния, то разве это не serverless? Т.е. просто вызов отдельных ф-ий.
НС>При этом никакого абсолютного запрета нет. Если у тебя уже есть legacy БД с долгой историей разработки, толстым слоем изоляции средствами БД (хранимки и вьюхи) и целой кучей заинтегрированного через нее софта (совершенно типичная ситуация для крупных банков со своими отделами разработки, к примеру), то нужно быть безумцем чтобы пытаться нарезать ее на микрокусочки.
Хе-хе, именно этим сейчас все и занимаются. Как минимум на российском рынке, на хх, регулярно пишут про распил монолита на мс.
S>>>>Она предъявляет большие требования к квалификации чем монолит. НС>>>К кому то большие, к кому то меньше. В девопсам большие, к разработчикам меньшие. S>>К девопсам не то что больше, они появились благодаря этому подходу.
S>>Бизнес код остался таким же, но писать его надо с учетом совершенно другой, ненадежной, среды. НС>Монолит точно так же ненадежен, и даже еще менее (ты вот явно не заморачиваешься НА и хелсчеками). ИМХО ты опять путаешь распределенные решения и микросервисы. НС>Опять же, для совсем ленивых есть istio, который утаскивает все заморочки с ненадежностью типа ретраев на инфраструктурный уровень, оставляя код без этих заморочек.
Не уверен я, что это проходит мимо разработчиков мс. А если и мимо, то не бесплатно. В монолитах об этом явно не всем
разработчикам надо беспокоится.
S>>>>, но у всего есть цена, всяческих объвязок и прочей инфраструктуры стало больше. НС>>>И? Ты к чему ведешь? Что микросервисы не серебряная пуля? Да кто бы сомневался. S>>Я ни к чему не веду. Мы начали с полярного понимания к требованиям квалификации программистов микросервиса. S>>Таки требования в случае мс к ним больше. НС>Ты не смог пока этого доказать.
Почему я это должен доказывать? Заявление было что для мс требования к квалификации разработчиков ниже, а не выше.
Пока все что Вы написали в пользу своего довода сводится к тому, что требования к квалификации никак не меньше чем
для разработчиков монолитов. Т.е. защита довода строится на том, что к разработчикам монолитов такие же требования,
как и к мс, т.е. 1:1. А выигрыш тогда где?
НС>У тебя какое то очень странное понимание того, что требуется именно от программистов в случае микросервисов. В то время как на практике код типичного микросервиса кардинально проще аналогичного модуля монолита, сложность зачастую на уровне студенческого курсового и примерно такие же требования по качеству реализации. Сложность, она не в том чтобы прочитать какой нибудь простенький rest guidlines или прочий толмуд про основные шаблоны микросервисов. Сложность в том чтобы написать простой и качественный код, и вот тут монолиты однозначно в большом проигрыше, просто в силу объема и связности кодовой базы, а так же потенциальным эффектам от проблем в ней. И чем сложнее система в целом, тем больше микросервисы выигрывают в плане требований к квалификации над монолитом.
Все так, согласен. Но это простота бизнес кода приходит не бесплатно, а с учетом ненадежной (враждебной окружающей среды.
Т.е. сложность переехала в другое место. Ее не стало меньше, она стала другой. И вот это "другое" не факт что проще предыдущей сложности,
соотв. и квалификация должны быть выше.
Здравствуйте, Sharov, Вы писали:
S>Это естественно, т.к. сначала появилась концепция, потом началось внедрение.
Не в этом случае. Так было с SOA. А вот с микросервисами ситуация обратная — сперва были реальные системы, а потом уже действующие подходы оформили в концепцию.
Здравствуйте, Sharov, Вы писали:
S>>>Но почему сразу микросервисную? НС>>Кто сказал что сразу микросервисную? S>А о чем у нас тут спор?
Я тебе этот вопрос первый задал.
S>>>А как в мире разработки ПО что-либо контролируется? НС>>Ты это серьезно спрашиваешь? S>Что не так с вопросом ?
Странно слышать от разработчика вопрос как контролируются те или иные ограничения на архитектуру системы.
S>
НС>>Почти все это нужно и для монолита. Ты же не сравниваешь всерьез микросервисы с системой, состоящей из одного сервера, надеюсь?
S>Т.е. мс, работающий на одном сервере это ок?
В проде? Нет.
НС>>Тем что связность модулей намного выше. Зачем задавать один и тот же вопрос несколько раз, если уже написан ответ? S>А почему связанность модулей намного выше?
Ты зачем мне задаешь вопросы, на которые уже получил ответ?
S> Если взаимодействие через api, in-proc rest какой-нибудь?
Если. И даже если так — остается связность по потребляемым ресурсам (CPU, mem), по проходу по памяти, по используемым технологиям (managed и unmanaged код объединять не самое удобное решение, к примеру), по скейлингу, и что самое важное — по процедуре деплоймента.
S>>>По-разному: от ui desktop, до обработчиков в сервиcной арх-ре с rmq. Т.е. экземпляров много (процесса), но машина одна. НС>>RMQ на одной машине? Необычная архитектура. S>RMQ -- это отдельная машина в сети, а мн-во обработчиков на др. машине, которые прослушивают очередь rmq.
Все обработчики на одной машине, при этом message broker выделен в отдельный сервис — тоже весьма странное решение. message broker предназначен для решения двух основных задач — fault tolerance и buffering. Первое в первую очередь потребует HA, которого при одном инстансе нет, а уж потом очереди, а второе при одном инстансе намного проще и эффективнее сделать in process.
Здравствуйте, Sharov, Вы писали:
S>Как Вы себе представляете монолит на контейнерах?
А в чем проблема?
S>Т.е. вместо 10 маленьких 2 больших контейнера?
1 контейнер на один под, при чем тут микросервисы? Да и сайдкары в монолите могут понадобиться, если решения сторонние, например minio или opa.
НС>>Возможность перезапуска критична для любой архитектуры, включая монолиты. S>Для монолитов этот код надо писать не всем разработчикам.
И в микросервисах тоже не всем. Пока у тебя нет необернутого в транзакции изменения персистентного стейта тебе не нужно париться по поводу рестарта, что в мололите, что в микросервисах. А если есть — надо и там и там.
В очередной раз убеждаюсь что у тебя какое то очень странное понимание микросервисов.
S>То что они не эквивалентны согласен, но ведь микросервисная арх-ра осуществляется поверх распр. систем, т.е.
Ты перепутал причину и следствие. Не микросервисы требуют распределенной архитектуры, а распределенная архитектура микросервисов. Нет распределенности — не нужны никакие микросервисы. А потребность в распределенности определяется продуктовыми требованиями, а не архитектурой.
Ты с чего то себе вбил в голову, что монолит это непременно деплоймент на одну машину, отсюда твои странные заявления по поводу микросервисов.
S>Если у нас нет никакого состояния, то разве это не serverless?
Господи, какая каша у тебя в голове. Если у нас нет состояния, то это классический stateless сервис, каким он и должен быть, неважно микро или классический SOA монолит.
А serverless это про облака и способ выделения ресурсов, когда вместо виртуалок (серверов) с поштучной тарификацией под ноды ты получаешь некий абстрактный запускатель контейнеров с тарификацией по потребленным при работе попугаям CPU и/или памяти. AWS lambda и Azure function это просто один из вариантов serverless, самый примитивный. В контексте микросервисов serverless это что вроде AWS Fargate или ACI
S>Хе-хе, именно этим сейчас все и занимаются.
Кто все?
S>Как минимум на российском рынке, на хх, регулярно пишут про распил монолита на мс.
Распил монолита не означает распила БД с историей разработки в десятилетия. Из того что я от тех кто приходит на собеседования слышал пилят как правило веб-сервисы со своей собственной БД, причем эта БД зачастую что то простенькое типа MySQL с минимумом логики, а то и с code first подходом. А вот чтобы банк свой опердень на микросервисы пилил — про такое я не слышал.
НС>>Опять же, для совсем ленивых есть istio, который утаскивает все заморочки с ненадежностью типа ретраев на инфраструктурный уровень, оставляя код без этих заморочек. S>Не уверен я, что это проходит мимо разработчиков мс.
Учитывая твой нулевой опыт в микросервисах — не вижу смысла твою уверенность обсуждать. Аргументы есть, или одни ощущения?
S>>>Таки требования в случае мс к ним больше. НС>>Ты не смог пока этого доказать. S>Почему я это должен доказывать? Заявление было что для мс требования к квалификации разработчиков ниже, а не выше.
И было приведено обоснование, почему. А в ответ ничего путного ты возразить не можешь, одна "баба яга против". Есть что по делу возразить или одни ощущения?
S>Пока все что Вы написали в пользу своего довода сводится к тому, что требования к квалификации никак не меньше чем S>для разработчиков монолитов.
Ну что за бред?
S>как и к мс, т.е. 1:1. А выигрыш тогда где?
В изоляции узких доменов, как следствие в уменьшении размеров конкретных сервисов, снижении требований к суммарной компетенции команды, вынесение инфраструктурных компетенций за пределы сервиса и даже разрабатываемого программного кода, в возможности более тонкой настройки масштабируемости, в возможности независимого деплоймента небольших частей системы, в большей свободе по выбору инструментальных средств и подходов к разработке каждой конкретной командой, в снижении требований на коммуникации между командами. Статья в википедии содержит развернутый ответ.
Я последний раз отвечаю на этот вопрос. Если захочется еще раз спросить — предыдущие сообщения в твоем распоряжении.
S>Все так, согласен.
Не похоже.
S>Но это простота бизнес кода приходит не бесплатно, а с учетом ненадежной (враждебной окружающей среды.
Опять какие то ощущения или есть конкретика?
S>Т.е. сложность переехала в другое место. Ее не стало меньше, она стала другой.
Только часть этой сложности переехала в cloud native софт, который уже написан. Тебе не надо, как в монолите, самому писать свой собственный велосипедный кубер, к примеру.
Здравствуйте, Sharov, Вы писали:
S>Это не опровергает тезис бизнес зависимостей. Т.е. сервис A зависит от сервиса B, который зависит от С. S>Т.е. имеет смысл вообще было разбивать сервисы на A,B,C или лучше монолит ABC?
Если нет потребности в независимом скейлинге и в независимых релизах — можно и монолит. Только это не монолит в привычном понимании, просто домен довольно крупный. Так чтобы этот домен был размером с весь кластер — ну очень вряд ли.
S>Т.е. крайне высокая связанность в самой предметной области.
Нет такого в предметной области. Связность это не про предметную область, а про конкретную архитектуру.
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Это естественно, т.к. сначала появилась концепция, потом началось внедрение. НС>Не в этом случае. Так было с SOA. А вот с микросервисами ситуация обратная — сперва были реальные системы, а потом уже действующие подходы оформили в концепцию.
А как много было реальных систем, чтобы можно было с уверенностью сказать, что это правильный путь развития?
Т.е. почему было понятно, что если это работает у Нетфликса или гугла, то заработает и в фирме на 20 программистов?
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Как Вы себе представляете монолит на контейнерах? НС>А в чем проблема?
А это точно будет монолит?
НС>>>Возможность перезапуска критична для любой архитектуры, включая монолиты. S>>Для монолитов этот код надо писать не всем разработчикам.
НС>И в микросервисах тоже не всем. Пока у тебя нет необернутого в транзакции изменения персистентного стейта тебе не нужно париться по поводу рестарта, что в мололите, что в микросервисах. А если есть — надо и там и там.
В монолите это зачем? Если что-то упадет, то будут рестартовать все приложение, а не части.
НС>В очередной раз убеждаюсь что у тебя какое то очень странное понимание микросервисов.
Суть микросервисов — выделение сравнительно небольшого функционала в сервис, связанный с остальным функционалом только через REST API (grpc, message bus etc). А изоляция хранилищ уже следствие, так как при расшаривании хранилища между несколькими сервисами между ними появляются плохо контролируемые паразитные связи.
Такое же видение, разве что разный взгляд на приоритет изоляции хранилища.
S>>То что они не эквивалентны согласен, но ведь микросервисная арх-ра осуществляется поверх распр. систем, т.е.
НС>Ты перепутал причину и следствие. Не микросервисы требуют распределенной архитектуры, а распределенная архитектура микросервисов. Нет распределенности — не нужны никакие микросервисы. А потребность в распределенности определяется продуктовыми требованиями, а не архитектурой.
Ну а как до изобретения мс работал тот же гугл? Распределенная система была, микросервисов не было.
Сложный деплоймент, настройки, но система распределенная и нету никаких микросервисов.
S>>Как минимум на российском рынке, на хх, регулярно пишут про распил монолита на мс. НС>Распил монолита не означает распила БД с историей разработки в десятилетия. Из того что я от тех кто приходит на собеседования слышал пилят как правило веб-сервисы со своей собственной БД, причем эта БД зачастую что то простенькое типа MySQL с минимумом логики, а то и с code first подходом. А вот чтобы банк свой опердень на микросервисы пилил — про такое я не слышал.
Райфайзен этим занимался. Правда про опердни я не уверен, но что-то такое внутри делали.
S>>Не уверен я, что это проходит мимо разработчиков мс. НС>Учитывая твой нулевой опыт в микросервисах — не вижу смысла твою уверенность обсуждать. Аргументы есть, или одни ощущения?
Довод maxkar'a вполне считаю аргументом. Выше требования к квалификации, а обратное пока не убеждает. Ничья в лучшем случае.
S>>Почему я это должен доказывать? Заявление было что для мс требования к квалификации разработчиков ниже, а не выше. НС>И было приведено обоснование, почему. А в ответ ничего путного ты возразить не можешь, одна "баба яга против". Есть что по делу возразить или одни ощущения?
В ответ была ссылка на ресурс, приведенный же Вами, которая разумеется была проигнорированна:
Team expertise: The benefits of microservices are moot without a prepared staff. You should assess the skills of your team members before moving forward with a microservices architecture.
С Вашей стороны ничего кроме
Стал проще код интеграционный.
не последовало. Только причем здесь разработчики, если про интеграцию отвечают девопсы?
S>>Пока все что Вы написали в пользу своего довода сводится к тому, что требования к квалификации никак не меньше чем S>>для разработчиков монолитов. НС>Ну что за бред?
см. выше
S>>как и к мс, т.е. 1:1. А выигрыш тогда где? НС>В изоляции узких доменов, как следствие в уменьшении размеров конкретных сервисов, снижении требований к суммарной компетенции команды, вынесение инфраструктурных компетенций за пределы сервиса и даже разрабатываемого программного кода, в возможности более тонкой настройки масштабируемости, в возможности независимого деплоймента небольших частей системы, в большей свободе по выбору инструментальных средств и подходов к разработке каждой конкретной командой, в снижении требований на коммуникации между командами. Статья в википедии содержит развернутый ответ. НС>Я последний раз отвечаю на этот вопрос. Если захочется еще раз спросить — предыдущие сообщения в твоем распоряжении.
По ссылке про квалификацию разработчиков нет ни слова:
Modularity: This makes the application easier to understand, develop, test, and become more resilient to architecture erosion.[5] This benefit is often argued in comparison to the complexity of monolithic architectures.
Как из этой цитаты следует
снижении требований к суммарной компетенции команды,
?
Быстрее релизный цикл, новые фичи и управляемость(командами) -- да. Требования к квалификации -- далеко не факт.
Более того, в последнее время всех гоняют по System design interview, с прицелом для работы над
мс архитектурой, чего раньше(лет 6-7 ) не было. С чего это вдруг помимо прочего это стало актуально,
наоборот, все должно быть просто. Главное, чтобы разработчик со стула не падал, а мс арх-ра сделает
свое дело.
S>>Но это простота бизнес кода приходит не бесплатно, а с учетом ненадежной (враждебной окружающей среды. НС>Опять какие то ощущения или есть конкретика?
Конкретика была от maxkar'а.
S>>Т.е. сложность переехала в другое место. Ее не стало меньше, она стала другой. НС>Только часть этой сложности переехала в cloud native софт, который уже написан. Тебе не надо, как в монолите, самому писать свой собственный велосипедный кубер, к примеру.
Здравствуйте, Sharov, Вы писали:
НС>>Не в этом случае. Так было с SOA. А вот с микросервисами ситуация обратная — сперва были реальные системы, а потом уже действующие подходы оформили в концепцию. S>А как много было реальных систем, чтобы можно было с уверенностью сказать, что это правильный путь развития?
Системы были недостаточно истинными шотландцами?
S>Т.е. почему было понятно, что если это работает у Нетфликса или гугла, то заработает и в фирме на 20 программистов?
Здравствуйте, Sharov, Вы писали:
S>>>Как Вы себе представляете монолит на контейнерах? НС>>А в чем проблема? S>А это точно будет монолит?
Как контейнеры противоречат определению монолита?
НС>>И в микросервисах тоже не всем. Пока у тебя нет необернутого в транзакции изменения персистентного стейта тебе не нужно париться по поводу рестарта, что в мололите, что в микросервисах. А если есть — надо и там и там. S>В монолите это зачем?
Затем же, зачем и в микросервисах.
S>Если что-то упадет, то будут рестартовать все приложение, а не части.
Микросервис это вполне себе самостоятельное приложение, там нет никакой специфики в плане рестарта.
НС>>Ты перепутал причину и следствие. Не микросервисы требуют распределенной архитектуры, а распределенная архитектура микросервисов. Нет распределенности — не нужны никакие микросервисы. А потребность в распределенности определяется продуктовыми требованиями, а не архитектурой. S>Ну а как до изобретения мс работал тот же гугл? Распределенная система была, микросервисов не было.
Да. И? В чем противоречие моим словам?
S>Райфайзен этим занимался. Правда про опердни я не уверен, но что-то такое внутри делали.
Ну вот сперва узнай что это такое.
S>>>Не уверен я, что это проходит мимо разработчиков мс. НС>>Учитывая твой нулевой опыт в микросервисах — не вижу смысла твою уверенность обсуждать. Аргументы есть, или одни ощущения? S>Довод maxkar'a вполне считаю аргументом. Выше требования к квалификации
Это не довод, это было просто заявление.
S>В ответ была ссылка на
На сайт, требующий обязательной регистрации. Сразу в мусор.
S> ресурс,
Смысл цитировать эти манифесты за все хорошее? Люди пишут эти манифесты опробовав на маленькой выборке, теоретики типа.
S>Team expertise: The benefits of microservices are moot without a prepared staff.
Опять бездоказательные тезисы.
S> You should assess the skills of your team members before moving forward with a microservices architecture.
И? Для монолита что, экспертиза не нужна?
S>С Вашей стороны ничего кроме
Ложь
S>По ссылке про квалификацию разработчиков нет ни слова:
В вопросе твоем тоже.
S>Быстрее релизный цикл, новые фичи и управляемость(командами) -- да. Требования к квалификации -- далеко не факт.
Ну да, то теоретики, а ты практик, ты точно знаешь, и твои заявления в доказательствах не нуждаются.
S>Более того, в последнее время всех гоняют по System design interview, с прицелом для работы над S>мс архитектурой,
При этом не знаешь что такое serverless. Жесть. Как твоя контора называется?
S>>>Но это простота бизнес кода приходит не бесплатно, а с учетом ненадежной (враждебной окружающей среды. НС>>Опять какие то ощущения или есть конкретика?
S>Конкретика была от maxkar'а.
Т.е. нету. ЧТД.
S>>>Т.е. сложность переехала в другое место. Ее не стало меньше, она стала другой. НС>>Только часть этой сложности переехала в cloud native софт, который уже написан. Тебе не надо, как в монолите, самому писать свой собственный велосипедный кубер, к примеру. S>А зачем для монолита нужен кубер, для начала?
А какие функции, по твоему, кубер выполняет? И точно все из них бесполезны для монолита? На всякий случай напомню, что монолит не означает единственный сервер, а то тебя опять понесет не в ту степь.
Здравствуйте, Sharov, Вы писали:
НС>>Ты перепутал причину и следствие. Не микросервисы требуют распределенной архитектуры, а распределенная архитектура микросервисов. Нет распределенности — не нужны никакие микросервисы. А потребность в распределенности определяется продуктовыми требованиями, а не архитектурой. S>Ну а как до изобретения мс работал тот же гугл? Распределенная система была, микросервисов не было. S>Сложный деплоймент, настройки, но система распределенная и нету никаких микросервисов.
В Гугле была сервисная система с самого начала, со своим аналогом контейнеров. Не знаю про MS.
Сервисы были не "микро", это да. Но именно микро-сервисы не очень-то нужны.
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>А это точно будет монолит? НС>Как контейнеры противоречат определению монолита?
Никак, просто они про изоляцию и простоту деплоймента.А монолиты не про изоляцию.
НС>>>И в микросервисах тоже не всем. Пока у тебя нет необернутого в транзакции изменения персистентного стейта тебе не нужно париться по поводу рестарта, что в мололите, что в микросервисах. А если есть — надо и там и там. S>>В монолите это зачем? НС>Затем же, зачем и в микросервисах.
А что там рестартовать, кроме всего приложения?
НС>>>Ты перепутал причину и следствие. Не микросервисы требуют распределенной архитектуры, а распределенная архитектура микросервисов. Нет распределенности — не нужны никакие микросервисы. А потребность в распределенности определяется продуктовыми требованиями, а не архитектурой. S>>Ну а как до изобретения мс работал тот же гугл? Распределенная система была, микросервисов не было. НС>Да. И? В чем противоречие моим словам?
Не микросервисы требуют распределенной архитектуры, а распределенная архитектура микросервисов
S>>В ответ была ссылка на НС>На сайт, требующий обязательной регистрации. Сразу в мусор.
Некто НС выше дал ссылку на этот сайт, я прошел по ссылке данной мне ссылке. К нему вопросы.
S>> ресурс, НС>Смысл цитировать эти манифесты за все хорошее? Люди пишут эти манифесты опробовав на маленькой выборке, теоретики типа.
Это утверждение требует доказательства
S>>Team expertise: The benefits of microservices are moot without a prepared staff. НС>Опять бездоказательные тезисы.
Вы бы сами пример доказательства хоть чему-нибудь из Вами сказанного привели, подали пример.
А то не совсем понятно как в мире идей, манифестов и концепций можно что-то доказать. Цитатами из вики?
S>> You should assess the skills of your team members before moving forward with a microservices architecture. НС>И? Для монолита что, экспертиза не нужна?
Что и? Экспертиза для всего нужна, но кто-то утверждал, что для мс арх-ры ее нужно меньше.
На всякий случай, я полагаю экспертиза~квалификации.
S>>Быстрее релизный цикл, новые фичи и управляемость(командами) -- да. Требования к квалификации -- далеко не факт. НС>Ну да, то теоретики, а ты практик, ты точно знаешь, и твои заявления в доказательствах не нуждаются.
Я то тут причем?
Итак, мы начали с противоположенного мнения к требования квалификации разработчиков в проектах
с микросервисной арх-ой. Я утверждаю, что требования к квалификации разработчиков на подобных проектах выше, Вы -- что ниже.
У меня нету практического опыта над подобными проектами и я об этом сразу оговорился.
Поэтому в своих наблюдениях опираюсь на умозрительные и косвенные наблюдения.
1) Когда человек работает в мс арх-рах ему необходимо вот это все время держать в голове
-- https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing
Т.е. это не самая простая среда для программирования, требует определенной подготовки, т.е.
как минимум знать и понимать о чем пишут по ссылке. Для монолита, в силу высокой связанности,
многие вещи по приведенной выше ссылки не актуальны. Все натурально может быть в одном адр. пр-ве.
Но на мн-ве серверов, да.
2) Вакансии на хх стали изобиловать некоторым кол-вом новых баззвордов типа докер, k8, инструменты
мониторинга и т.п. Все это требует инвестиций на изучение, и вообще это новые требования к разработчикам,
которых лет 5 назад еще не было. Т.е. вроде обещали простоту, а по факту новые баззворды.
И да, речь идет именно об изучение, чтобы понимать, что под капотом, а не просто черный ящик.
3) За бугром, во фаанг и, следовательно, много где еще, появился новый этап в собеседованиях под
названием System design interview. Есть смутные подозрения, что едва ли людей дрючат на этом
этапе для работы над монолитными арх-ми. Стало быть дело в чем-то другом, в других арх-ых
подходах. Беру на себя смелость (без доказательств!) утверждать, что это необходимо для
разработчиков в микросервисных проектах. Подготовка, т.е. курсы, книги, ютюб, к подобным
интервью это некий прирост в экспертизе и навыках разработчиков. Т.е. помимо всего прочего --
знание языка, бд, dsl вроде sql, предметной области (желательно), добавляется целый пласт
необходимых знаний. С чего это вдруг, когда некоторые утверждают что мс арх-ра чудо как
хороша и разрабатывалась с учетом того, что над соотв. проектами могут работать программисты не самый высокой квалификации.
Натурально со стула не падают -- и хорошо! Дальше мс арх-ра + девопсы вывезут.
. И по косвенным признаками что-то такое говорит SkyDance,
дескать легко злоупотребить и улететь в распределенный монолит. Едва ли квалифицированные
разработчики такое смогут учудить.
Being a distributed system, it is much more complex than monolithic applications. Its complexity increases with the increase in number of microservices. Skilled developers are required to work with microservices architecture which can identify the microservices and manage their inter-communications.
Independent deployment of microservices is complicated.
Microservices are costly in terms of network usage as they need to interact with each other and all these remote calls results into network latency.
Microservices are less secure relative to monolithic applications due to the inter-services communication over the network.
Debugging is difficult as the control flows over many microservices and to point out why and where exactly the error occurred is a difficult task.
Собственно вот -- не доказательство, но есть некое, кмк, здравое зерно.
S>>Более того, в последнее время всех гоняют по System design interview, с прицелом для работы над S>>мс архитектурой, НС>При этом не знаешь что такое serverless. Жесть.
И что, нельзя высказать свое мнение теперь?
НС>Как твоя контора называется?
Вы бы сами для начала представились, а то все обо мне да обо мне.
НС>>>Только часть этой сложности переехала в cloud native софт, который уже написан. Тебе не надо, как в монолите, самому писать свой собственный велосипедный кубер, к примеру. S>>А зачем для монолита нужен кубер, для начала? НС>А какие функции, по твоему, кубер выполняет?
Деплоймент, версионирование+ много чего еще специфичного для мс.
НС>И точно все из них бесполезны для монолита? На всякий случай напомню, что монолит не означает единственный сервер, а то тебя опять понесет не в ту степь.
Не все, конечно, но если у нас сложный деплоймент, то есть ли в кубере смысл?
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>А почему связанность модулей намного выше? НС>Ты зачем мне задаешь вопросы, на которые уже получил ответ?
Кроме вопроса на вопрос я обычно от Вас ничего не получаю. Приходится переспрашивать.
S>> Если взаимодействие через api, in-proc rest какой-нибудь? НС>Если. И даже если так — остается связность по потребляемым ресурсам (CPU, mem), по проходу по памяти, по используемым технологиям (managed и unmanaged код объединять не самое удобное решение, к примеру), по скейлингу, и что самое важное — по процедуре деплоймента.
Ясно , благодарю.
НС>>>RMQ на одной машине? Необычная архитектура. S>>RMQ -- это отдельная машина в сети, а мн-во обработчиков на др. машине, которые прослушивают очередь rmq. НС>Все обработчики на одной машине,
Нет, по машинам раскиданы.
НС>при этом message broker выделен в отдельный сервис — тоже весьма странное решение.
Отдельная машина в локальной сети.
НС>message broker предназначен для решения двух основных задач — fault tolerance и buffering. Первое в первую очередь потребует HA, которого при одном инстансе нет, а уж потом очереди, а второе при одном инстансе намного проще и эффективнее сделать in process.
Здравствуйте, Sharov, Вы писали:
НС>>>>RMQ на одной машине? Необычная архитектура. S>>>RMQ -- это отдельная машина в сети, а мн-во обработчиков на др. машине, которые прослушивают очередь rmq. НС>>Все обработчики на одной машине, S>Нет, по машинам раскиданы.
Т.е., несмотря на монолитность распределенность имеем в полный рост. ЧТД.
НС>>message broker предназначен для решения двух основных задач — fault tolerance и buffering. Первое в первую очередь потребует HA, которого при одном инстансе нет, а уж потом очереди, а второе при одном инстансе намного проще и эффективнее сделать in process. S>Это как, и mq и обработчики in proc?
А в чем проблема, если все равно все на одной машине?
Здравствуйте, Sharov, Вы писали:
S>>>А это точно будет монолит? НС>>Как контейнеры противоречат определению монолита? S>Никак, просто они про изоляцию и простоту деплоймента.А монолиты не про изоляцию.
Ну и с чем ты тогда споришь?
НС>>>>И в микросервисах тоже не всем. Пока у тебя нет необернутого в транзакции изменения персистентного стейта тебе не нужно париться по поводу рестарта, что в мололите, что в микросервисах. А если есть — надо и там и там. S>>>В монолите это зачем? НС>>Затем же, зачем и в микросервисах. S>А что там рестартовать, кроме всего приложения?
Так и в микросервисах рестартует приложение. Ты опять выдумываешь какие то несуществующие проблемы.
НС>>>>Ты перепутал причину и следствие. Не микросервисы требуют распределенной архитектуры, а распределенная архитектура микросервисов. Нет распределенности — не нужны никакие микросервисы. А потребность в распределенности определяется продуктовыми требованиями, а не архитектурой. S>>>Ну а как до изобретения мс работал тот же гугл? Распределенная система была, микросервисов не было. НС>>Да. И? В чем противоречие моим словам?
S>Распределения арх-ра может быть и без микро-сервисов -- http://rsdn.org/forum/design/8190024
Именно это я и утверждал несколькими абзацами выше. И десять раз тебе написал, что распределенность ортогональна микросервисам. Теперь ты пытаешься мне это доказать?
S>Т.е. противоречие вот тут: S>
S>Не микросервисы требуют распределенной архитектуры, а распределенная архитектура микросервисов
Нет тут противоречия если не выхолащивать контекст.
S>>>В ответ была ссылка на НС>>На сайт, требующий обязательной регистрации. Сразу в мусор.
S>Некто НС выше дал ссылку на этот сайт, я прошел по ссылке данной мне ссылке. К нему вопросы.
Некто НС дал ссылку, которой не нужна регистрация, в отличие от некто Sharov.
S>>> ресурс, НС>>Смысл цитировать эти манифесты за все хорошее? Люди пишут эти манифесты опробовав на маленькой выборке, теоретики типа. S>Это утверждение требует доказательства
Смотри, начинает доходить.
S>>>Team expertise: The benefits of microservices are moot without a prepared staff. НС>>Опять бездоказательные тезисы. S>Вы бы сами пример доказательства хоть чему-нибудь из Вами сказанного привели, подали пример.
Я их тут приводил неоднократно.
S>А то не совсем понятно как в мире идей, манифестов и концепций можно что-то доказать. Цитатами из вики?
Логикой, мой друг, логикой.
S>>> You should assess the skills of your team members before moving forward with a microservices architecture. НС>>И? Для монолита что, экспертиза не нужна? S>Что и? Экспертиза для всего нужна, но кто-то утверждал, что для мс арх-ры ее нужно меньше.
Да. Ты же зачем то пытаешься доказать что она другая. Да, другая. Но другая не значит больше. Для монолитов точно так же нужна экспертиза в обращении с огромными объемами кода, и эта экспертиза куда дороже и реже, чем базовый стафф про микросервисы.
S>Тут что гуглил на тему, и набрел на еще один сайт -- https://www.geeksforgeeks.org/monolithic-vs-microservices-architecture/ S>
S>Disadvantages of microservices:
S> Being a distributed system, it is much more complex than monolithic applications. Its complexity increases with the increase in number of microservices.
S> Skilled developers are required to work with microservices architecture which can identify the microservices and manage their inter-communications.
S> Independent deployment of microservices is complicated.
S> Microservices are costly in terms of network usage as they need to interact with each other and all these remote calls results into network latency.
S> Microservices are less secure relative to monolithic applications due to the inter-services communication over the network.
S> Debugging is difficult as the control flows over many microservices and to point out why and where exactly the error occurred is a difficult task.
S>Собственно вот -- не доказательство, но есть некое, кмк, здравое зерно.
А кто то утверждал что у микросервисов нет недостатков? Даже я про некоторые писал тут. Ты опять ломишься в открытые двери.
S>>>Более того, в последнее время всех гоняют по System design interview, с прицелом для работы над S>>>мс архитектурой, НС>>При этом не знаешь что такое serverless. Жесть. S>И что, нельзя высказать свое мнение теперь?
Речь не про высказывание мнения, а про
гоняют по System design interview, с прицелом для работы над мс архитектурой
НС>>Как твоя контора называется? S>Вы бы сами для начала представились, а то все обо мне да обо мне.
Я не аппелирую к собственной экспертности.
НС>>А какие функции, по твоему, кубер выполняет? S>Деплоймент,
Для монолита не нужен? Вот так новость.
S> версионирование+
Версионирование? О чем ты?
S> много чего еще специфичного для мс.
Что? Я вот так, навскидку, из крупного вспоминаю только балансировку гетерогенной нагрузки, которая монолиту не нужна в силу отсутствия самой возможность балансировки. Что еще?
НС>>И точно все из них бесполезны для монолита? На всякий случай напомню, что монолит не означает единственный сервер, а то тебя опять понесет не в ту степь. S>Не все, конечно, но если у нас сложный деплоймент, то есть ли в кубере смысл?
Что такое сложный деплоймент и почему он нивелирует потребность во всем функционале кубера?
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Нет, по машинам раскиданы. НС>Т.е., несмотря на монолитность распределенность имеем в полный рост. ЧТД.
Если у нас монолиты запущены на нескольких машинах -- через gateway или шину, то, наверное, можно говорить
о распр. системе. Если я где-то (где?) утверждал обратное, то был неправ.
НС>>>message broker предназначен для решения двух основных задач — fault tolerance и buffering. Первое в первую очередь потребует HA, которого при одном инстансе нет, а уж потом очереди, а второе при одном инстансе намного проще и эффективнее сделать in process. S>>Это как, и mq и обработчики in proc? НС>А в чем проблема, если все равно все на одной машине?
А зачем mq тогда, не проще обраотчику иметь какой-нибудь персистентный буфер для задач?
С трудом представляю такую арх-ру с RabbitMq.
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Никак, просто они про изоляцию и простоту деплоймента.А монолиты не про изоляцию. НС>Ну и с чем ты тогда споришь?
Явно не с этим.
S>>А что там рестартовать, кроме всего приложения? НС>Так и в микросервисах рестартует приложение. Ты опять выдумываешь какие то несуществующие проблемы.
Разработчику какого-нибудь компонента монолита зачем ломать об этом голову?
НС>>>Да. И? В чем противоречие моим словам? S>>Распределения арх-ра может быть и без микро-сервисов -- http://rsdn.org/forum/design/8190024
. НС>Именно это я и утверждал несколькими абзацами выше. И десять раз тебе написал, что распределенность ортогональна микросервисам. Теперь ты пытаешься мне это доказать?
Ортогональность предполагает независимость (как минимум в математике). Т.е. мы выяснили, что распределенная система
может строится, например, на монолитах. Или необязательно микро-сервисах. А вот микросервисы ну никак без
распределенности. Т.е. явная зависимость одного от другого, т.е. никакая не ортгональность.
Т.е. то, что Вы утверждали, а именно:
НС>Ты перепутал причину и следствие. Не микросервисы требуют распределенной архитектуры, а распределенная архитектура микросервисов.
неверно.
S>>Т.е. противоречие вот тут: S>>
S>>Не микросервисы требуют распределенной архитектуры, а распределенная архитектура микросервисов
НС>Нет тут противоречия если не выхолащивать контекст.
О, как! Взял на заметку! Это оказывается, не Вы ошиблись или в чем-то неправы, а контекст выхоластился (или как он там задиспойзился?).
S>>Некто НС выше дал ссылку на этот сайт, я прошел по ссылке данной мне ссылке. К нему вопросы. НС>Некто НС дал ссылку, которой не нужна регистрация, в отличие от некто Sharov.
Ссылка на один и тот же сайт, у меня ничего не требует.
S>>Вы бы сами пример доказательства хоть чему-нибудь из Вами сказанного привели, подали пример. НС>Я их тут приводил неоднократно.
S>>А то не совсем понятно как в мире идей, манифестов и концепций можно что-то доказать. Цитатами из вики? НС>Логикой, мой друг, логикой.
Или казуистикой, уводом темы в сторону, вопросом на вопрос или переходом на личности.
S>>>> You should assess the skills of your team members before moving forward with a microservices architecture. НС>>>И? Для монолита что, экспертиза не нужна? S>>Что и? Экспертиза для всего нужна, но кто-то утверждал, что для мс арх-ры ее нужно меньше. НС>Да. Ты же зачем то пытаешься доказать что она другая. Да, другая. Но другая не значит больше.
Да, пытаюсь. От разработчиков мс требуется существенно больше компетенций в такой непростой среде как
распределенные системы. Т.е. требуется больше экспертизы в распр. системах. Сохраняя при этом все требования
при работе с монолитами. Т.е. другая экспертиза(квалификация) и именно больше.
НС>Для монолитов точно так же нужна экспертиза в обращении с огромными объемами кода,
А можно подробнее, что требуется? Знание шорткатов ide по навигации по коду, знание шорткатов по для всяческих
рефакторингов? Кто-то и как проводит собеседования на выявление соотв. навыков и экспертизы?
Ничего окромя классических паттренов GoF и ООП в голову не приходит, но кто сказал что для
мс они не нужны? Ну, ок, еще DDD можно добавить. Для мс все ровно также + ...
НС>и эта экспертиза куда дороже и реже, чем базовый стафф про микросервисы.
Возможно. Но, кмк, это экспертиза называется "умение читать и понимать код", которая нужна и там и там.
Вероятно, с учетом этого навыка людей и гоняют по System design, чтобы понимали что и почему написано.
S>>Тут что гуглил на тему, и набрел на еще один сайт -- https://www.geeksforgeeks.org/monolithic-vs-microservices-architecture/ S>>
S>>Disadvantages of microservices:
S>> Being a distributed system, it is much more complex than monolithic applications. Its complexity increases with the increase in number of microservices.
S>> Skilled developers are required to work with microservices architecture which can identify the microservices and manage their inter-communications.
S>> Independent deployment of microservices is complicated.
S>> Microservices are costly in terms of network usage as they need to interact with each other and all these remote calls results into network latency.
S>> Microservices are less secure relative to monolithic applications due to the inter-services communication over the network.
S>> Debugging is difficult as the control flows over many microservices and to point out why and where exactly the error occurred is a difficult task.
S>>Собственно вот -- не доказательство, но есть некое, кмк, здравое зерно. НС>А кто то утверждал что у микросервисов нет недостатков? Даже я про некоторые писал тут. Ты опять ломишься в открытые двери.
Вы упорно отрицаете вот этот недостаток:
Skilled developers are required to work with microservices architecture which can identify the microservices and manage their inter-communications
НС>>>При этом не знаешь что такое serverless. Жесть. S>>И что, нельзя высказать свое мнение теперь? НС>Речь не про высказывание мнения, а про НС>
НС>гоняют по System design interview, с прицелом для работы над мс архитектурой
И что не так с цитатой? Телепаты в отпуске.
S>>Вы бы сами для начала представились, а то все обо мне да обо мне. НС>Я не аппелирую к собственной экспертности.
Я тоже.
НС>>>А какие функции, по твоему, кубер выполняет? S>>Деплоймент, НС>Для монолита не нужен? Вот так новость.
Пожалуйста, читайте до конца мой ответ, т.е. буфферизируйте, а не в режиме потока. Ибо ниже об этом написано.
S>> версионирование+ НС>Версионирование? О чем ты?
Мог что-то перепутать, просто k8 вроде бы может помогать с переходом с одной версии api на другую, т.е.
работает и старая версия и новая потихоньку накатывается.
S>> много чего еще специфичного для мс. НС>Что? Я вот так, навскидку, из крупного вспоминаю только балансировку гетерогенной нагрузки, которая монолиту не нужна в силу отсутствия самой возможность балансировки. Что еще?
Не знаю, это же не я предложил кубер для монолитов использовать. Вот и думайте что еще.
S>>Не все, конечно, но если у нас сложный деплоймент, то есть ли в кубере смысл? НС>Что такое сложный деплоймент и почему он нивелирует потребность во всем функционале кубера?
Много сложных зависимсотей, наверное. Т.е. если он что-то не может упростить, а для другого безполезен,
то какой в нем смысл?
Здравствуйте, Sharov, Вы писали:
S>>>Нет, по машинам раскиданы. НС>>Т.е., несмотря на монолитность распределенность имеем в полный рост. ЧТД. S>Если у нас монолиты запущены на нескольких машинах -- через gateway или шину, то, наверное, можно говорить S>о распр. системе.
Наверное?
S>Если я где-то (где?) утверждал обратное, то был неправ.
Ты утверждал что при разработке монолита знания о распределенных системах не нужны.
НС>>>>message broker предназначен для решения двух основных задач — fault tolerance и buffering. Первое в первую очередь потребует HA, которого при одном инстансе нет, а уж потом очереди, а второе при одном инстансе намного проще и эффективнее сделать in process. S>>>Это как, и mq и обработчики in proc? НС>>А в чем проблема, если все равно все на одной машине? S>А зачем mq тогда,
Для буферизации.
S>не проще обраотчику иметь какой-нибудь персистентный буфер для задач? S>С трудом представляю такую арх-ру с RabbitMq.
Я вроде нигде не писал что нужно именно rmq использовать.
Здравствуйте, Sharov, Вы писали:
S>>>Никак, просто они про изоляцию и простоту деплоймента.А монолиты не про изоляцию. НС>>Ну и с чем ты тогда споришь? S>Явно не с этим.
Тогжа как понимать это?
Dockerfile писать надо? Надо. Т.е. надо изучать docker.
S>>>А что там рестартовать, кроме всего приложения? НС>>Так и в микросервисах рестартует приложение. Ты опять выдумываешь какие то несуществующие проблемы. S>Разработчику какого-нибудь компонента монолита зачем ломать об этом голову?
А кому ломать? Если компонент полагается на нетранзакционный персистентный стейт — кто должен бороться с последствиями сбоев? И чем, по твоему, нужно бороться авторам микросервисов?
Вобщем, давай вместо общих фраз ты продемонстрируешь конкретную проблему, которую нужно решать в микросервисе и не нужно в монолите.
НС>>Именно это я и утверждал несколькими абзацами выше. И десять раз тебе написал, что распределенность ортогональна микросервисам. Теперь ты пытаешься мне это доказать? S>Ортогональность предполагает независимость (как минимум в математике).
Цепляешься к словам? Прекрасно.
S> Т.е. мы выяснили, что распределенная система может строится, например, на монолитах.
Не мы, а ты.
S>неверно.
Просто ты неверно понял что написано. Или сделал вид, когда аргументы кончились.
S>Или казуистикой, уводом темы в сторону, вопросом на вопрос или переходом на личности.
Переход на личности начался с того, что ты вместо аргументации начал применять обороты вроде "я не уверен". Ну и чего мне с твоей неуверенностью делать?
НС>>Да. Ты же зачем то пытаешься доказать что она другая. Да, другая. Но другая не значит больше. S>Да, пытаюсь. От разработчиков мс требуется существенно больше компетенций в такой непростой среде как S>распределенные системы.
И существенно меньше в такой непростой среде как огромный монолитный проект. И?
При этом, как мы вроде бы разобрались, от компетенций в распределенности монолит нифига не спасает.
S> Т.е. требуется больше экспертизы в распр. системах.
Или нет. Ты опять бросаешься бездоказательными утверждениями. Какой конкретно кейс будет проблемой, требующей особой экспертизы в микросервисах, и не будет в монолите?
НС>>Для монолитов точно так же нужна экспертиза в обращении с огромными объемами кода, S>А можно подробнее, что требуется?
Огромное количество знаний и навыков, позволяющих создавать loosely coupled и high cohesion решения. Чем больше размер и сложность кода, тем больше ресурсов и умений надо вкладывать в архитектуру программного кода.
S>Ничего окромя классических паттренов GoF и ООП в голову не приходит, но кто сказал что для S>мс они не нужны?
Тебе точно надо объяснять, что важность и потребность в паттернах прямо зависит от объема кода? Что если у тебя кода десяток килобайт — тащить туда гору сложных паттернов не нужно?
НС>>и эта экспертиза куда дороже и реже, чем базовый стафф про микросервисы. S>Возможно. Но, кмк, это экспертиза называется "умение читать и понимать код",
Нет, экспертиза называется умение писат легко читаемый и модифицируемый код.
НС>>А кто то утверждал что у микросервисов нет недостатков? Даже я про некоторые писал тут. Ты опять ломишься в открытые двери. S>Вы упорно отрицаете вот этот недостаток: S>
S> Skilled developers are required to work with microservices architecture which can identify the microservices and manage their inter-communications
Ложь. Я отрицаю что монолит позволяет обойтись без skilled.
S>>>Вы бы сами для начала представились, а то все обо мне да обо мне. НС>>Я не аппелирую к собственной экспертности. S>Я тоже.
Да? А как тогда трактовать "я не уверен" в качестве аргумента?
НС>>>>А какие функции, по твоему, кубер выполняет? S>>>Деплоймент, НС>>Для монолита не нужен? Вот так новость. S>Пожалуйста, читайте до конца мой ответ, т.е. буфферизируйте, а не в режиме потока. S>Ибо ниже об этом написано.
Я его прочел. Не понимаю что не так.
S>>> версионирование+ НС>>Версионирование? О чем ты?
S>Мог что-то перепутать, просто k8 вроде бы может помогать с переходом с одной версии api на другую, т.е. S>работает и старая версия и новая потихоньку накатывается.
Это называется update rollout. И это одна из тех фич, которую мне пришлось велосипедить на прошлом проекте, который был монолитом (поверх VMSS, ага). Если тебе в твоем проекте наплевать на даунтайм, то это не потому что он монолит, а потому ваши продакты не требуют отсутствия даунтайма сервиса когда вы накатываете очередной апдейт. Как только понадобится — будете свое велосипедить.
S>>> много чего еще специфичного для мс. НС>>Что? Я вот так, навскидку, из крупного вспоминаю только балансировку гетерогенной нагрузки, которая монолиту не нужна в силу отсутствия самой возможность балансировки. Что еще? S>Не знаю,
Ну зашибись, чо.
S> это же не я предложил кубер для монолитов использовать. Вот и думайте что еще.
Ну вот, к примеру, update rollout чтобы руками не фигачить. Или автоскейлинг. Cron jobs. Init containers. Да даже, блин, банально Lens использовать для управления кластером. Мало?
Здравствуйте, Sharov, Вы писали:
S>Здравствуйте, VladiCh, Вы писали:
VC>>Ну это не обязательно, чтоб распределенный монолит получить это еще постараться надо. Это как — сервисы завязаны один на другой и не могут деплоиться независимо? VC>>Разные сервисы работают с одной и тем же слоем хранения? Ну как бы сделать то такое конечно можно, но кто в здравом уме будет?
S>Ну все сервисы зависят от авторизации например, и без этого сервиса ничего работать не будет. Также и возможны некоторые бизнес S>зависимости, т.е. доменные зависимости, которые и на уровне микросервисов сохраняются. Вот и распределенный монолит.
То что у них есть бизнес зависимости никак не означает, что они не могут деплоиться и скейлиться независимо.
Авторизация — ну и что авторизация? Есть какой-то внешний авторизационный сервис, который опять же релизится независимо и обычно является частью платформы, а не конкретного приложения.
Им все пользуются. И что?
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, Sharov, Вы писали:
НС>>>Ты перепутал причину и следствие. Не микросервисы требуют распределенной архитектуры, а распределенная архитектура микросервисов. Нет распределенности — не нужны никакие микросервисы. А потребность в распределенности определяется продуктовыми требованиями, а не архитектурой. S>>Ну а как до изобретения мс работал тот же гугл? Распределенная система была, микросервисов не было. S>>Сложный деплоймент, настройки, но система распределенная и нету никаких микросервисов. C>В Гугле была сервисная система с самого начала, со своим аналогом контейнеров. Не знаю про MS.
C>Сервисы были не "микро", это да. Но именно микро-сервисы не очень-то нужны.
Микро или нет — это понятие растяжимое конечно, но в каких-то пределах. "Микро" здесь для утверждения разницы по сравнению с монолитами. Чем больше сервис по размеру тем он ближе к монолиту и его проблемам и наоборот.
То есть в реальности существует спектр конечно, от сервисов поменьше до сервисов побольше, но на каком-то масштабе размер становится таким что проявляются уже проблемы специфические для монолитов
и значит этот сервис скорее всего нужно дробить на более мелкие.
Здравствуйте, VladiCh, Вы писали:
VC>То что у них есть бизнес зависимости никак не означает, что они не могут деплоиться и скейлиться независимо.
Не знаю, насколько это возможно и тем более правильно в мс арх-ре, но допустим при запуске сервису А
надо сходить в сервис В, т.е. без этого он не сможет работать. Соотв. у нас имеется четкая зависимость.
Речь идет именно об инициализации, я не думаю, что это правильно так делать в мс арх-ре, но вот надо.
И вот у нас зависимость при деплое. Про масштабирование не спорю.
Здравствуйте, Sharov, Вы писали:
НС>>Для монолитов точно так же нужна экспертиза в обращении с огромными объемами кода, S>А можно подробнее, что требуется? Знание шорткатов ide по навигации по коду, знание шорткатов по для всяческих S>рефакторингов? Кто-то и как проводит собеседования на выявление соотв. навыков и экспертизы?
В некоторых больших проектах не работает нормально даже автодополнение в IDE.
S>Ничего окромя классических паттренов GoF и ООП в голову не приходит, но кто сказал что для S>мс они не нужны? Ну, ок, еще DDD можно добавить. Для мс все ровно также + ...
Организация репозитория и структуры работы вокруг неё, тестирование (бывает, что тесты часами работают), и т.д.
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, Sharov, Вы писали:
НС>>>Для монолитов точно так же нужна экспертиза в обращении с огромными объемами кода, S>>А можно подробнее, что требуется? Знание шорткатов ide по навигации по коду, знание шорткатов по для всяческих S>>рефакторингов? Кто-то и как проводит собеседования на выявление соотв. навыков и экспертизы? C>В некоторых больших проектах не работает нормально даже автодополнение в IDE.
Ну т.е. требуется навык писать как минимум компилируемый код в блокноте, чтобы лишний раз компилятор не гонять, ибо долго?
Или как, к чему это замечание?
S>>Ничего окромя классических паттренов GoF и ООП в голову не приходит, но кто сказал что для S>>мс они не нужны? Ну, ок, еще DDD можно добавить. Для мс все ровно также + ... C>Организация репозитория и структуры работы вокруг неё, тестирование (бывает, что тесты часами работают), и т.д.
А к разработчику-то какие требования в связи с этим? Ну организовали репо, структуру работы с кодом.
Это делается один раз и в начале проекта. Ну понятно, приходится больше думать над кодом, т.к.
лишний раз гонять компилятор и тесты дорого. Довод, согласен. В мс с компиляцией проще, но думать
тоже желательно.
Здравствуйте, Sharov, Вы писали:
S>Здравствуйте, VladiCh, Вы писали:
VC>>То что у них есть бизнес зависимости никак не означает, что они не могут деплоиться и скейлиться независимо.
S>Не знаю, насколько это возможно и тем более правильно в мс арх-ре, но допустим при запуске сервису А S>надо сходить в сервис В, т.е. без этого он не сможет работать. Соотв. у нас имеется четкая зависимость. S>Речь идет именно об инициализации, я не думаю, что это правильно так делать в мс арх-ре, но вот надо. S>И вот у нас зависимость при деплое. Про масштабирование не спорю.
Не вижу где здесь зависимость при деплое. Сервис A деплоится отдельно, сервис B отдельно.
Соответственно у приложения есть часто изменяющиеся куски, которые могут деплоиться хоть по несколько раз в день, а есть части которые деплоятся раз в год.
То кто куда ходит при старте не имеет значения.
Это для сравнения с монолитом, который всегда деплоится целиком (что как бы очевидно, на то он и монолит).
Здравствуйте, VladiCh, Вы писали:
S>>Не знаю, насколько это возможно и тем более правильно в мс арх-ре, но допустим при запуске сервису А S>>надо сходить в сервис В, т.е. без этого он не сможет работать. Соотв. у нас имеется четкая зависимость. S>>Речь идет именно об инициализации, я не думаю, что это правильно так делать в мс арх-ре, но вот надо. S>>И вот у нас зависимость при деплое. Про масштабирование не спорю. VC>Не вижу где здесь зависимость при деплое. Сервис A деплоится отдельно, сервис B отдельно.
Темпоральная зависимость же -- сначала приходиться деплоить В, затем А. Это ниразу не критично,
но все же зависимость сохраняется хотя на уровне деплоя.
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Если у нас монолиты запущены на нескольких машинах -- через gateway или шину, то, наверное, можно говорить S>>о распр. системе. НС>Наверное?
Цепляетесь к словам? Прекрасно.
S>>Если я где-то (где?) утверждал обратное, то был неправ. НС>Ты утверждал что при разработке монолита знания о распределенных системах не нужны.
1) Возможно, хотелось бы цитату целиком.
2) Что нужно, можно грубо прикинуть.
Далее, у нас имеется разработчик модуля в монолите, который пишет сугубо свой доменный код, взаимодействует
с 2-3 другими модулями подсистемы, и ему для работы нужен доступ к бд. Он в курсе про ООП, паттерны, sql.
Все зависимости он получает через IoC, например, через конструктор.
Где у него могу возникнуть проблемы при работе над монолитом? Кроме бд я ничего такого больше не вижу,
все остальное находится в адресном пространстве процесса. Вот у нас возникли проблемы с бд по среди доменных
вычислений или бизнес операций, т.е. что-то не так
с сетью (одно из "The network is reliable", "Latency is zero", "Bandwidth is infinite" ). Что он
может сделать? Ну выставит таймаут, ну стрельнет таймаут, попробует повторить операцию, после
повторов ему ничего кроме как залоггировать ошибку и прокинуть исключение в вызывающий код
делать больше не надо. Более того, а что он собственно, кроме повторов может сделать?
О consistency думать ему не надо, за это движок бд отвечает или соседний модуль. Локально что-то сохранить?
Ну, зависит от. Про рестарты в рамках монолита думать ему тоже не надо.
Ну и что ему нужно знать о распределенных системах?
По сути кроме "The network is reliable",
т.е. могут быть проблемы со взаимодействием с бд, которые выражаются в таймауте, и которые
как-то через повторы можно обработать или прокинуть исключение наверх, больше особых знаний и не требуется.
Рассмотрим теперь ту же ситуацию, но в микросервисной арх-ре. Соотв. взаимодействие с 2-3 другими
модулями у нас распределено, т.е. через сеть. Далее цитата:
На архитектурном уровне вместе с микросервисами приходит eventual consistency. В монолите можно сделать большую транзакцию, в микросервисах — в целом нет. Распределенные транзакции идее микросервисов противоречат и технически вряд ли возможны (у каждого сервиса может быть свой стек технологий). Эта неконсистентность сразу вызывает вопросы надежности (reliability). Очень часто нужно уметь надежно доставлять состояние между сервисами. Или надежно знать, что данные не доставлены. А в HTTP есть состояние неопределенности. Запрос отправили, ответ не получили. И вот что это значит? Сервер запрос вообще не получил? Или получил, обработал, но ответ отправить не сумел? Поэтому практически в каждом с сервисе с зависимостями возникает необходимость повторов (retry) и соответствующих внутренних состояний. Кроме того, в сервисах с зависимостями есть проблема устойчивости (robustness). Например, сервис A вызывает сервис Б. Сервис Б обычно отвечал за 10 миллисекунд, а стал — за 10 секунд. Вопрос — что будет с сервисом A? Я видел ситуацию, когда пул HTTP-соединений между A->Б был установлен в настройки по умолчанию (и это было четыре соединения). Поэтому все операции выстраивались в длинную очередь и латентность ответов от А взлетала до небес.
Т.е. теперь взаимодействие с 2-3 другими модулями это лютый головняк -- много что может пойти не так, и это
многое надо уметь корректно обрабатывать. Т.е. требования к написанию кода многократно возросли, это теперь не просто
вызвать ф-ию. Это простое взаимодействие с 2-3 модулями, это еще даже до CAP не дошли. Да и сложности предметной области
никуда не делись.
The architecture introduces additional complexity and new problems to deal with, such as network latency, message format design,[50] Backup/Availability/Consistency (BAC),[51] load balancing and fault tolerance.[44] All of these problems have to be addressed at scale. The complexity of a monolithic application does not disappear if it is re-implemented as a set of microservices. Some of the complexity gets translated into operational complexity.[52] Other places where the complexity manifests itself is in increased network traffic and resulting slower performance. Also, an application made up of any number of microservices has a larger number of interface points to access its respective ecosystem, which increases the architectural complexity.[53] Various organizing principles (such as HATEOAS, interface and data model documentation captured via Swagger, etc.) have been applied to reduce the impact of such additional complexity.
В общем, дело дрянь -- знать надо до фига и больше, а не только со стула не падать.
S>>С трудом представляю такую арх-ру с RabbitMq. НС>Я вроде нигде не писал что нужно именно rmq использовать.
Зачем вообще mq какое-то использовать, если самодельного буффера за глаза хватит?
Здравствуйте, Sharov, Вы писали:
VC>>Не вижу где здесь зависимость при деплое. Сервис A деплоится отдельно, сервис B отдельно. S>Темпоральная зависимость же -- сначала приходиться деплоить В, затем А. Это ниразу не критично, S>но все же зависимость сохраняется хотя на уровне деплоя.
Это можно решить двумя путями (или даже обоими):
1. Сервис А может деплоиться и без сервиса B. Он просто ждёт когда станет доступным B и завершит свою инициализацию.
2. Сервис B сделать постоянно доступным. Запустить в нескольких экземплярах. Если один экземпляр упал/обновляется, обслуживанием сервиса А занимается другой экземпляр.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Явно не с этим. НС>Тогжа как понимать это? НС>
НС>Dockerfile писать надо? Надо. Т.е. надо изучать docker.
Ну, хорошо, используйте для монолитов docker. Я не против.
S>>Разработчику какого-нибудь компонента монолита зачем ломать об этом голову? НС>А кому ломать? Если компонент полагается на нетранзакционный персистентный стейт — кто должен бороться с последствиями сбоев? И чем, по твоему, нужно бороться авторам микросервисов?
Если. А если транзакционный?
НС>Вобщем, давай вместо общих фраз ты продемонстрируешь конкретную проблему, которую нужно решать в микросервисе и не нужно в монолите.
S>> Т.е. мы выяснили, что распределенная система может строится, например, на монолитах. НС>Не мы, а ты.
Я -- молодец!
S>>неверно. НС>Просто ты неверно понял что написано. Или сделал вид, когда аргументы кончились.
Просто у Вас в голове одно, а пишите другое. Бывает. На всякий случай, я все несостыковки процитировал.
S>>Или казуистикой, уводом темы в сторону, вопросом на вопрос или переходом на личности. НС>Переход на личности начался с того, что ты вместо аргументации начал применять обороты вроде "я не уверен". Ну и чего мне с твоей неуверенностью делать?
Я в пред. сообщение не мало написал в качестве аргументации, с ссылками. "Я не уверен" там не было. Речь про возросшие
требования к квалификции разработчиков мс.
НС>>>Да. Ты же зачем то пытаешься доказать что она другая. Да, другая. Но другая не значит больше. S>>Да, пытаюсь. От разработчиков мс требуется существенно больше компетенций в такой непростой среде как S>>распределенные системы.
НС>И существенно меньше в такой непростой среде как огромный монолитный проект. И? НС>При этом, как мы вроде бы разобрались, от компетенций в распределенности монолит нифига не спасает.
S>> Т.е. требуется больше экспертизы в распр. системах. НС>Или нет. Ты опять бросаешься бездоказательными утверждениями. Какой конкретно кейс будет проблемой, требующей особой экспертизы в микросервисах, и не будет в монолите?
S>>А можно подробнее, что требуется? НС>Огромное количество знаний и навыков, позволяющих создавать loosely coupled и high cohesion решения. Чем больше размер и сложность кода, тем больше ресурсов и умений надо вкладывать в архитектуру программного кода.
Телега впереди лошади, нет? Обычно когда у нас большой размер и сложность кода, архитектура давно выбрана.
При большом объеме кода и его сложности уже поздно, да и, наверное, проблематично выбирать арх-ру.
S>>Ничего окромя классических паттренов GoF и ООП в голову не приходит, но кто сказал что для S>>мс они не нужны? НС>Тебе точно надо объяснять, что важность и потребность в паттернах прямо зависит от объема кода? Что если у тебя кода десяток килобайт — тащить туда гору сложных паттернов не нужно?
Круть, т.е. паттерны надо применять после определенного кол-ва строчек кода? А он у всех паттернов разный, этот лимит?
MVC при каком кол-ве строчек кода разрешается использовать?
НС>>>и эта экспертиза куда дороже и реже, чем базовый стафф про микросервисы. S>>Возможно. Но, кмк, это экспертиза называется "умение читать и понимать код", НС>Нет, экспертиза называется умение писат легко читаемый и модифицируемый код.
Для мс этот навык не нужен? Мне кажется это навык нужен вообще для всего в мире разработки ПО.
НС>>>А кто то утверждал что у микросервисов нет недостатков? Даже я про некоторые писал тут. Ты опять ломишься в открытые двери. S>>Вы упорно отрицаете вот этот недостаток: S>>
S>> Skilled developers are required to work with microservices architecture which can identify the microservices and manage their inter-communications
НС>Ложь. Я отрицаю что монолит позволяет обойтись без skilled.
Согласен полностью. С этим вообще никто не спорит ибо глупо.
Конкретно я спорю с этим
Круто. Начинали с того что микросервисы нужны для того чтобы снизить требования к квалификации разработчиков (это design goal такой). А закончили тем что они требуют более выской квалификации.
it allows organizations developing software to grow fast, and big, as well as use off the shelf services easier. Communication requirements are less.
1)design goal Вы придумали сами, судя по всему, ибо вся наша дискуссия и мои аргументы к требованиям к квалификации говорят
об обратном.
2) Явно что-то путает не maxkar.
S>>Я тоже. НС>Да? А как тогда трактовать "я не уверен" в качестве аргумента?
Вы -- эксперт, я -- нет. Это было сразу заявлено. Что не так? Эксперты тоже могут ошибаться, они тоже люди.
S>> это же не я предложил кубер для монолитов использовать. Вот и думайте что еще. НС>Ну вот, к примеру, update rollout чтобы руками не фигачить. Или автоскейлинг. Cron jobs. Init containers. Да даже, блин, банально Lens использовать для управления кластером. Мало?
Здорово, кубер крутейшая вещь. Как-нибудь инвестирую свое время в эту технологию.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Нужно умение хорошо структурировать код. И чем больше размер монолита, тем важнее это умение.
Монолит здесь ни при чем. Размер проекта имеет значение независимо от монолитности.
НС>Интерфейсы языка программирования намного богаче и позволяют делать очень высокую связность, особенно если пользоваться ими неумело. А вот микросервисы принудительно вводят очень жесткие границы, не позволяющие высокой связности в силу специфики REST API.
Микросервис страхует всего лишь от побочных эффектов в других компонентах. При этом никто не мешает иметь рядом мутную солянку common, utils, helpers куда валят вообще все подряд, буквально. А бывает таких "пакето-репозиториев" не один, а куча. Тогда получается, что бы разобраться хотя бы в одном микросервисе, надо разобраться в 90% кода проекта Если вдруг фиксануть чего — кроме как чудом трудно предложить годный вариант, что бы ничего не сломать.
Здравствуйте, Sharov, Вы писали:
S>>>Если у нас монолиты запущены на нескольких машинах -- через gateway или шину, то, наверное, можно говорить S>>>о распр. системе. НС>>Наверное? S>Цепляетесь к словам? Прекрасно.
Это не к словам, это к сути.
НС>>Ты утверждал что при разработке монолита знания о распределенных системах не нужны. S>1) Возможно, хотелось бы цитату целиком.
На счет требований к инженерам -- ну вот какие навыки нужны от программиста в монолитном сервисе? Язык, предметная область, sql+ еще какой-нибудь dsl, паттерны проектирования. Требования к программисту микросервисов -- тоже самое + знание распределенных систем, ну хотя бы на уровне Fallacies&pitfalls of distr. computing, типа что сеть не надежна,
S>Где у него могу возникнуть проблемы при работе над монолитом?
Там же, где и у микросервисов — при наличии расшариваемого между инстансами стейта. А если стейт не шарится, то и у микросервисов с распределенностью проблем особых нет.
S>Кроме бд я ничего такого больше не вижу,
Да действительно, такая мелочь — БД. Правда, если подумать, помимо БД есть еще редис, твой любимый кролик, прометей, эластик, сторадж облачный, балансер/ингресс. А опционально еще какой нибудь консул/волт или аналоги, opa. А есть ведь еще обычно какой то фронт, иногда не один, да?
S>все остальное находится в адресном пространстве процесса.
Это только если у тебя опять монолит это строго одна машина. А если несколько инстансов у нее?
S>может сделать? Ну выставит таймаут, ну стрельнет таймаут, попробует повторить операцию
Или воткнуть кролик, да?
S>делать больше не надо. Более того, а что он собственно, кроме повторов может сделать?
А что может сделать автор микросервиса?
S>О consistency думать ему не надо, за это движок бд отвечает или соседний модуль.
Так и микросервисы обычно stateless, а стейт, внезапно, где то в БД.
S>Ну, зависит от. Про рестарты в рамках монолита думать ему тоже не надо.
Надо. Пишешь ты на локальный диск в файл, и тут рестарт. На диске — мусор. Думать не надо, да? Отличный рецепт.
S>По сути кроме "The network is reliable",
Скажу тебе по секрету — если ты в микросервисах на внутрикластерную сеть забьешь и будешь считать что "The network is reliable", то, скорее всего, ничего совсем уж ужасного не случится, вероятность сбоя там крайне мала.
S>как-то через повторы можно обработать или прокинуть исключение наверх, больше особых знаний и не требуется.
Ты не поверишь, но в микросервисах все тоже самое.
S>На архитектурном уровне вместе с микросервисами приходит eventual consistency.
Или не приходит. А если приходит, то эта забота ложится на плечи готовых решений типа тех же nosql БД.
S> В монолите можно сделать большую транзакцию
В распределенном монолите — нельзя.
S>В общем, дело дрянь -- знать надо до фига и больше, а не только со стула не падать.
Ты реально игноришь все что я пишу. Надо знать специфику не означает надо знать больше. У монолитов своя специфика. Я уж не говорю о том, что ничего не знать про распределенные системы в монолите можно только в вырожденном случае, когда не нужно ни скейлинга ни НА.
Для примера — тебе, в силу перфоманса твоих хранилищ, понадобился шардинг. Ты правда думаешь, что в монолите при этом можно не обладать теми самыми специфичными знаниями про распределенные системы?
S>>>С трудом представляю такую арх-ру с RabbitMq. НС>>Я вроде нигде не писал что нужно именно rmq использовать. S>Зачем вообще mq какое-то использовать, если самодельного буффера за глаза хватит?
Именно это я и предложил. Опять ты ломишься в открытые двери.
Здравствуйте, Sharov, Вы писали:
S>Ну, хорошо, используйте для монолитов docker. Я не против.
Т.е. знание докера из уравнения убираем.
S>>>неверно. НС>>Просто ты неверно понял что написано. Или сделал вид, когда аргументы кончились. S>Просто у Вас в голове одно, а пишите другое.
Просто я не собираюсь раскрывать в каждой фразе весь контекст полностью, полагаюсь на сообразительность собеседника. Писать с постоянной оглядкой за возможность прицепиться к слову я не буду, мне такая беседа неинтересна.
S>>>А можно подробнее, что требуется? НС>>Огромное количество знаний и навыков, позволяющих создавать loosely coupled и high cohesion решения. Чем больше размер и сложность кода, тем больше ресурсов и умений надо вкладывать в архитектуру программного кода. S>Телега впереди лошади, нет?
Моя твоя непонимать.
S>Обычно когда у нас большой размер и сложность кода, архитектура давно выбрана.
Серьезно? Ты еще веришь что архитектуру можно заранее выбрать и больше к ней не возвращаться?
S>При большом объеме кода и его сложности уже поздно, да и, наверное, проблематично выбирать арх-ру.
Нет, не поздно. Рефакторинг, по твоему, для чего нужен?
НС>>Тебе точно надо объяснять, что важность и потребность в паттернах прямо зависит от объема кода? Что если у тебя кода десяток килобайт — тащить туда гору сложных паттернов не нужно? S>Круть, т.е. паттерны надо применять после определенного кол-ва строчек кода?
Открыл для себя новое?
S>А он у всех паттернов разный, этот лимит?
Конечно.
S>MVC при каком кол-ве строчек кода разрешается использовать?
Не надо все сводить до абсурда. Давай я тебе примером проиллюстрирую. Вот есть такой паттерн Посетитель. Если у тебя 2 реализации — точно нужно его использовать, вместо того чтобы написать просто свитч? А если реализаций 50 штук — разумно ли будет писать свитч на 50 кейсов?
Еще примеры — будешь ли ты в небольшой консольной утилитке использовать DI container? А в большом веб-сервисе? Нужно ли выделять DAL в отдельный слой, если в DAL всего пара примитивных методов? Нужно ли использовать CQRS если у тебя в публичном API методов штук 5? Нужно ли использовать chain of responsibility, если у тебя всего один аспект и вероятность что появится еще один низка?
И дело не только в паттернах. Нужно ли разбивать на сборки/dll проект из десятка кб исходников? А проект из сотни мб?
НС>>Нет, экспертиза называется умение писат легко читаемый и модифицируемый код. S>Для мс этот навык не нужен?
Менее важен.
S> Мне кажется это навык нужен вообще для всего в мире разработки ПО.
Это не битовый флаг, есть/нет.
S>Согласен полностью. С этим вообще никто не спорит ибо глупо.
Тогда тебе таки придется доказать, что для микросервисов скилов нужно больше.
Давай проиллюстрирую. Вот создание современного фронта на каком нибудь реакте требует определенных специфических знаний по сравнению с классическим каким нибудь фреймворком с серверным рендерингом — JS, сам реакт. Значит ли это, что создание фронта на реакте требует большей квалификации, чем создание фронта, скажем, на ASP.NET MVC с разором?
S>>>Я тоже. НС>>Да? А как тогда трактовать "я не уверен" в качестве аргумента? S>Вы -- эксперт, я -- нет. Это было сразу заявлено. Что не так?
То что ты, не являясь экспертом, при этом используешь свою неуверенность в качестве аргумента. Если ты не уверен, пиши "я не уверен потому что ...", а дальше подробно, что конкретно вызывает у тебя сомнения.
Здравствуйте, Ikemefula, Вы писали:
НС>>Нужно умение хорошо структурировать код. И чем больше размер монолита, тем важнее это умение. I>Монолит здесь ни при чем. Размер проекта имеет значение независимо от монолитности.
Монолит еще как причем, потому что порождает проекты с размером другого порядка по сравнению с микросервисом.
НС>>Интерфейсы языка программирования намного богаче и позволяют делать очень высокую связность, особенно если пользоваться ими неумело. А вот микросервисы принудительно вводят очень жесткие границы, не позволяющие высокой связности в силу специфики REST API. I>Микросервис страхует всего лишь от побочных эффектов в других компонентах.
Всего лишь. Чувак, я тебе больше скажу — вся архитектура строится поверх ровно двух вещей, loosely coupling и high cohesion. Все остальные принципы и паттерны предназначены чтобы этого достигнуть. Так что да, микросервисы это "всего лишь" способ получить loosely coupling и high cohesion, сущая мелочь для больших систем.
I>При этом никто не мешает иметь рядом мутную солянку common, utils, helpers куда валят вообще все подряд, буквально.
Я тебе напомню — в микросервисах предполагается, что команды тоже поделены по микросервисам. И общаются микросервисы только через REST API, это гарантируется структурой деплоймента. Так что солянку в таких условиях надо специально и злонамеренно устраивать.
I>А бывает таких "пакето-репозиториев" не один, а куча. Тогда получается, что бы разобраться хотя бы в одном микросервисе, надо разобраться в 90% кода проекта
Это совсем плохие, негодные микросервисы, не имеющие права использовать гордое имя микросервисной архитектуры.
Здравствуйте, Ночной Смотрящий, Вы писали:
I>>Монолит здесь ни при чем. Размер проекта имеет значение независимо от монолитности.
НС>Монолит еще как причем, потому что порождает проекты с размером другого порядка по сравнению с микросервисом.
Нужно сравнивать не монолит с микросервисом, а одну реализацию системы с другой. То есть монолитную реализацию с микросервисной.
I>>А бывает таких "пакето-репозиториев" не один, а куча. Тогда получается, что бы разобраться хотя бы в одном микросервисе, надо разобраться в 90% кода проекта
НС>Это совсем плохие, негодные микросервисы, не имеющие права использовать гордое имя микросервисной архитектуры.
Здравствуйте, Sharov, Вы писали:
VC>>Не вижу где здесь зависимость при деплое. Сервис A деплоится отдельно, сервис B отдельно. S>Темпоральная зависимость же -- сначала приходиться деплоить В, затем А. Это ниразу не критично, S>но все же зависимость сохраняется хотя на уровне деплоя.
Кстати, тут как раз интересная особенность есть. Сервисные приложения обычно работают 24/7, без перерывов. И API обычно эволюционирует так, что обратная совместимость никогда не ломается сразу.
Но есть исключение — развёртывание инфраструктуры с нуля. И иногда оказывается, что между сервисами в какой-то момент возникли циклические зависимости. Например, в AWS при развёртывании нового региона, в какой-то момент времени приходилось на начальном этапе использовать DynamoDB и S3 из другого региона. Впоследствии были написаны специальные мини-версии S3 и DDB, которые были достаточным для начального запуска.
Здравствуйте, Ikemefula, Вы писали:
НС>>Монолит еще как причем, потому что порождает проекты с размером другого порядка по сравнению с микросервисом. I>Нужно сравнивать не монолит с микросервисом, а одну реализацию системы с другой. То есть монолитную реализацию с микросервисной.
Зачем, если в микросервисах разработка микросервисов независима? Там, безусловно, есть и вопросы сложности системы в целом, но эти вопросы вынесены за пределы компетенции разработчиков сервиса.
НС>>Это совсем плохие, негодные микросервисы, не имеющие права использовать гордое имя микросервисной архитектуры. I>Ога. Это как бы вариант нормы.
Здравствуйте, Ночной Смотрящий, Вы писали:
I>>Нужно сравнивать не монолит с микросервисом, а одну реализацию системы с другой. То есть монолитную реализацию с микросервисной.
НС>Зачем, если в микросервисах разработка микросервисов независима?
Совсем необязательно. Нормой является и подход, когда кучка микросервисов мейнтейнятся одной командой. Главное, что бы не было мейнтенанса одного микросервиса разными командами.
Здравствуйте, Ikemefula, Вы писали:
I>>>Нужно сравнивать не монолит с микросервисом, а одну реализацию системы с другой. То есть монолитную реализацию с микросервисной. НС>>Зачем, если в микросервисах разработка микросервисов независима? I>Совсем необязательно.
Обязательно. Иначе это не микросервисы.
I> Нормой является и подход, когда кучка микросервисов мейнтейнятся одной командой.
А другая кучка — другой. А если все микросервисы маинтейнятся одной командой, то в проект такого размера микросервисы втащили очень зря. Если команда только одна ты получаешь все минусы микросервисов и не получаешь почти никаких плюсов.
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Ну, хорошо, используйте для монолитов docker. Я не против. НС>Т.е. знание докера из уравнения убираем.
Типа необходимо уметь им пользоваться и понимать для чего он нужен, так?
Ну т.е. у нас не только сложная кодовая база, при которой натурально в блокноте
приходится писать,
но теперь и докер впихнули. Фортануло, че!
S>>Просто у Вас в голове одно, а пишите другое. НС>Просто я не собираюсь раскрывать в каждой фразе весь контекст полностью, полагаюсь на сообразительность собеседника. Писать с постоянной оглядкой за возможность прицепиться к слову я не буду, мне такая беседа неинтересна.
Т.е., еще разок, вот это вот
НС>Ты перепутал причину и следствие. Не микросервисы требуют распределенной архитектуры, а распределенная архитектура микросервисов.
утверждение неверно, т.к., например, в работах Лесли Лэмпорта годах в 70-х про консенсус в расп. системах ни слова
про микросервисы. Вместо того, чтобы просто признать собственную неточность, использовались следующие отговорки:
1)выхолащенный контекст;
2)я не умею читать
3)(мы здесь)имеется некий скрытый подтекст, т.е. контекст раскрыт не полностью. Т.е. я что-то написал, догадайтесь что
я написал. С нетерпением жду 4-й вариант. Не разочаруйте.
S>>Обычно когда у нас большой размер и сложность кода, архитектура давно выбрана. НС>Серьезно? Ты еще веришь что архитектуру можно заранее выбрать и больше к ней не возвращаться?
Представляете! Такое может быть! Например сейчас в фаворе микросервисная арх-ра. Т.е. на начальных
стадиях это обычно обговаривается и далее идет разработка в соотв. с выбранной арх-ой. Арх-ра может и меняться,
конечно, перенос монолитной арх-ры на мс арх-ру. Но заранее выбрать таки можно.
S>>При большом объеме кода и его сложности уже поздно, да и, наверное, проблематично выбирать арх-ру. НС>Нет, не поздно. Рефакторинг, по твоему, для чего нужен?
Рефакторинг арх-ры? Можно, конечно, но чем это лучше чем переписать с нуля?
S>>Круть, т.е. паттерны надо применять после определенного кол-ва строчек кода? НС>Открыл для себя новое?
Да, буду пользоваться теперь.
S>>А он у всех паттернов разный, этот лимит? НС>Конечно.
S>>MVC при каком кол-ве строчек кода разрешается использовать?
НС>Не надо все сводить до абсурда. Давай я тебе примером проиллюстрирую. Вот есть такой паттерн Посетитель. Если у тебя 2 реализации — точно нужно его использовать, вместо того чтобы написать просто свитч? А если реализаций 50 штук — разумно ли будет писать свитч на 50 кейсов?
50 это хорошо, а почему не 49? Свитч на 49 разумно, а на 36 свитч разумно? Вы понимаете всю абсурдность Ваших аргументов?
НС>И дело не только в паттернах. Нужно ли разбивать на сборки/dll проект из десятка кб исходников? А проект из сотни мб?
Нет, дело именно в паттернах. Я первый раз услышал про количественные метрики применения паттернов, типа
49 свитчей еще рано, а вот 50 уже самое то.
НС>>>Нет, экспертиза называется умение писат легко читаемый и модифицируемый код. S>>Для мс этот навык не нужен? НС>Менее важен.
Докажите, ибо мне видится ровно наоборот -- в больших системах много кода писать не надо,
они написаны, работают, на код стараются не дышать. Да и затруднительно это, писать много
кода в блокноте (см. ссылку выше). Скорее важно уметь читать, т.е. для монолитов важен
навык чтения и понимания. А вот при переходе на мс арх-ру код приходится писать.
Т.е. не менее, а более.
S>> Мне кажется это навык нужен вообще для всего в мире разработки ПО. НС>Это не битовый флаг, есть/нет.
Тем более, к чему тогда был этот довод?
S>>Вы -- эксперт, я -- нет. Это было сразу заявлено. Что не так? НС>То что ты, не являясь экспертом, при этом используешь свою неуверенность в качестве аргумента. Если ты не уверен, пиши "я не уверен потому что ...", а дальше подробно, что конкретно вызывает у тебя сомнения.
Я с самого начала написал, что у меня нету опыта работы над мс арх-ой. Поэтому я стараюсь максимально цитировать более опытных
инженеров, либо внешние источники типа вики. Вот вся моя аргументация.
Кодом людям нужно помогать!
Re[21]: О микросервисах -- требования к квалификации.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Тогда тебе таки придется доказать, что для микросервисов скилов нужно больше.
Ну давайте еще разок, попробую это как-то обосновать, ибо не знаю как это логически строго можно доказать.
Буду цитировать свой пред. ответ -- http://rsdn.org/forum/design/8190064.1:
Итак, мы начали с противоположенного мнения к требования квалификации разработчиков в проектах
с микросервисной арх-ой. Я утверждаю, что требования к квалификации разработчиков на подобных проектах выше, Вы -- что ниже.
У меня нету практического опыта над подобными проектами и я об этом сразу оговорился.
Поэтому в своих наблюдениях опираюсь на умозрительные и косвенные наблюдения.
1) Когда человек работает в мс арх-рах ему необходимо вот это все время держать в голове
-- https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing
Т.е. это не самая простая среда для программирования, требует определенной подготовки, т.е.
как минимум знать и понимать о чем пишут по ссылке. Для монолита, в силу высокой связанности,
многие вещи по приведенной выше ссылки не актуальны. Все натурально может быть в одном адр. пр-ве.
Но на мн-ве серверов, да.
2) Вакансии на хх стали изобиловать некоторым кол-вом новых баззвордов типа докер, k8, инструменты
мониторинга и т.п. Все это требует инвестиций на изучение, и вообще это новые требования к разработчикам,
которых лет 5 назад еще не было. Т.е. вроде обещали простоту, а по факту новые баззворды.
И да, речь идет именно об изучение, чтобы понимать, что под капотом, а не просто черный ящик.
3) За бугром, во фаанг и, следовательно, много где еще, появился новый этап в собеседованиях под
названием System design interview. Есть смутные подозрения, что едва ли людей дрючат на этом
этапе для работы над монолитными арх-ми. Стало быть дело в чем-то другом, в других арх-ых
подходах. Беру на себя смелость (без доказательств!) утверждать, что это необходимо для
разработчиков в микросервисных проектах. Подготовка, т.е. курсы, книги, ютюб, к подобным
интервью это некий прирост в экспертизе и навыках разработчиков. Т.е. помимо всего прочего --
знание языка, бд, dsl вроде sql, предметной области (желательно), добавляется целый пласт
необходимых знаний. С чего это вдруг, когда некоторые утверждают что мс арх-ра чудо как
хороша и разрабатывалась с учетом того, что над соотв. проектами могут работать программисты не самый высокой квалификации.
Натурально со стула не падают -- и хорошо! Дальше мс арх-ра + девопсы вывезут.
. И по косвенным признаками что-то такое говорит SkyDance,
дескать легко злоупотребить и улететь в распределенный монолит. Едва ли квалифицированные
разработчики такое смогут учудить.
Cognitive load
The architecture introduces additional complexity and new problems to deal with, such as network latency, message format design,[50] Backup/Availability/Consistency (BAC),[51] load balancing and fault tolerance.[44] All of these problems have to be addressed at scale. The complexity of a monolithic application does not disappear if it is re-implemented as a set of microservices. Some of the complexity gets translated into operational complexity.[52] Other places where the complexity manifests itself is in increased network traffic and resulting slower performance. Also, an application made up of any number of microservices has a larger number of interface points to access its respective ecosystem, which increases the architectural complexity.[53] Various organizing principles (such as HATEOAS, interface and data model documentation captured via Swagger, etc.) have been applied to reduce the impact of such additional complexity.
Давайте поймем, что написано:
The architecture introduces additional complexity and new problems to deal with, such as network latency, message format design,[50] Backup/Availability/Consistency (BAC),[51] load balancing and fault tolerance.[44] All of these problems have to be addressed at scale
Т.е. появилось что-то новенькое, чего раньше либо не было, либо было немного. Т.е. надо что-то изучить. "Все время бежать, чтобы
оставаться на месте"(с)
The complexity of a monolithic application does not disappear if it is re-implemented as a set of microservices.
Т.е. сложность монолитов и доменов никуда не делась, все на месте. Но от нас требуют что-то большее. Но есть и хорошие новости
Some of the complexity gets translated into operational complexity.
Т.е. девопсы помогут. Остается понять, смогут ли они помочь настолько, чтобы сработало вот это:
НС>Круто. Начинали с того что микросервисы нужны для того чтобы снизить требования к квалификации разработчиков (это design goal такой).
Вопрос, конечно, открытый. Далее:
Other places where the complexity manifests itself is in increased network traffic and resulting slower performance. Also, an application made up of any number of microservices has a larger number of interface points to access its respective ecosystem, which increases the architectural complexity.
Да,тут, конечно, тяжко приходится. Но не все так плохо:
Other places where the complexity manifests itself is in increased network traffic and resulting slower performance. Also, an application made up of any number of microservices has a larger number of interface points to access its respective ecosystem, which increases the architectural complexity.
В общем есть надежда, что жить станет лучше, жить станет веселей.(с)
НС>Круто. Начинали с того что микросервисы нужны для того чтобы снизить требования к квалификации разработчиков (это design goal такой). А закончили тем что они требуют более выской квалификации.
НС>[q]
НС>it allows organizations developing software to grow fast, and big, as well as use off the shelf services easier. Communication requirements are less.
НС>https://en.wikipedia.org/wiki/Microservices
[/q]
1) Что за design goal такой? Кто автор(ы)? Можно какие-то ссылки и конкретику кроме общих слов от себя?
2) Какая связь между
it allows organizations developing software to grow fast, and big, as well as use off the shelf services easier. Communication requirements are less.
и квалификацией? Почему это как-то должно влиять на квалификацию, а особенно снижает требования к ней?
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Где у него могу возникнуть проблемы при работе над монолитом? НС>Там же, где и у микросервисов — при наличии расшариваемого между инстансами стейта. А если стейт не шарится, то и у микросервисов с распределенностью проблем особых нет.
А если шарится, а что надо, чтобы не шарилось?
S>>Кроме бд я ничего такого больше не вижу, НС>Да действительно, такая мелочь — БД. Правда, если подумать, помимо БД есть еще редис, твой любимый кролик, прометей, эластик, сторадж облачный, балансер/ингресс. А опционально еще какой нибудь консул/волт или аналоги, opa. А есть ведь еще обычно какой то фронт, иногда не один, да?
Если подумать, то он не один программист на проекте. Есть специально обученные люди, которые в это умеют. У него
хватает сложностей в предметной области (расчеты какие-нибудь нетривиальные) + возможные проблемы при взаимодействии
с бд. Т.е. от него все это скрыто, и он получает как данное. (Наглый он, конечно, но ничего, при переходе на мс
арх-ру многие вещи из перечисленного его догонят, пускай не расслабляется!).
S>>все остальное находится в адресном пространстве процесса. НС>Это только если у тебя опять монолит это строго одна машина. А если несколько инстансов у нее?
И? Ну буду шарить бд или очередь, нашему программисту что с этого?
S>>может сделать? Ну выставит таймаут, ну стрельнет таймаут, попробует повторить операцию НС>Или воткнуть кролик, да?
Именно, у нас так -- если монолит упал, при рестарте попытается еще разок обработать сообщение.
Т.е. про рестарт думать особо не надо -- "все само".
S>>делать больше не надо. Более того, а что он собственно, кроме повторов может сделать? НС>А что может сделать автор микросервиса?
Если работает с другим модулем, как-то надо восстановить или сохранить консистентность. Для бд особой разницы не будет.
S>>О consistency думать ему не надо, за это движок бд отвечает или соседний модуль. НС>Так и микросервисы обычно stateless, а стейт, внезапно, где то в БД.
А если не stateless?
S>>Ну, зависит от. Про рестарты в рамках монолита думать ему тоже не надо. НС>Надо. Пишешь ты на локальный диск в файл, и тут рестарт. На диске — мусор. Думать не надо, да? Отличный рецепт.
Либо думать, либо все с нуля -- если с нуля дорого, то думать.
S>>По сути кроме "The network is reliable", НС>Скажу тебе по секрету — если ты в микросервисах на внутрикластерную сеть забьешь и будешь считать что "The network is reliable", то, скорее всего, ничего совсем уж ужасного не случится, вероятность сбоя там крайне мала.
Буду иметь в виду, благодарю.
S>>как-то через повторы можно обработать или прокинуть исключение наверх, больше особых знаний и не требуется. НС>Ты не поверишь, но в микросервисах все тоже самое.
Наверх в случае мс это куда, и что делать -- пытаться достучаться или падать?
S>>На архитектурном уровне вместе с микросервисами приходит eventual consistency. НС>Или не приходит. А если приходит, то эта забота ложится на плечи готовых решений типа тех же nosql БД.
Да, но это надо еще изучить. Это не входило в компетенции нашего монолитного разработчика.
S>>В общем, дело дрянь -- знать надо до фига и больше, а не только со стула не падать. НС>Ты реально игноришь все что я пишу. Надо знать специфику не означает надо знать больше. У монолитов своя специфика. Я уж не говорю о том, что ничего не знать про распределенные системы в монолите можно только в вырожденном случае, когда не нужно ни скейлинга ни НА.
Что нужно знать нашему разработчику для HA? Что-то кроме транзакций?
НС>Для примера — тебе, в силу перфоманса твоих хранилищ, понадобился шардинг. Ты правда думаешь, что в монолите при этом можно не обладать теми самыми специфичными знаниями про распределенные системы?
Для этого есть специально обученные люди.
S>>Зачем вообще mq какое-то использовать, если самодельного буффера за глаза хватит? НС>Именно это я и предложил. Опять ты ломишься в открытые двери.
Вы предложили брокер сделать in-proc:
НС>Все обработчики на одной машине, при этом message broker выделен в отдельный сервис — тоже весьма странное решение. message broker предназначен для решения двух основных задач — fault tolerance и buffering. Первое в первую очередь потребует HA, которого при одном инстансе нет, а уж потом очереди, а второе при одном инстансе намного проще и эффективнее сделать in process.
Здравствуйте, Sharov, Вы писали:
S>>>Где у него могу возникнуть проблемы при работе над монолитом? НС>>Там же, где и у микросервисов — при наличии расшариваемого между инстансами стейта. А если стейт не шарится, то и у микросервисов с распределенностью проблем особых нет. S>А если шарится, а что надо, чтобы не шарилось?
Непонятно.
S>Если подумать, то он не один программист на проекте.
Но в монолите все связано намного сильнее. У тебя программист на проекте напишет код, которых жрет CPU или память, и проблемы начнутся во всем сервисе.
НС>>Это только если у тебя опять монолит это строго одна машина. А если несколько инстансов у нее? S>И? Ну буду шарить бд или очередь
И чем это отличается от микросервисов?
S>>>может сделать? Ну выставит таймаут, ну стрельнет таймаут, попробует повторить операцию НС>>Или воткнуть кролик, да? S>Именно,
И получаем ровно ту же распределенную схему, что и у микросервисов.
S>Т.е. про рестарт думать особо не надо -- "все само".
А почему в микросервисах надо?
S>>>делать больше не надо. Более того, а что он собственно, кроме повторов может сделать? НС>>А что может сделать автор микросервиса? S>Если работает с другим модулем, как-то надо восстановить или сохранить консистентность.
Какую такую консистентность?
S>>>О consistency думать ему не надо, за это движок бд отвечает или соседний модуль. НС>>Так и микросервисы обычно stateless, а стейт, внезапно, где то в БД. S>А если не stateless?
То это фиговый микросервис.
S>>>Ну, зависит от. Про рестарты в рамках монолита думать ему тоже не надо. НС>>Надо. Пишешь ты на локальный диск в файл, и тут рестарт. На диске — мусор. Думать не надо, да? Отличный рецепт. S>Либо думать, либо все с нуля -- если с нуля дорого, то думать.
Т.е. думать таки надо и никакого отличия от микросервисов нет.
S>>>как-то через повторы можно обработать или прокинуть исключение наверх, больше особых знаний и не требуется. НС>>Ты не поверишь, но в микросервисах все тоже самое. S>Наверх в случае мс это куда, и что делать -- пытаться достучаться или падать?
У тебя есть еще какие то варианты?
S>>>На архитектурном уровне вместе с микросервисами приходит eventual consistency. НС>>Или не приходит. А если приходит, то эта забота ложится на плечи готовых решений типа тех же nosql БД. S>Да, но это надо еще изучить.
Как и в монолите.
S>Это не входило в компетенции нашего монолитного разработчика.
Чего вдруг? Монолит каким то волшебным образом избавлен от необходимости использовать БД или шардинг в ней?
S>Что нужно знать нашему разработчику для HA? Что-то кроме транзакций?
А что нужно знать разработчику микросервиса?
НС>>Для примера — тебе, в силу перфоманса твоих хранилищ, понадобился шардинг. Ты правда думаешь, что в монолите при этом можно не обладать теми самыми специфичными знаниями про распределенные системы? S>Для этого есть специально обученные люди.
А в микросервисах их почему то нет? И специальных людей недостаточно. В том же редисе при переходе на кластер надо править прикладной код чтобы правильно формировать ключи и избегать перекоса в сторону одной из нод из-за плохих значений.
S>>>Зачем вообще mq какое-то использовать, если самодельного буффера за глаза хватит? НС>>Именно это я и предложил. Опять ты ломишься в открытые двери.
S>Вы предложили брокер сделать in-proc:
S>
НС>>Все обработчики на одной машине, при этом message broker выделен в отдельный сервис — тоже весьма странное решение. message broker предназначен для решения двух основных задач — fault tolerance и buffering. Первое в первую очередь потребует HA, которого при одном инстансе нет, а уж потом очереди, а второе при одном инстансе намного проще и эффективнее сделать in process.
У тебя как то с пониманием текста не очень. Попробуй перечитать внимательно что ты процитировал и понять, что такое "второе" (нет, не message broker).
Здравствуйте, Sharov, Вы писали:
S>Типа необходимо уметь им пользоваться и понимать для чего он нужен, так? S>Ну т.е. у нас не только сложная кодовая база, при которой натурально в блокноте
приходится писать, S>но теперь и докер впихнули. Фортануло, че!
Опять ничего не понял. Ты точно понимаешь что такое докер и длоя чего он нужен.
S>>>Обычно когда у нас большой размер и сложность кода, архитектура давно выбрана. НС>>Серьезно? Ты еще веришь что архитектуру можно заранее выбрать и больше к ней не возвращаться? S>Представляете!
Представляю. На этом, пожалуй, разговор окончательно потерял смысл.
S>>>При большом объеме кода и его сложности уже поздно, да и, наверное, проблематично выбирать арх-ру. НС>>Нет, не поздно. Рефакторинг, по твоему, для чего нужен? S>Рефакторинг арх-ры? Можно, конечно, но чем это лучше чем переписать с нуля?
Ты точно понимаешь что такое рефакторинг?
НС>>Не надо все сводить до абсурда. Давай я тебе примером проиллюстрирую. Вот есть такой паттерн Посетитель. Если у тебя 2 реализации — точно нужно его использовать, вместо того чтобы написать просто свитч? А если реализаций 50 штук — разумно ли будет писать свитч на 50 кейсов? S>50 это хорошо, а почему не 49? Свитч на 49 разумно, а на 36 свитч разумно? Вы понимаете всю абсурдность Ваших аргументов?
На вопрос ответь.
НС>>И дело не только в паттернах. Нужно ли разбивать на сборки/dll проект из десятка кб исходников? А проект из сотни мб? S>Нет, дело именно в паттернах
Ты точно лучше меня знаешь что я имел в виду?
S>. Я первый раз услышал про количественные метрики применения паттернов
Количество, оно со временем переходит в качество, слышал про такое?
S>, типа 49 свитчей еще рано, а вот 50 уже самое то.
Сам придумал, сам посмеялся.
S>Докажите
Я тут вполне достаточно уже обосновал почему. Не в коня корм.
S>, ибо мне видится
О, опять началось.
S>Скорее важно уметь читать, т.е. для монолитов важен навык чтения и понимания. А вот при переходе на мс арх-ру код приходится писать.
Ты сам прочти что ты пишешь. В монолите писать код не надо?
S>>> Мне кажется это навык нужен вообще для всего в мире разработки ПО. НС>>Это не битовый флаг, есть/нет. S>Тем более, к чему тогда был этот довод?
К тому что чем выше требования к определенной экспертизе, тем выше нужна квалификация программиста. Маленький микросервис напишет обычный миддл, а ковыряться в огромном монолите не каждый сеньор потянет.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Это с точки зрения программиста. А с точки зрения продукта основная проблема — долгие большие релизы, и, как следствие, неконкурентный time to market новых фич.
У меня другой опыт. При прочих равных (количество фич и их сложность) в монолит вносить изменения быстрее и дешевле.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Микросервисы это, во главе угла, прежде всего про процессы разработки. А архитектура это уже следствие. НС>Основное ради чего весь этот сыр-бор — максимальная изоляция компетенций по единицам деплоймента. Т.е. каждая конкретная команда решает свою узкую задачу независимо. Максимально независимо. И изменения деплоятся тоже независимо. А вот чтобы это обеспечить как раз и придумана та туча микросервисных технологий. НС>Монолит же, это когда у нас есть одна большая суперкоманда (пусть и состоящая внутри из нескольких команд), которая и обладает всеми необходимыми компетенциями. Характерный признак монолита — большие релизы, когда несколько разных сервисов, пусть и написанных разными командами, в итоге где то собираются в единое целое, и это целое сперва тестируется именно как целое, а затем и деплоится целиком. А сколько там физических сервисов и как расшарена БД — совершенно пофигу.
В целях микросервисов ты прав, но даешь свое определение монолита. Монолит это единица деплоймента (архитектура межмодульного взимодействия, организация кодовой базы и ее CI/CD цикла). Сколько команд разрабатывают и как — дело десятое.
Микросервисы это в первую очередь архитектура, призванная очень дорого решить проблемы границ команд, которые не вышло решить другими методами.
К примеру в монолите СПА-фронт и бэк могут составлять одну консистентную кодовую базу (и единицу деплоймента), но их разработка разными командами будет идти ничуть не хуже, а иногда и лучше чем если бы они жили и деплоились отдельно друг от друга.
Границы модулей можно провести и внутри монолита, какой-то общий код будет изредка правиться одновременно и все (проблема консистености контрактов и доки на них в микросервисах ничуть не проще). И в монолите могут быть команды, которые отвечают за какое-то направление в продукте и релизят фичи независимо от других. Проблемы коммуникации и незнания того, что делают другие команды в целом отличаются не сильно.
Давай на примерах, налоговая стала требовать в чеках новое поле, чем будут отличаться процессы в разных архитектурах?
Re[22]: О микросервисах -- требования к квалификации.
S>Итак, мы начали с противоположенного мнения к требования квалификации разработчиков в проектах S>с микросервисной арх-ой. Я утверждаю, что требования к квалификации разработчиков на подобных проектах выше, Вы -- что ниже.
Вы оба правы.
В "микросервисной" архитектуре всю сложность выгружают на "инфраструктуру", и там требования к квалификации выше.
Но в "продуктовых" командах (тех, что работают непосредственно над бизнес-логикой сервисов) требования ощутимо ниже. Можно и велосипедостроением заниматься, и перламутровые пуговицы пришивать. Все эти художества будут изолированы в одном конкретном сервисе, и если за API хорошо присматривают люди из "инфраструктуры", то все это может довольно долго копить все больше и больше тех. долга. Сродни "потолку господла США". Надо напечатать больше денег? Легко, поднимаем планку госдол... тьфу, добавляет еще один "микросервис", который уже с перламутром. И пуговицами.
Лишь бы инфра не лопнула. Но там квалификация требуется высокая. Порой настолько, что это просто отдают (за большие деньги) на откуп тем, у кого есть такая квалификация.
Здравствуйте, Ночной Смотрящий, Вы писали:
Z>>А где же про эти решения можно почитать? Допустим мы нагрузили, latency 50 микросервисов начало расти с разным коэффициентом геометрической прогрессии от RPS (в реальности зависимости гораздо сложнее и найти закономерности почти нереально, но пусть будет так).
НС>Включаешь трейсинг и смотришь в каком нибудь егере где мы утыкаемся. И 50 сервисов схлопываются до одного.
А где мы там утыкаемся? Обычно берешь ты трейс (хоть ягера, хоть профайлера) и видишь ровно столько, сколько у тебя знаний по каждому участку. Без этой экспертизы трейс малополезен.
Впрочем этим примером я иллюстрировал другую проблему. Когда мы нагружаем систему на тестовом стенде мы видим какие-то закономерности потребления ресурсов от нагрузки и как-то умозрительно пытаемся их экстраполировать на прод. Что в монолите, что в микросервисах это дело очень непростое, в микросервисах оно осложняется тем, что request/limit/hpa надо считать для каждого МС и точек отказа становится в разы больше (вероятность отказа растет еще быстрее).
НС>Значит снимаешь трейсинг для разных сценариев. Тебе продакты придут и скажут какой именно сценарий не удовлетворяет SLA. И микросервисы тут, опять же, совершенно не причем.
Я говорю о том, что матрица consumer — request/limit/hpa для каждого сценария обычно отличается. И совмещать их для разных сценариев при росте количества строк и сценариев становится все сложнее. Более того, после каждого релиза любой строки весь этот куб матриц может поменяться.
Трейсинг хорошо помогает, когда мы вырождаем сценарий до вызова одного эндопоинта. Если у нас сценарии на сотни/тысячи вызовов — трейсинги становятся менее информативны.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Все круто, но при чем тут микросервисы? Вероятность таких проблем в монолитах точно такая же. Ты, случаем, не путаешь монолитную архитектуру и полное отсутствие масштабирования и HA?
Не путаю. Тут где-то были претензии, что монолит рассчитан на эксклюзивный доступ к БД, вот там да, можешь предъявлять.
На мой взгляд микросервисы намного легче нарушают yagni и kiss. Поэтому в них описанные мной проблемы (кстати, никак не связанные с масштабированием и HA) наступают быстрее.
Здравствуйте, Ziaw, Вы писали:
Z>На мой взгляд микросервисы намного легче нарушают yagni и kiss.
Потому что там это намного легче обходится.
Z> Поэтому в них описанные мной проблемы (кстати, никак не связанные с масштабированием и HA) наступают быстрее.
Если бы они наступали быстрее, тогда бы принципы нарушались намного реже. А то что они нарушаются чаще как раз и говорит, что микросервисы много ошибок прощают.
Здравствуйте, Ziaw, Вы писали:
НС>>Включаешь трейсинг и смотришь в каком нибудь егере где мы утыкаемся. И 50 сервисов схлопываются до одного. Z>А где мы там утыкаемся?
Где задержка.
Z> Обычно берешь ты трейс (хоть ягера, хоть профайлера) и видишь ровно столько, сколько у тебя знаний по каждому участку. Без этой экспертизы трейс малополезен.
По трейсу смотришь тормозящий сервис, дальше переадресуешь авторам сервиса. Все как в профайлере, только проще в силу более простой структуры связей.
Z>Впрочем этим примером я иллюстрировал другую проблему. Когда мы нагружаем систему на тестовом стенде мы видим какие-то закономерности потребления ресурсов от нагрузки и как-то умозрительно пытаемся их экстраполировать на прод.
Зачем? Включаешь трейс на проде, набираешь в егере дату, потом отключаешь и принимаешься за изучение. Все это намного проще, чем пытаться пользоваться профайлером на монолите.
Z>в микросервисах оно осложняется тем, что request/limit/hpa надо считать для каждого МС
Здравствуйте, Ziaw, Вы писали:
Z>В целях микросервисов ты прав, но даешь свое определение монолита. Монолит это единица деплоймента (архитектура межмодульного взимодействия, организация кодовой базы и ее CI/CD цикла). Сколько команд разрабатывают и как — дело десятое.
Нет, не десятое. В монолите команды всегда тесно связаны, даже если их несколько. Проблема этого в фиговой масштабируемости. При резком росте размера продукта не получится резко увеличить команду/команды.
Z>Границы модулей можно провести и внутри монолита
Провести то можно, но не все этими границами можно ограничить, и намного сложнее контролировать.
S>>Если подумать, то он не один программист на проекте. НС>Но в монолите все связано намного сильнее. У тебя программист на проекте напишет код, которых жрет CPU или память, и проблемы начнутся во всем сервисе.
И? Занятся оптимизацией, покамест масштабировать через LB или очередь. Нашему программисту надо будет все
в транзакции оборачивать. Т.е. придется думать над бд, над распр. системами пока на этом этапе
(несклько инстансов монолита) можно не думать.
S>>И? Ну буду шарить бд или очередь НС>И чем это отличается от микросервисов?
Тем что наше приложение по-прежнему монолит (см.выше если что). Т.е. это скрее SOA.
S>>Именно, НС>И получаем ровно ту же распределенную схему, что и у микросервисов.
Нет, не ту же -- SOA.
S>>Т.е. про рестарт думать особо не надо -- "все само". НС>А почему в микросервисах надо?
Можно не делать, никто не заставляет.
S>>Если работает с другим модулем, как-то надо восстановить или сохранить консистентность. НС>Какую такую консистентность?
Консистентность расшариваемого между инстансами стейта.
S>>А если не stateless? НС>То это фиговый микросервис.
Нефиговый сделать сложно.
S>>Наверх в случае мс это куда, и что делать -- пытаться достучаться или падать? НС>У тебя есть еще какие то варианты?
Я первый спросил.
S>>Да, но это надо еще изучить. НС>Как и в монолите.
А nosql в монолитах сильно нужен?
S>>Это не входило в компетенции нашего монолитного разработчика. НС>Чего вдруг? Монолит каким то волшебным образом избавлен от необходимости использовать БД или шардинг в ней?
Зависит от. Но нашему программисту это зачем?
S>>Что нужно знать нашему разработчику для HA? Что-то кроме транзакций? НС>А что нужно знать разработчику микросервиса?
НС>>>Все обработчики на одной машине, при этом message broker выделен в отдельный сервис — тоже весьма странное решение. message broker предназначен для решения двух основных задач — fault tolerance и buffering. Первое в первую очередь потребует HA, которого при одном инстансе нет, а уж потом очереди, а второе при одном инстансе намного проще и эффективнее сделать in process.
НС>У тебя как то с пониманием текста не очень. Попробуй перечитать внимательно что ты процитировал и понять, что такое "второе" (нет, не message broker).
Ясно, предлагается сделать in process буфферизацию, а с брокером это, очевидно, не получится.
Соотв. "S>Вы предложили брокер сделать in-proc:" забираю обратно. Неправ-с.
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Типа необходимо уметь им пользоваться и понимать для чего он нужен, так? S>>Ну т.е. у нас не только сложная кодовая база, при которой натурально в блокноте
приходится писать, S>>но теперь и докер впихнули. Фортануло, че! НС>Опять ничего не понял. Ты точно понимаешь что такое докер и длоя чего он нужен.
Изоляция и простота деплоя. Что мы в огромном монолите будет изолироать? Сам монолит?
S>>Рефакторинг арх-ры? Можно, конечно, но чем это лучше чем переписать с нуля? НС>Ты точно понимаешь что такое рефакторинг?
Возврат тех. долга.
НС>>>Не надо все сводить до абсурда. Давай я тебе примером проиллюстрирую. Вот есть такой паттерн Посетитель. Если у тебя 2 реализации — точно нужно его использовать, вместо того чтобы написать просто свитч? А если реализаций 50 штук — разумно ли будет писать свитч на 50 кейсов? S>>50 это хорошо, а почему не 49? Свитч на 49 разумно, а на 36 свитч разумно? Вы понимаете всю абсурдность Ваших аргументов? НС>На вопрос ответь.
Свитч на 50 кейсов делать не разумно. А на 49 или 36 самое то?
S>>. Я первый раз услышал про количественные метрики применения паттернов НС>Количество, оно со временем переходит в качество, слышал про такое?
К чему эта крайне странная фраза написана? К количеству кода, т.е. чем больше кода тем лучше?
Это, очевидно, не так. Чем больше паттернов применили к кодовой базе, тем он, код, стал лучше?
Тоже сомнительный довод. Что сказать то хотели?
S>>, типа 49 свитчей еще рано, а вот 50 уже самое то. НС>Сам придумал, сам посмеялся.
Придумал не я, я только посмеялся.
S>>Скорее важно уметь читать, т.е. для монолитов важен навык чтения и понимания. А вот при переходе на мс арх-ру код приходится писать. НС>Ты сам прочти что ты пишешь. В монолите писать код не надо?
Для мс писать приходится чуточку больше кода, так лучше?
S>>Тем более, к чему тогда был этот довод? НС>К тому что чем выше требования к определенной экспертизе, тем выше нужна квалификация программиста. Маленький микросервис напишет обычный миддл, а ковыряться в огромном монолите не каждый сеньор потянет.
С такой формулировкой согласен. А если микросервис не маленький, а монолит не огромный?
Здравствуйте, VladiCh, Вы писали:
C>>В Гугле была сервисная система с самого начала, со своим аналогом контейнеров. Не знаю про MS. C>>Сервисы были не "микро", это да. Но именно микро-сервисы не очень-то нужны. VC>Микро или нет — это понятие растяжимое конечно, но в каких-то пределах. "Микро" здесь для утверждения разницы по сравнению с монолитами. Чем больше сервис по размеру тем он ближе к монолиту и его проблемам и наоборот.
Ну таки "микросервисы" — это всё же немного другое. Это архитектура, где реально МНОГО сервисов. В некоторых компаниях, которые полностью перешли на идеологию микросервисов, бывает, что на каждого программиста приходится несколько микросервисов. Это уже немного ненормально.
VC>То есть в реальности существует спектр конечно, от сервисов поменьше до сервисов побольше, но на каком-то масштабе размер становится таким что проявляются уже проблемы специфические для монолитов VC>и значит этот сервис скорее всего нужно дробить на более мелкие.
Согласен.
Здравствуйте, Sharov, Вы писали:
C>>В некоторых больших проектах не работает нормально даже автодополнение в IDE. S>Ну т.е. требуется навык писать как минимум компилируемый код в блокноте, чтобы лишний раз компилятор не гонять, ибо долго? S>Или как, к чему это замечание?
Навык писать без надёжного автокомплита, умение навигации в сложном коде, организация систем тестирования для всего этого счастья и т.п. Или хотя бы то, как делать изменения в общем коде для нескольких команд.
C>>Организация репозитория и структуры работы вокруг неё, тестирование (бывает, что тесты часами работают), и т.д. S>А к разработчику-то какие требования в связи с этим? Ну организовали репо, структуру работы с кодом.
Ну так а кто "организовали"? Вот кто-то этим и должен заниматься, причём на практике постоянно.
S>Это делается один раз и в начале проекта. Ну понятно, приходится больше думать над кодом, т.к. S>лишний раз гонять компилятор и тесты дорого. Довод, согласен. В мс с компиляцией проще, но думать S>тоже желательно.
На практике система постройки крупных проектов требует постоянной поддержки и развития. В качестве примера, рекомендую собрать современный Chrome или Firefox. Это как раз примеры достаточно крупных монолитов (35 миллионов строк кода в Chrome).
Здравствуйте, Ночной Смотрящий, Вы писали:
Z>>А где мы там утыкаемся?
НС>Где задержка.
Что считать задержкой? Вот у тебя 43 сервиса дернуты, разное количество раз с разными таймингами от 3 до 60мс. В сумме, 200. В какой утыкаемся?
НС>По трейсу смотришь тормозящий сервис, дальше переадресуешь авторам сервиса. Все как в профайлере, только проще в силу более простой структуры связей.
Авторы говорят, что это нормальное поведение, их сервис всегда так работал и другие команды не жаловались.
НС>Зачем? Включаешь трейс на проде, набираешь в егере дату, потом отключаешь и принимаешься за изучение. Все это намного проще, чем пытаться пользоваться профайлером на монолите.
И чем проще? Включаешь трейс на проде, выбираешь дату и принимаешься за изучение.
НС>И что в этом сложного?
В кратном увеличении объема работы. Если я правильно понимаю твою мысль — микросервисы позволяют легче размазывать ответственность по командам. И упрощение именно в этом. Мой поинт в том, что это достигается ценой сильного суммарного увеличения сложности (и цены) разработки. С тем, что у монолита есть свои пределы, при которых управление его разработкой становится все сложнее — спорить не буду.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Это с точки зрения программиста. А с точки зрения продукта основная проблема — долгие большие релизы, и, как следствие, неконкурентный time to market новых фич.
Это очевидно. И в монолите решаемо (достаточно немного подтюнить реалии скрама). А вот в микросервисах, которые прощают чуть больше, какой-то глобальный рефакторинг практически невозможен.
Здравствуйте, Ziaw, Вы писали:
НС>>Это с точки зрения программиста. А с точки зрения продукта основная проблема — долгие большие релизы, и, как следствие, неконкурентный time to market новых фич. Z>Это очевидно. И в монолите решаемо (достаточно немного подтюнить реалии скрама).
Нет, не решаемо при более менее большом размере.
Z>А вот в микросервисах, которые прощают чуть больше, какой-то глобальный рефакторинг практически невозможен.
Решаемо (достаточно немного подтюнить реалии скрама).
Здравствуйте, Ziaw, Вы писали:
НС>>Где задержка. Z>Что считать задержкой?
Несоответствие SLA.
Z>Вот у тебя 43 сервиса дернуты, разное количество раз с разными таймингами от 3 до 60мс. В сумме, 200. В какой утыкаемся?
Так на практике бывает очень редко, на хорошо оттюненом сервисе. А чаще из этих 200 на один сервис приходится 180.
НС>>По трейсу смотришь тормозящий сервис, дальше переадресуешь авторам сервиса. Все как в профайлере, только проще в силу более простой структуры связей. Z>Авторы говорят, что это нормальное поведение, их сервис всегда так работал и другие команды не жаловались.
Нормальное тут совсем неверный термин. Правильный — соответствующее требованиям. Есть SLA, есть нагрузка, нужно на этой нагрузке соответствовать SLA. Авторы, которые не хотят работать над соотвествием требованяим идут в сад.
НС>>Зачем? Включаешь трейс на проде, набираешь в егере дату, потом отключаешь и принимаешься за изучение. Все это намного проще, чем пытаться пользоваться профайлером на монолите. Z>И чем проще?
Я отвечал на этот вопрос предложением ранее.
НС>>И что в этом сложного? Z>В кратном увеличении объема работы.
Практика показывает, что трейсы упрощают жизнь, в монолите в том числе. Микросервисность тут особо не влияет.
Z>С тем, что у монолита есть свои пределы, при которых управление его разработкой становится все сложнее — спорить не буду.
А с чем тогда ты споришь? С тем что у микросервисов тоже есть предел снизу? Это кто то тут оспаривал?
Здравствуйте, Sharov, Вы писали:
S>>>Если подумать, то он не один программист на проекте. НС>>Но в монолите все связано намного сильнее. У тебя программист на проекте напишет код, которых жрет CPU или память, и проблемы начнутся во всем сервисе. S>И?
И изоляция микросервисов позволяет быстрее локализовать проблему и команду, которая за нее ответственна. Ты прям в графане в реальном времени видишь проблемный сервис, вылезший за лимиты по цпу или памяти.
S> Занятся оптимизацией,
Оптимизацией чего?
S> покамест масштабировать через LB или очередь.
Это если оно масштабируется.
S>>>И? Ну буду шарить бд или очередь НС>>И чем это отличается от микросервисов? S>Тем что наше приложение по-прежнему монолит (см.выше если что).
Монолит отличается от микросервисов тем что он монолит. Прекрасно.
S>>>Именно, НС>>И получаем ровно ту же распределенную схему, что и у микросервисов.
S>Нет, не ту же -- SOA.
Микросервисы — частный случай SOA. Монолиты — как повезет. Судя по твоим рассказам про ужасы рестартов — твои монолиты не так чтобы SOA.
S>>>Если работает с другим модулем, как-то надо восстановить или сохранить консистентность. НС>>Какую такую консистентность? S>Консистентность расшариваемого между инстансами стейта.
Так не надо велосипедить расшариваемый стейт. Если же ты его таки навелосипедил — у тебя будут проблемы и в монолите.
S>>>А если не stateless? НС>>То это фиговый микросервис. S>Нефиговый сделать сложно.
Это все касается и монолита, причем в большей степени.
S>>>Наверх в случае мс это куда, и что делать -- пытаться достучаться или падать? НС>>У тебя есть еще какие то варианты? S>Я первый спросил.
Т.е. нет. ЧТД.
S>>>Да, но это надо еще изучить. НС>>Как и в монолите. S>А nosql в монолитах сильно нужен?
Ровно настолько же, насколько и в микросервисах. У тебя по прежнему какое то крайне странное представление о микросервисах. Монолиты у тебя почему то что то довольно маленькое, без особой нагрузки, без требований к даунтайму, масштабируемости и НА.
S>>>Это не входило в компетенции нашего монолитного разработчика. НС>>Чего вдруг? Монолит каким то волшебным образом избавлен от необходимости использовать БД или шардинг в ней? S>Зависит от.
Я не буду все это читать в поисках доказательств тому, что ты тут заявляешь. Есть конкретно список тем, которые нужны в микросервисах и не нужны в аналогичного масштаба монолите?
Здравствуйте, Sharov, Вы писали:
НС>>Опять ничего не понял. Ты точно понимаешь что такое докер и длоя чего он нужен. S>Изоляция и простота деплоя.
Нет. В первую очередь это снижение оверхеда ВМ, т.е. контейнер это быстрее и дешевле. Потому что альтернатива докеру это прежде всего виртуалки.
S> Что мы в огромном монолите будет изолироать? Сам монолит?
Да, сам монолит. Но см. выше реальную причину существования контейнеров.
S>>>Рефакторинг арх-ры? Можно, конечно, но чем это лучше чем переписать с нуля? НС>>Ты точно понимаешь что такое рефакторинг?
S>Возврат тех. долга.
Возврат техдолга это не только рефакторинг, так что неверно.
НС>>На вопрос ответь. S>Свитч на 50 кейсов делать не разумно. А на 49 или 36 самое то?
А как по твоему?
S>>>. Я первый раз услышал про количественные метрики применения паттернов S>НС>Количество, оно со временем переходит в качество, слышал про такое? S>К чему эта крайне странная фраза написана?
К разговору. Количественные значения приводят к качественным скачкам.
S>К количеству кода, т.е. чем больше кода тем лучше?
Удивительная логика. Не пояснишь?
S>Тоже сомнительный довод. Что сказать то хотели?
Ровно то что сказал.
S>>>, типа 49 свитчей еще рано, а вот 50 уже самое то. НС>>Сам придумал, сам посмеялся. S>Придумал не я, я только посмеялся.
Нет, какую то абсолютную границу придумал именно ты. И именно над ее абсолютностью и посмеялся. Т.е. посмеялся сам над собой. У Чапека этот прием называется имаго.
В целом, у тебя какое то странное восприятие для инженера. Это вполне нормально, когда некая конструкция имеет оверхед, зависящий от количественных показателей. И на каком то количестве оверхед превышает пользу, на каком то польза сравнивается, а на каком то начинает превышать. Совершенно стандартная в инженерии ситуация, почему она вызывает у тебя какие то неуемные фантазии мне непонятно.
S>>>Скорее важно уметь читать, т.е. для монолитов важен навык чтения и понимания. А вот при переходе на мс арх-ру код приходится писать. НС>>Ты сам прочти что ты пишешь. В монолите писать код не надо? S> Для мс писать приходится чуточку больше кода, так лучше?
Доказательства где? Перейдя с общей сложности системы на количество кода, который надо писать, ты ступил на совсем тонкий лед. Потому что для микросервисов существует масса софта, который реализовывает то, что в монолите тебе придется велосипедить. И даже если ты используешь этот софт в монолите, количество разных чужих сервисов существенно приблизят твой монолит к микросервисам.
К примеру, твой монолит умеет хелсчеки, и чтобы если хелсчек стал выдавать проблему, сервис бы автоматически рестартанул? Если да, то как это реализовано?
НС>>К тому что чем выше требования к определенной экспертизе, тем выше нужна квалификация программиста. Маленький микросервис напишет обычный миддл, а ковыряться в огромном монолите не каждый сеньор потянет.
S>С такой формулировкой согласен. А если микросервис не маленький,
В моей практике SLA не константа, а какие-то вводные типа "15 февраля в 14:00 к нам придет 20к юзеров в промежутке около 5 минут. Они пройдут примерно по _____ сценарию. Остальная нагрузка будет примерно на прежнем уровне. Платформа должна выдержать.".
НС>Так на практике бывает очень редко, на хорошо оттюненом сервисе. А чаще из этих 200 на один сервис приходится 180.
У меня другой опыт, обычно сервис более-менее оттюнен и его надо развивать, не забывая прошлые вводные и добавляя новые. Если у нас какие-то явные проблемы, найти и оттюнить их обычно дело разовое и редкое. Чаще все работает неплохо, но возникает вопрос, а что если нагрузка вырастет вдвое, сколько ресурсов нам понадобится и сможем ли мы это переварить деньгами и девопсами.
НС>Нормальное тут совсем неверный термин. Правильный — соответствующее требованиям. Есть SLA, есть нагрузка, нужно на этой нагрузке соответствовать SLA. Авторы, которые не хотят работать над соотвествием требованяим идут в сад.
В теории все верно. Если авторы говорят, что они не хотят работать над соответствием требованиям рецепт известен. На практике у авторов есть своя правда и основания так говорить и их поход в сад ситуацию возможно даже ухудшит.
НС>Практика показывает, что трейсы упрощают жизнь, в монолите в том числе. Микросервисность тут особо не влияет.
Вот здесь плюсану. Не влияет.
НС>А с чем тогда ты споришь? С тем что у микросервисов тоже есть предел снизу? Это кто то тут оспаривал?
Хочется вернуть этот вопрос тебе, так как ты начал дискуссию со мной. Я лично отстаивал точку зрения, что микросервисы не "технология которая хорошо изучена, описана и делает все гораздо проще", а очень тяжелая и дорогая артиллерия, которую далеко не каждый бизнес способен вытащить. И в технических вопросах она уступает монолиту по части простоты, цены и скорости вплоть до бюджетов небольшого уездного города. Потом может начаться проще, с этим спорить не буду.
Z>>Вот у тебя 43 сервиса дернуты, разное количество раз с разными таймингами от 3 до 60мс. В сумме, 200. В какой утыкаемся? НС>Так на практике бывает очень редко, на хорошо оттюненом сервисе. А чаще из этих 200 на один сервис приходится 180.
Хм, видимо, практика у всех разная. Я все чаще наблюдаю именно такую ситуацию, что каждый конкретный сервис отвечает быстро, но суммарное время большое, потому что все выполняется последовательно, и везде сплошные RPC. Организовать же асинхронную обработку (scatter/gather какой) бывает очень непросто. Потому что те самые 100500 "параллельно работающих инженеров" слышали про RPC и про другие синхронные модели, а вот с message passing, однако, не могут. Да и языки не располагают, если не брать экзотику.
НС>Нормальное тут совсем неверный термин. Правильный — соответствующее требованиям. Есть SLA, есть нагрузка, нужно на этой нагрузке соответствовать SLA. Авторы, которые не хотят работать над соотвествием требованяим идут в сад.
Каждый конкретный сервис обычно в рамках SLA. А вот все вместе, увы, нет.
Интересно, что в монолитах (или просто больших сервисах) есть аналогичные проблемы. Но обычно не с latency, а с производительностью. Обычно это результат "работы с профайлером", люди смотрят "о, вот эта функция занимает 10% времени выполнения, щас мы ее оптимизируем". И начинают разносить ее на кусочки. Разнесут, доложат, что теперь cumulative time всего 2%. Берешь в зубы load test, смотришь — конечный результат стал... хуже, теперь сервис тянет на 3% меньше нагрузки.
А все почему? Да потому, что метрика так ставится, "не иметь функций, что кушают много кумулятивного времени".
Аналогично с latency. Есть медленный сервис. Окей, смотрим, он, оказывается, не то чтоб неделимый. Отлично, делим его пополам. Два результирующих сервиса уже укладываются в SLA. Problem solved.
Здравствуйте, Ziaw, Вы писали:
НС>>Решаемо (достаточно немного подтюнить реалии скрама). Z>Интересно, что там можно подтюнить, не теряя главный бенефит микросервисности — множество независимых команд, каждая со своими процессами.
Здравствуйте, Ziaw, Вы писали:
НС>>Несоответствие SLA. Z>В моей практике SLA не константа,
Круто. Клиентам вы тоже говорите, что SLA не константа, когда они к вам с вопросами приходят?
НС>>Так на практике бывает очень редко, на хорошо оттюненом сервисе. А чаще из этих 200 на один сервис приходится 180. Z>У меня другой опыт, обычно сервис более-менее оттюнен и его надо развивать, не забывая прошлые вводные и добавляя новые. Если у нас какие-то явные проблемы, найти и оттюнить их обычно дело разовое и редкое. Чаще все работает неплохо, но возникает вопрос, а что если нагрузка вырастет вдвое, сколько ресурсов нам понадобится и сможем ли мы это переварить деньгами и девопсами.
Для этого делают нагрузочное тестирование не планируемой нагрузке, которое таки начнет выявлять бутылочное горлышко.
А ты как делаешь?
НС>>Нормальное тут совсем неверный термин. Правильный — соответствующее требованиям. Есть SLA, есть нагрузка, нужно на этой нагрузке соответствовать SLA. Авторы, которые не хотят работать над соотвествием требованяим идут в сад. Z>В теории все верно.
На практике тоже.
Z>На практике у авторов есть своя правда
Что это за правда такая, позволяющая игнорить требования?
Z>и основания так говорить и их поход в сад ситуацию возможно даже ухудшит.
Извини, но это уже не техническая проблема.
НС>>А с чем тогда ты споришь? С тем что у микросервисов тоже есть предел снизу? Это кто то тут оспаривал? Z>Хочется вернуть этот вопрос тебе, так как ты начал дискуссию со мной.
Я ответил на конкретный вопрос по поводу поиска узких мест. Ты же начал теоретизировать обобщенно.
Z> Я лично отстаивал точку зрения, что микросервисы не "технология которая хорошо изучена, описана и делает все гораздо проще", а очень тяжелая и дорогая артиллерия, которую далеко не каждый бизнес способен вытащить.
Здравствуйте, SkyDance, Вы писали:
Z>>>Вот у тебя 43 сервиса дернуты, разное количество раз с разными таймингами от 3 до 60мс. В сумме, 200. В какой утыкаемся? НС>>Так на практике бывает очень редко, на хорошо оттюненом сервисе. А чаще из этих 200 на один сервис приходится 180. SD>Хм, видимо, практика у всех разная. Я все чаще наблюдаю именно такую ситуацию, что каждый конкретный сервис отвечает быстро, но суммарное время большое, потому что все выполняется последовательно, и везде сплошные RPC.
Так это другая проблема, для лечения которой нужны другие подходы.
SD>Каждый конкретный сервис обычно в рамках SLA. А вот все вместе, увы, нет.
Я ж говорю, это другая проблема, больше из области архитектуры всей системы.
Здравствуйте, Cyberax, Вы писали:
S>>Ну а как до изобретения мс работал тот же гугл? Распределенная система была, микросервисов не было. S>>Сложный деплоймент, настройки, но система распределенная и нету никаких микросервисов. C>В Гугле была сервисная система с самого начала, со своим аналогом контейнеров. Не знаю про MS. C>Сервисы были не "микро", это да. Но именно микро-сервисы не очень-то нужны.
А чего микро сразу в мейнстрим не ушли? Чего не хватало -- контейрезация была давно, еще со времен Sun.
Облака? А сильно они нужны, если мы накупим для себя серверов или арендуем дц? Что еще?
Я так понимаю, что с того момента как по лок. сети стало можно прочитать данные из памяти др. машины быстрее чем
с собственного жесткого диска, вот тогда дело и пошло. Т.е. все утыкалось в сеть -- bandwidth, latency.
Или же именно организационные вопросы типа маленьких команд не дозрели?
Кстати, можно сказать, что SOA промежуточный этап эволюции от монолитов к мс?
Здравствуйте, Sharov, Вы писали:
S>Кстати, можно сказать, что SOA промежуточный этап эволюции от монолитов к мс?
с интересом слежу за всей дискуссией
вставлю свои пять копеек
SOA я впервые увидел, пощупал и отведал со всем гуаном, заложенным внутрь менеджерами и продавцами, ещё в 2005
а чуть позже на единой кодобазе, но модульной, с гетерогенным деплойментом со специфическими конфигурациями под каждый элемент в HA-конфигурации и прочим параллелизмом как в обработке потоков информации, так и обновлении — в 2007-2008
при этом баззвордов типа монолит vs микросервисы тогда никто не знал, докеров не было, а всё деплоилось на реальное железо в ДЦ почти пешей доступности
свойства с точки зрения бизнеса были всё те же:
— надо обновить конкретное направление? обновляем конфигурацию с коммитом в svn, пересобираем, тестируем, после удовлетворительных тестов — по одной останавливаем и обновляем ноды в отдельно взятом HA-кластере
— надо усложнить правила обработки? меняем кодобазу с коммитом в svn, пересобираем, тестируем на первом заинтересованном направлении, после удовлетворительных тестов — по одной останавливаем и обновляем ноды в отдельно взятом HA-кластере, по мере вовлечения остальных кластеров — их тоже обновляем
когда сейчас я вижу противопоставление единой кодобазы и микросервисов мне приходит в голову только одна мысль: границы физической ответсвенности за работоспобность модуля не должны быть равны границам программистских способностей, и для меня попытка разделить команды по микрообластям — проблемы неумелого аутсорсинга во всей своей красе
SD>> каждый конкретный сервис отвечает быстро, но суммарное время большое, потому что все выполняется последовательно, и везде сплошные RPC. НС>Так это другая проблема, для лечения которой нужны другие подходы.
C этого места поподробнее. И как же предлагается решать такую проблему в реалиях микросервисов, когда каждый в отдельности работает как задумано, но все вместе — тормозит?
НС>Я ж говорю, это другая проблема, больше из области архитектуры всей системы.
Так вот на моем опыте, в случае с "монолитом" именно такие проблемы (не одной медленной функции, все быстрые, но вместе — тормозят) решается прокручиванием очередной дырочки сквозь десять слоев. Что и цементирует монолит, делая невозможным его дальнейший рефакторинг.
В случае с микросервисами этот трюк попросту не проходит. Что, с одной стороны, плюс, ибо при наличии той самой "политической воли" хранит чистоту API. Но на практике ведет к созданию сервиса "с перламутровыми крылышками", который слепляет функциональность пачки других сервисов, только при этом имеет внутри ту самую дырку сквозь слои. В итоге эффект тот же, что и с монолитом, только теперь распределенный.
S>А чего микро сразу в мейнстрим не ушли? Чего не хватало
Готовых решений. Их, кстати, и сейчас не хватает. Так чтоб это решение было с мониторингом, алармами, масштабируемостью, распределенным трейсингом, деплойментом взад-вперед (slowroll, revert). И чтоб при этом было надежным и простым как в установке, так и в эксплуатации. Потому как если это сложно, то смысл микросервисов резко уходит.
А сложно потому, что решения разрабатывались интеграцией, суть накидыванием, разных софтин в один котел. Каждая со своим подходом и слоями, глюками и особенностями. В итоге либо нужно верить в магию (AWS, GCP и прочие) и непогрешимость облачных провайдеров, либо самому разбираться.
Но если разобраться в чем-то конкретном (или вовсе сделать свое, как поступают очень многие), нужно и хороших специалистов, и много сил. Что для мейнстрима не годится, там надо быстро-вкусно-дешево (выберите чего-нибудь два).
Здравствуйте, SkyDance, Вы писали:
C0s>>и для меня попытка разделить команды по микрообластям — проблемы неумелого аутсорсинга во всей своей красе
SD>А как иначе вы предлагаете работать монструозным компаниям типа гугла?
я до сих пор в сегменте маленьких да уродливых (или удаленьких), уже много лет в философских размышлениях, нужны ли мне мегаразмеры.
большие пусть сами себе грабли раскладывают, у них хотя бы бюджет не предполагает микрооптимизаций
Здравствуйте, Sharov, Вы писали:
C>>В Гугле была сервисная система с самого начала, со своим аналогом контейнеров. Не знаю про MS. C>>Сервисы были не "микро", это да. Но именно микро-сервисы не очень-то нужны. S>А чего микро сразу в мейнстрим не ушли? Чего не хватало -- контейрезация была давно, еще со времен Sun.
Полноценная контейнеризация в Линуксе с cgroup и namespaces появилась в районе 2010-го года. До этого были местечковые решения типа Virtuozzo или vserver, требующие сторонних патчей. Примерно к тому же времени AWS начал экспоненциально расти.
Добавим к этому пару лет на то, чтобы ядра с поддержкой контейнеров проникли в дистрибутивы. Итог: первая версия Docker'а была в марте 2013-го года.
Если говорить не про популярные в народе решения, то внутри Гугла была своя "сервисная" система с середины 2000-х (Babysitter/Borg), внутри Амазона — с начала 2000-х (Apollo).
S>Облака? А сильно они нужны, если мы накупим для себя серверов или арендуем дц? Что еще?
До облачных систем обычно покупали Один Большой Сервер, и ставили на него 100500 разного софта.
S>Я так понимаю, что с того момента как по лок. сети стало можно прочитать данные из памяти др. машины быстрее чем S>с собственного жесткого диска, вот тогда дело и пошло. Т.е. все утыкалось в сеть -- bandwidth, latency. S>Или же именно организационные вопросы типа маленьких команд не дозрели?
Две причины:
1. Организационные вопросы. Именно в начале 2010-х годов начали появляться многочисленные компании с очень большой инфраструктурой.
2. Технические: доступность решений для контейнеризации, доступность крупных вычислительных мощностей. Стало не нужно тратить сразу миллионы долларов на запуск кластера из 100 узлов.
S>Кстати, можно сказать, что SOA промежуточный этап эволюции от монолитов к мс?
Микросервисы — это не пик эволюции, это просто вариант SOA. Со своими недостатками и преимуществами.
Здравствуйте, Ziaw, Вы писали:
НС>>Несоответствие SLA. Z>В моей практике SLA не константа, а какие-то вводные типа "15 февраля в 14:00 к нам придет 20к юзеров в промежутке около 5 минут. Они пройдут примерно по _____ сценарию. Остальная нагрузка будет примерно на прежнем уровне. Платформа должна выдержать.".
Значит, нужно увольнять тех, кто не может сформулировать SLA.
Здравствуйте, C0s, Вы писали:
C>>нужно увольнять тех, кто не может сформулировать SLA. C0s>по моему опыту в контекстах с "большим" бюджетом ответственность за эту формулировку тоже размазывается.?
Ну да. Но большие системы обычно развиваются эволюционно, и в целом можно экстраполировать производительность за счёт нормальных вариаций нагрузки.
Здравствуйте, SkyDance, Вы писали:
НС>>Так это другая проблема, для лечения которой нужны другие подходы. SD>C этого места поподробнее. И как же предлагается решать такую проблему в реалиях микросервисов, когда каждый в отдельности работает как задумано, но все вместе — тормозит?
Ты мне предлагаешь дать тебе рецепты по заочному описанию в виде одной фразы?
НС>>Я ж говорю, это другая проблема, больше из области архитектуры всей системы. SD>Так вот на моем опыте, в случае с "монолитом" именно такие проблемы (не одной медленной функции, все быстрые, но вместе — тормозят) решается прокручиванием очередной дырочки сквозь десять слоев.
Это очень недолго решается. От таких дырочек монолит быстро умирает под тяжестью техдолга.
SD>В случае с микросервисами этот трюк попросту не проходит.
И это один из их плюсов.
SD>Но на практике ведет к созданию сервиса "с перламутровыми крылышками"
Здравствуйте, Cyberax, Вы писали:
C>Значит, нужно увольнять тех, кто не может сформулировать SLA.
Такая вводная приходит всегда, поскольку изначально идет от людей которые ничего не знают про запросы и облака. Во что она трансформируется дальше и насколько легко ее превратить во что-то инженерное, в этом топике как раз и обсуждается.
В идеальном мире можно представить себя руководителем команды которая пишет микросерис и требовать SLA по ГОСТу. В реальном же задача понять в какие вызовы оно превратится не имеет алгоритмического решения. Все превращается в личную магию типа — смотрим трейс и все понимаем. Причин много, к примеру — на продовых данных погонять нагрузку не всегда выходит, а на тестовых картина ни разу не релевантная. И регрессить эти наборы вводных к SLA тот еще квест.
Можете кидать в меня помидорами, но лично у меня эта магия дает сбои достаточно регулярно и требует множества итеративных подходов с привлечением многих людей и глубоким пониманием всего процесса. Поэтому когда я слышу заявления о том, что в микросервисах это все давно просто и отлажено, меня разбирает любопытство, как это работает.
Здравствуйте, Ziaw, Вы писали:
Z>В идеальном мире можно представить себя руководителем команды которая пишет микросерис и требовать SLA по ГОСТу.
Какой руководитель команды, какие ГОСТы? Твои продажники подписывают с клиентом контракт, где прописаны конкретные цифры. И за несоответствие этим цифрам клиент вправе потребовать прописанную в договоре же компенсацию. В каком месте тут может помочь твоя мухлефилософия про магию в реальном мире?
Здравствуйте, Cyberax, Вы писали:
C>Ошибку такого подхода поняли достаточно быстро, но полный переход на сервисы занял что-то около 10 лет.
Облачные провайдеры и прочие госуслуги легко бьются на слабо-связанные куски, это отличные кандидаты на разбиение на множество кусков-приложений.
А вот будет ли это хотя бы близко к классике микросервисов: один микро-сервис — одна простая функция — одно хранилище — один разработчик, вопрос открытый.
Лично я их подход вижу как несколько монолитов слабо связанных по ресту и небольшой набор общих сервисов.
Здравствуйте, Ziaw, Вы писали:
Z>Облачные провайдеры и прочие госуслуги легко бьются на слабо-связанные куски
Тут дело такое. Госуслуги легко бьются на куски не только потому что они такие по исходной задаче, а в том числе и потому что изначально проектировались с учетом этого. Ты погляди на современные high load сервисы — они почти все подобным образом устроены.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Какой руководитель команды, какие ГОСТы? Твои продажники подписывают с клиентом контракт, где прописаны конкретные цифры. И за несоответствие этим цифрам клиент вправе потребовать прописанную в договоре же компенсацию. В каком месте тут может помочь твоя мухлефилософия про магию в реальном мире?
Что-то у тебя какое-то совсем неприкрытое хамство пошло. Если у тебя клиенты прописывают SLA в договоре — тебе просто повезло, одной неопределенностью меньше.
Здравствуйте, Ziaw, Вы писали:
НС>>Какой руководитель команды, какие ГОСТы? Твои продажники подписывают с клиентом контракт, где прописаны конкретные цифры. И за несоответствие этим цифрам клиент вправе потребовать прописанную в договоре же компенсацию. В каком месте тут может помочь твоя мухлефилософия про магию в реальном мире? Z>Что-то у тебя какое-то совсем неприкрытое хамство пошло.
Тебе показалось. Не стоит претензии к написанному тобой переносить на себя лично.
Z> Если у тебя клиенты прописывают SLA в договоре — тебе просто повезло
Офигеть просто.
Z>, одной неопределенностью меньше.
Это тебе повезло, можно расслабиться и не иметь никаких четких рамок. В современном мире облачных сервисов не так чтобы частая ситуация, мало кто хочет использовать сервис, который в один прекрасный момент начнет тормозить и никаких обязательств по этому поводу ни у кого не будет.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Тебе показалось. Не стоит претензии к написанному тобой переносить на себя лично.
Не показалось. Претензии можно привязать к фактам, хамство — обтекаемо и оценочно.
НС>Это тебе повезло, можно расслабиться и не иметь никаких четких рамок. В современном мире облачных сервисов не так чтобы частая ситуация, мало кто хочет использовать сервис, который в один прекрасный момент начнет тормозить и никаких обязательств по этому поводу ни у кого не будет.
Сервис который используют другие бизнесы не весь мир, а довольно узкий класс приложений в сегменте b2b и еще чуть-чуть в b2g.
Здравствуйте, Ziaw, Вы писали:
НС>>Тебе показалось. Не стоит претензии к написанному тобой переносить на себя лично. Z>Не показалось. Претензии можно привязать к фактам, хамство — обтекаемо и оценочно.
Хамство обтекаемо?
НС>>Это тебе повезло, можно расслабиться и не иметь никаких четких рамок. В современном мире облачных сервисов не так чтобы частая ситуация, мало кто хочет использовать сервис, который в один прекрасный момент начнет тормозить и никаких обязательств по этому поводу ни у кого не будет. Z>Сервис который используют другие бизнесы не весь мир, а довольно узкий класс приложений в сегменте b2b и еще чуть-чуть в b2g.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>>>Опять ничего не понял. Ты точно понимаешь что такое докер и длоя чего он нужен. S>>Изоляция и простота деплоя. НС>Нет. В первую очередь это снижение оверхеда ВМ, т.е. контейнер это быстрее и дешевле. Потому что альтернатива докеру это прежде всего виртуалки.
А простота деплоя не предполагает снижение оверхеда ВМ?
НС>>>Ты точно понимаешь что такое рефакторинг? S>>Возврат тех. долга. НС>Возврат техдолга это не только рефакторинг, так что неверно.
Failure to perform refactoring can result in accumulating technical debt; on the other hand, refactoring is one of the primary means of repaying technical debt.
S>>Свитч на 50 кейсов делать не разумно. А на 49 или 36 самое то? НС>А как по твоему?
Без понятия, никогда в таком разрезе об этом не думал. Просто смущает нелепость постановки и выбор конкретных чисел.
S>>НС>Количество, оно со временем переходит в качество, слышал про такое? S>>К чему эта крайне странная фраза написана? НС>К разговору. Количественные значения приводят к качественным скачкам.
Хорошо, спрошу иначе -- сформулируйте это в контексте кода. Т.е. кол-во кода перейдет в его качество?
S>>К количеству кода, т.е. чем больше кода тем лучше? НС>Удивительная логика. Не пояснишь?
См. выше.
S>>>>, типа 49 свитчей еще рано, а вот 50 уже самое то. НС>>>Сам придумал, сам посмеялся. S>>Придумал не я, я только посмеялся.
НС>Нет, какую то абсолютную границу придумал именно ты. И именно над ее абсолютностью и посмеялся. Т.е. посмеялся сам над собой. У Чапека этот прием называется имаго.
О, началось, боевая имага в ход пошла.
НС>В целом, у тебя какое то странное восприятие для инженера. Это вполне нормально, когда некая конструкция имеет оверхед, зависящий от количественных показателей. И на каком то количестве оверхед превышает пользу, на каком то польза сравнивается, а на каком то начинает превышать. Совершенно стандартная в инженерии ситуация, почему она вызывает у тебя какие то неуемные фантазии мне непонятно.
Хорошее определение, никаких фантазий. Сформулируйте внятно теперь как это связано с кодом и паттернами?
Просто 50 свичей или визитор это было словоблудие. Должно быть какое-то внятное правило или закон.
S>>>>Скорее важно уметь читать, т.е. для монолитов важен навык чтения и понимания. А вот при переходе на мс арх-ру код приходится писать. НС>>>Ты сам прочти что ты пишешь. В монолите писать код не надо? S>> Для мс писать приходится чуточку больше кода, так лучше? НС>Доказательства где? Перейдя с общей сложности системы на количество кода, который надо писать, ты ступил на совсем тонкий лед. Потому что для микросервисов существует масса софта, который реализовывает то, что в монолите тебе придется велосипедить.
А интегрируется в BL это все автоматически, или надо каждую необходимую ф-ть интегрировать путем написания кода?
Велосипедостроение заменилось интеграцией.
НС>И даже если ты используешь этот софт в монолите, количество разных чужих сервисов существенно приблизят твой монолит к микросервисам.
Опять странное заявление -- т.е. если я своем монолите буду использовать n-ое кол-во "разных чужих сервисов", то начиная
с какого-то n мой монолит становится микросервисом. Каково ограничение снизу на это n?
НС>К примеру, твой монолит умеет хелсчеки, и чтобы если хелсчек стал выдавать проблему, сервис бы автоматически рестартанул? Если да, то как это реализовано?
Ну как вариант, завершить все текущие операции, или скинуть их состояние на диск, сделать fork (или поднять новый процесс), а
сам процесс может себя прибить. Как-то так. А что докажет ответ на этот вопрос?
Здравствуйте, Ночной Смотрящий, Вы писали:
S>> Занятся оптимизацией, НС>Оптимизацией чего?
Есть варианты?
S>> покамест масштабировать через LB или очередь. НС>Это если оно масштабируется.
На нет и суда нет.
НС>>>И чем это отличается от микросервисов? S>>Тем что наше приложение по-прежнему монолит (см.выше если что). НС>Монолит отличается от микросервисов тем что он монолит. Прекрасно.
Ну т.е. если мы на 4-5 машинах запустили наш инстанс монолита, то теперь у нас микросервисная арх-ра. Ясно.
НС>>>У тебя есть еще какие то варианты? S>>Я первый спросил. НС>Т.е. нет. ЧТД.
Жду правильный ответ!
НС>>>Как и в монолите. S>>А nosql в монолитах сильно нужен? НС>Ровно настолько же, насколько и в микросервисах. У тебя по прежнему какое то крайне странное представление о микросервисах. Монолиты у тебя почему то что то довольно маленькое, без особой нагрузки, без требований к даунтайму, масштабируемости и НА.
Очередной уход от конкретного ответа. Таким ответом можно все что угодно обосновать.
Складывается ощущение, что монолит вообще от мс ничем не отличается, везде "и там и там".
Они прям ноздря в ноздрю идут.
S>>Зависит от. НС>От чего?
Здравствуйте, Ziaw, Вы писали:
C>>Ошибку такого подхода поняли достаточно быстро, но полный переход на сервисы занял что-то около 10 лет. Z>Облачные провайдеры и прочие госуслуги легко бьются на слабо-связанные куски, это отличные кандидаты на разбиение на множество кусков-приложений.
Я бы не сказал, что "легко". Запуск виртуалки на EC2 требует что-то около четырёх-пяти десятков сервисов.
Z>А вот будет ли это хотя бы близко к классике микросервисов: один микро-сервис — одна простая функция — одно хранилище — один разработчик, вопрос открытый. Z>Лично я их подход вижу как несколько монолитов слабо связанных по ресту и небольшой набор общих сервисов.
Скорее среднего размера, не микросервисы, но и не монолиты в миллионы строк.
Масса. Но вопрос был о другом. Прежде чем заниматься оптимизацией, надо понять что оптимизировать.
S>>> покамест масштабировать через LB или очередь. НС>>Это если оно масштабируется. S>На нет и суда нет.
Что это означает на практике? Тормозит, да и бог с ним?
S>Ну т.е. если мы на 4-5 машинах запустили наш инстанс монолита, то теперь у нас микросервисная арх-ра. Ясно.
Опять борьба с чучелком.
НС>>Ровно настолько же, насколько и в микросервисах. У тебя по прежнему какое то крайне странное представление о микросервисах. Монолиты у тебя почему то что то довольно маленькое, без особой нагрузки, без требований к даунтайму, масштабируемости и НА. S>Очередной уход от конкретного ответа.
Это не уход от ответа, это отсутствие конкретных вопросов и попытка переложить на меня бпремя по доказательству твоих утверждений.
S>Складывается ощущение, что монолит вообще от мс ничем не отличается, везде "и там и там". S>Они прям ноздря в ноздрю идут.
В целом да, это не два разных мира, и грань между монолитами и микросервисами не так чтобы четкая.
S>>>Зависит от. НС>>От чего? S>Требований, бизнес домена.
Да ты прям КО. Ну и? Вот бизнес пришел и затребовал перф, заведомо превышающий возможности хранилища без шардинга. Ты как, таки потащишь распределенные технологии в монолит или пошлешь бизнес в жопу?
НС>>Я не буду все это читать в поисках доказательств тому, что ты тут заявляешь. Есть конкретно список тем, которые нужны в микросервисах и не нужны в аналогичного масштаба монолите? S>API Gateway Design Pattern,
Нужен как только в кластере у тебя становится больше одного сервиса. Монолит вовсе не означает что сервис у тебя строго один. Для иллюстрации, чтобы ты понял о чем речь:
пусть у тебя есть внутри кластера некий storage сервис. Чтобы у тебя не было потуг втащить его в монолит, предположим что сервис делаешь не ты, ты используешь готовый (требование бизнеса). И есть некий бэк, который из стораджа читает пользовательские данные для работы.
Теперь у нас есть сценарий, когда пользователь грузит некие файлы в хранилище, а потом бэк их обрабатывает. Варианты реализации:
* Проксируем все обращения к хранилищу через твой бэк
* Выставляем хранилище отдельно наружу, аутентификацию и авторизацию делаем средствами хранилища (SAS токены, policy на бакеты/контейнеры etc)
* Выставляем хранилище отдельно наружу, аутентификацию и авторизацию делаем при помощи еще одного сервиса-прокси, реализующего auth, аналогичный бэку
* Делаем один прокси и на бэк и на хранилище, уберая всю auth логику из обоих сервисов
Что выберешь и почему?
S> Access token pattern,
Это, по твоему, специфика микросервисов? А в монолите ты что, будешь креды в каждом запросе гонять?
S> side car pattern.
Ну а тут где специфика?
Возьмем пример, приведенный выше. Предположим, бизнес решил не изобретать велосипед и не рукописать логику авторизации прямо в коде, цементируя ее в продукте. Вместо этого он хочет воспользоваться готовым решением с возможностью настраивать правила авторизации без правки кода. Для конкретики, пусть это будет OPA.
Вопрос — ты OPA сайдкаром навесишь, поднимешь отдельным сервисом или будешь пытаться инсталировать его прямо в ВМ со своим монолитом?
S>https://microservices.io/patterns/observability/distributed-tracing.html
В монолите тебе трейсинг не нужен? Смелый ты.
S>Сойдет, для затравки?
Здравствуйте, Sharov, Вы писали:
НС>>Нет. В первую очередь это снижение оверхеда ВМ, т.е. контейнер это быстрее и дешевле. Потому что альтернатива докеру это прежде всего виртуалки. S>А простота деплоя не предполагает снижение оверхеда ВМ?
А она есть, простота? Чем образ контейнера проще образа ВМ? Скорее наоборот, у контейнера есть ограничения по хостовой ОС, а у образа ВМ нет.
А то что вместо образа в ВМ иногда пытаются накатывать прикладное решение скриптами, так это исключительно по причине все того же оверхеда, так как готовые образы в облаках уже на ВМ накачены или лежат в близком кеше, а твой кастомный образ нужно будет выкачать из хранилища, а он, в силу наличия в нем полноценной ОС, имеет немаленький размер. Что, в свою очередь, удар по яйцам автоскейлинга, где каждая секунда на счету.
НС>>Возврат техдолга это не только рефакторинг, так что неверно.
S>Вики не совсем согласно, что неверно -- https://en.wikipedia.org/wiki/Code_refactoring#Motivation: S>
S>Failure to perform refactoring can result in accumulating technical debt; on the other hand, refactoring is one of the primary means of repaying technical debt.
У тебя как с логикой? Из утверждения что отсутствие рефакторинга накапливает техдолг не следует, что рефакторинг борется только с техдолгом. Отсутствие лопаты приводит к накоплению снега перед крыльцом, но это не означает что лопата может чистить только снег перед крыльцом, андерстенд?
S>>>Свитч на 50 кейсов делать не разумно. А на 49 или 36 самое то? НС>>А как по твоему? S>Без понятия, никогда в таком разрезе об этом не думал.
Так подумай.
S> Просто смущает нелепость постановки и выбор конкретных чисел.
Ну так зачем тогда ты выбрал конкретные числа? Я ж говорю, сам придумал, сам посмеялся.
НС>>К разговору. Количественные значения приводят к качественным скачкам. S>Хорошо, спрошу иначе -- сформулируйте это в контексте кода. Т.е. кол-во кода перейдет в его качество?
Я уже сформулировал, вернись и перечитай, только теперь без своих фантазий.
S>>>К количеству кода, т.е. чем больше кода тем лучше? НС>>Удивительная логика. Не пояснишь? S>См. выше.
Что я там должен увидеть? Ответь на вопрос, а не посылай неизвестно куда.
НС>>Нет, какую то абсолютную границу придумал именно ты. И именно над ее абсолютностью и посмеялся. Т.е. посмеялся сам над собой. У Чапека этот прием называется имаго. S>О, началось, боевая имага в ход пошла.
Так не применяй подобные приемчики.
S>Просто 50 свичей или визитор это было словоблудие.
До свидания, бисер закончился.
S>Опять странное заявление -- т.е. если я своем монолите буду использовать n-ое кол-во "разных чужих сервисов", то начиная S>с какого-то n мой монолит становится микросервисом.
Ты опять приписал мне то, чего я не говорил. То ли у тебя проблемы с логикой и пониманием написанного, то ли окончательно аргументы закончились.
НС>>К примеру, твой монолит умеет хелсчеки, и чтобы если хелсчек стал выдавать проблему, сервис бы автоматически рестартанул? Если да, то как это реализовано? S>Ну как вариант, завершить все текущие операции, или скинуть их состояние на диск, сделать fork (или поднять новый процесс), а S>сам процесс может себя прибить. Как-то так. А что докажет ответ на этот вопрос?
Что ты изобрел велосипед и написал кучу кода. А в микросервисах это все умеет оркестратор искаропки, тебе достаточно только сам хелсчек написать, обычно совсем примитивный. Так что твое утверждение:
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>>>Какой руководитель команды, какие ГОСТы? Твои продажники подписывают с клиентом контракт, где прописаны конкретные цифры. И за несоответствие этим цифрам клиент вправе потребовать прописанную в договоре же компенсацию. В каком месте тут может помочь твоя мухлефилософия про магию в реальном мире? Z>>Что-то у тебя какое-то совсем неприкрытое хамство пошло.
НС>Тебе показалось. Не стоит претензии к написанному тобой переносить на себя лично.
Типичная хамлофилософия.
НС>Это тебе повезло, можно расслабиться и не иметь никаких четких рамок. В современном мире облачных сервисов не так чтобы частая ситуация, мало кто хочет использовать сервис, который в один прекрасный момент начнет тормозить и никаких обязательств по этому поводу ни у кого не будет.
Я тут походил по конторам, которые ты называешь продуктовыми, и услышал, что:
— оптимизации слишком дорогие, т.к. время разработчика стоит конских денег
— оптимизации дают не сильно много профита на единицу времени разработчика
— фичи дают денег гораздо больше, на порядки
— железо-клауд намного дешевле чем стоимость труда тестеров-разработчиков
— в большинстве случаем проще докинуть мощностей в самом клауде
— а если выкинуть тестеров, то можно и в хороший плюс выйти, и багов будет меньше, а то с тестерми девелоперы расслабляются
— а что бы сэкономить на девелоперах, надо их загрузить всем подряд — девопс, тестирование, бизнес-анализ, солюшн-архитектура, не говоря про мелкий багфикс которого всегда прорва
На таком вот фоне "начнет тормозить" не выглядит большим риском.
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Есть варианты? НС>Масса. Но вопрос был о другом. Прежде чем заниматься оптимизацией, надо понять что оптимизировать.
Код, естественно.
НС>>>Это если оно масштабируется. S>>На нет и суда нет. НС>Что это означает на практике? Тормозит, да и бог с ним?
Монолит. Не масштабируется. Тормозит. Такого не встречал. Что можно сделать -- ну смотреть узкие места в коде.
S>>Ну т.е. если мы на 4-5 машинах запустили наш инстанс монолита, то теперь у нас микросервисная арх-ра. Ясно. НС>Опять борьба с чучелком.
Логичные выводы из Ваших заявлений, не более.
НС>>>Ровно настолько же, насколько и в микросервисах. У тебя по прежнему какое то крайне странное представление о микросервисах. Монолиты у тебя почему то что то довольно маленькое, без особой нагрузки, без требований к даунтайму, масштабируемости и НА. S>>Очередной уход от конкретного ответа. НС>Это не уход от ответа, это отсутствие конкретных вопросов и попытка переложить на меня бпремя по доказательству твоих утверждений.
Именно уход, ибо через "Ровно настолько же, насколько и в микросервисах" можно объяснить все что угодно. Читой воды казуистика.
Слабый довод, но вот я в гугл забил "nosql monolithic architecture" и ничего кроме nosql и микросервисов не получил. Т.е.
не особо кому интересно это сочетание, так что скорее всего nosql и монолиты встречаются крайне и крайне редко.
Приведите пример обратного.
S>>Складывается ощущение, что монолит вообще от мс ничем не отличается, везде "и там и там". S>>Они прям ноздря в ноздрю идут. НС>В целом да, это не два разных мира, и грань между монолитами и микросервисами не так чтобы четкая.
Ноздря в ноздрю же идут.
S>>Требований, бизнес домена. НС>Да ты прям КО. Ну и? Вот бизнес пришел и затребовал перф, заведомо превышающий возможности хранилища без шардинга. Ты как, таки потащишь распределенные технологии в монолит или пошлешь бизнес в жопу?
Буду думать что можно сделать.
НС>>>Я не буду все это читать в поисках доказательств тому, что ты тут заявляешь. Есть конкретно список тем, которые нужны в микросервисах и не нужны в аналогичного масштаба монолите? S>>API Gateway Design Pattern,
НС>Нужен как только в кластере у тебя становится больше одного сервиса. Монолит вовсе не означает что сервис у тебя строго один. Для иллюстрации, чтобы ты понял о чем речь: НС>пусть у тебя есть внутри кластера некий storage сервис. Чтобы у тебя не было потуг втащить его в монолит, предположим что сервис делаешь не ты, ты используешь готовый (требование бизнеса). И есть некий бэк, который из стораджа читает пользовательские данные для работы. НС>Теперь у нас есть сценарий, когда пользователь грузит некие файлы в хранилище, а потом бэк их обрабатывает. Варианты реализации: НС>* Проксируем все обращения к хранилищу через твой бэк НС>* Выставляем хранилище отдельно наружу, аутентификацию и авторизацию делаем средствами хранилища (SAS токены, policy на бакеты/контейнеры etc) НС>* Выставляем хранилище отдельно наружу, аутентификацию и авторизацию делаем при помощи еще одного сервиса-прокси, реализующего auth, аналогичный бэку НС>* Делаем один прокси и на бэк и на хранилище, уберая всю auth логику из обоих сервисов НС>Что выберешь и почему?
Выберу, чтобы Вы не уводили беседу в сторону и не разводили казуистику. Читая интернеты понял, что API Gateway Design Pattern
чуть ли не первый паттерн, который используют для перевода монолита на мс арх-ру.
S>> Access token pattern, НС>Это, по твоему, специфика микросервисов? А в монолите ты что, будешь креды в каждом запросе гонять?
Для монолитов не увидел в нем необходимости. Да и интернеты не очень чтобы видят эту необходимость.
S>> side car pattern. НС>Ну а тут где специфика? НС>Возьмем пример, приведенный выше. Предположим, бизнес решил не изобретать велосипед и не рукописать логику авторизации прямо в коде, цементируя ее в продукте. Вместо этого он хочет воспользоваться готовым решением с возможностью настраивать правила авторизации без правки кода. Для конкретики, пусть это будет OPA. НС>Вопрос — ты OPA сайдкаром навесишь, поднимешь отдельным сервисом или будешь пытаться инсталировать его прямо в ВМ со своим монолитом?
Never use a Sidecar Pattern for synchronous activities that must complete prior to generating a user response. Doing so will add some delay to end-user response times.
In terms of micro-service architecture, one service responsible to one business capability or other strategies that you can read here. This leads to the need of tracing multi-separated service which much harder than tracing monolith architecture. In monolith architecture the whole process life-cycle is on one project, but in micro-service architecture to handle one request it needs to call n other services.
You may thinks that it is enough to create separate log service that records all request log for each services. But, when your API hits by hundreds request per second, how do you know that one request log in service A corresponds to log in service B and so on?
… distributed tracing helps you, as a developer, to know deeply about your software behavior.
S>>Сойдет, для затравки? НС>Нет, все варианты мимо.
Я даже не сомневался. Я даже хотел сначала написать имеет ли смысл отвечать на этот вопрос, по скольку Вы все равно все вывернете
наизнанку. Ну а вдруг? Нет, Вы стабильны. Стабильность -- признак мастерства.
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>А простота деплоя не предполагает снижение оверхеда ВМ? НС>А она есть, простота? Чем образ контейнера проще образа ВМ? Скорее наоборот, у контейнера есть ограничения по хостовой ОС, а у образа ВМ нет. НС>А то что вместо образа в ВМ иногда пытаются накатывать прикладное решение скриптами, так это исключительно по причине все того же оверхеда, так как готовые образы в облаках уже на ВМ накачены или лежат в близком кеше, а твой кастомный образ нужно будет выкачать из хранилища, а он, в силу наличия в нем полноценной ОС, имеет немаленький размер. Что, в свою очередь, удар по яйцам автоскейлинга, где каждая секунда на счету.
Резюмирую -- ВМ проще для деплоймента, но хуже для автоскейлинга. Верно?
НС>>>Возврат техдолга это не только рефакторинг, так что неверно. S>>Вики не совсем согласно, что неверно -- https://en.wikipedia.org/wiki/Code_refactoring#Motivation: S>>
S>>Failure to perform refactoring can result in accumulating technical debt; on the other hand, refactoring is one of the primary means of repaying technical debt.
НС>У тебя как с логикой?
Вы слишком категоричны. Надо было писать не "так что неверно", а "верно отчасти". Потому как цитата из вики
говорит, что это именно верно отчасти -- т.е. одна из целей рефакторинга возврат тех. долга.
S>> Просто смущает нелепость постановки и выбор конкретных чисел. НС>Ну так зачем тогда ты выбрал конкретные числа? Я ж говорю, сам придумал, сам посмеялся.
А в реальности:
НС>Не надо все сводить до абсурда. Давай я тебе примером проиллюстрирую. Вот есть такой паттерн Посетитель. Если у тебя 2 реализации — точно нужно его использовать, вместо того чтобы написать просто свитч? А если реализаций 50 штук — разумно ли будет писать свитч на 50 кейсов?
Стабильность!
НС>>>К разговору. Количественные значения приводят к качественным скачкам. S>>Хорошо, спрошу иначе -- сформулируйте это в контексте кода. Т.е. кол-во кода перейдет в его качество? НС>Я уже сформулировал, вернись и перечитай, только теперь без своих фантазий.
Где? Я никакой внятной формулировки не увидел.
S>>>>К количеству кода, т.е. чем больше кода тем лучше? НС>>>Удивительная логика. Не пояснишь? S>>См. выше. НС>Что я там должен увидеть? Ответь на вопрос, а не посылай неизвестно куда.
Не могу пояснить, пока не получу ответ на свой вопрос (см. болд).
S>>Просто 50 свичей или визитор это было словоблудие. НС>До свидания, бисер закончился.
S>>Опять странное заявление -- т.е. если я своем монолите буду использовать n-ое кол-во "разных чужих сервисов", то начиная S>>с какого-то n мой монолит становится микросервисом. НС>Ты опять приписал мне то, чего я не говорил. То ли у тебя проблемы с логикой и пониманием написанного, то ли окончательно аргументы закончились.
Бисер таки нашелся. "Ты опять приписал мне то, чего я не говорил."
НС>И даже если ты используешь этот софт в монолите, количество разных чужих сервисов существенно приблизят твой монолит к микросервисам.
Повторю вопрос -- сколько надо разных и чужих, чтобы монолит в микросеврис?
НС>>>К примеру, твой монолит умеет хелсчеки, и чтобы если хелсчек стал выдавать проблему, сервис бы автоматически рестартанул? Если да, то как это реализовано? S>>Ну как вариант, завершить все текущие операции, или скинуть их состояние на диск, сделать fork (или поднять новый процесс), а S>>сам процесс может себя прибить. Как-то так. А что докажет ответ на этот вопрос? НС>Что ты изобрел велосипед и написал кучу кода. А в микросервисах это все умеет оркестратор искаропки, тебе достаточно только сам хелсчек написать, обычно совсем примитивный. Так что твое утверждение: НС>
НС>Для мс писать приходится чуточку больше кода
НС>Оказалось точным до наоборот.
А почему для монолита это не так? Почему там я не могу сделать это из коробки?
Здравствуйте, Sharov, Вы писали:
S>>>Есть варианты? НС>>Масса. Но вопрос был о другом. Прежде чем заниматься оптимизацией, надо понять что оптимизировать. S>Код, естественно.
НС>>Что это означает на практике? Тормозит, да и бог с ним? S>Монолит. Не масштабируется. Тормозит. Такого не встречал. Что можно сделать -- ну смотреть узкие места в коде.
И как будем искать? Вот в микросервисах все понятно, тебе сразу видно в каком сервисе заткнулось, прям в реальном времени. А в монолите?
S>>>Ну т.е. если мы на 4-5 машинах запустили наш инстанс монолита, то теперь у нас микросервисная арх-ра. Ясно. НС>>Опять борьба с чучелком. S>Логичные выводы из Ваших заявлений, не более.
Нет, придуманное тобой и никак не следующее из моих слов.
НС>>Это не уход от ответа, это отсутствие конкретных вопросов и попытка переложить на меня бпремя по доказательству твоих утверждений. S>Именно уход, ибо через "Ровно настолько же, насколько и в микросервисах" можно объяснить все что угодно.
Нельзя, если ты начнешь наконец приводить конкретику, а не общие слова ни о чем. А на общие слова ты закономерно получил такой же ответ.
S>Слабый довод, но вот я в гугл забил "nosql monolithic architecture" и ничего кроме nosql и микросервисов не получил.
Там может потому что использование NoSql и архитектура никак не связаны? Да не, не может быть.
НС>>В целом да, это не два разных мира, и грань между монолитами и микросервисами не так чтобы четкая. S>Ну! Откуда вдруг снижение к требованиям квалификации -- http://rsdn.org/forum/design/8191560
Я опять полет твоей мысли не уловил. Как из отсутствия четкой грани следует отсутствие снижения требований к квалификации?
НС>>Да ты прям КО. Ну и? Вот бизнес пришел и затребовал перф, заведомо превышающий возможности хранилища без шардинга. Ты как, таки потащишь распределенные технологии в монолит или пошлешь бизнес в жопу? S>Буду думать что можно сделать.
И чего надумаешь? Опять пытаешься на конкретные вопросы отделаться общими словами?
НС>>Нужен как только в кластере у тебя становится больше одного сервиса. Монолит вовсе не означает что сервис у тебя строго один. Для иллюстрации, чтобы ты понял о чем речь: НС>>пусть у тебя есть внутри кластера некий storage сервис. Чтобы у тебя не было потуг втащить его в монолит, предположим что сервис делаешь не ты, ты используешь готовый (требование бизнеса). И есть некий бэк, который из стораджа читает пользовательские данные для работы. НС>>Теперь у нас есть сценарий, когда пользователь грузит некие файлы в хранилище, а потом бэк их обрабатывает. Варианты реализации: НС>>* Проксируем все обращения к хранилищу через твой бэк НС>>* Выставляем хранилище отдельно наружу, аутентификацию и авторизацию делаем средствами хранилища (SAS токены, policy на бакеты/контейнеры etc) НС>>* Выставляем хранилище отдельно наружу, аутентификацию и авторизацию делаем при помощи еще одного сервиса-прокси, реализующего auth, аналогичный бэку НС>>* Делаем один прокси и на бэк и на хранилище, уберая всю auth логику из обоих сервисов НС>>Что выберешь и почему? S>Выберу, чтобы Вы не уводили беседу в сторону
Слив засчитан. Ты опять в ответ на конкретные примеры написал порожняк.
S>Читая интернеты понял, что API Gateway Design Pattern S>чуть ли не первый паттерн, который используют для перевода монолита на мс арх-ру.
На вопрос ответь, а потом паттерны обсудим.
S>>> Access token pattern, НС>>Это, по твоему, специфика микросервисов? А в монолите ты что, будешь креды в каждом запросе гонять? S>Для монолитов не увидел в нем необходимости.
Я задал конкретный вопрос. Где ответ? Каким образом ты собрался осуществлять аутентификацию без токена?
НС>>Вопрос — ты OPA сайдкаром навесишь, поднимешь отдельным сервисом или будешь пытаться инсталировать его прямо в ВМ со своим монолитом? S>Не знаю каким боком тут sidecar
И правда. Каким боком. Я уже понял что ты даже не понимаешь о чем пишешь.
S>У нас авторазация, напоминаю. Так что sidecar не выберу.
Чего блин? Какая связь между авторизацией и сайдкаром?
На всякий случай, а то у тебя опять какая то фантастика в голове, рекомендации с сайта ОРА:
To integrate with OPA outside of Go, we recommend you deploy OPA as a host-level daemon or sidecar container. When your application or service needs to make policy decisions it can query OPA locally via HTTP. Running OPA locally on the same host as your application or service helps ensure policy decisions are fast and highly-available.
Так почему ты не выберешь сайдкар? Нравится лишняя латентность на каждый внешний запрос (some delay to end-user response times)? Вкупе с отсутствием токенов прям прекрасное архитектурное решение. System design interview у меня бы ты точно не прошел, вне зависимости от твоего опыта с микросервисами, просто в силу проблем с базовой архитектурой распределенных систем.
S>>>https://microservices.io/patterns/observability/distributed-tracing.html НС>>В монолите тебе трейсинг не нужен? Смелый ты.
S>Ну-ну, зачем же так? Речь об распределенном трейсенге:
Как только у тебя сервисов больше одного — трейсинг, внезапно, становится распределенным. Даже в монолитах. Ты ж сам написал про кролика. В таких условиях трейсинг должен протрекать все путешествие сообщения, от входящего вызова, его породившего, через очередь, и до получения клиентом конечного результата.
S>>>Сойдет, для затравки? НС>>Нет, все варианты мимо. S>Я даже не сомневался. Я даже хотел сначала написать имеет ли смысл отвечать на этот вопрос, по скольку Вы все равно все вывернете S>наизнанку.
Чувак, я тебе на конкретных примерах все объяснил, даже человек не в теме начнет что то понимать, а ты решил что это так я выворачиваюсь. Ну и какой смысл мне тебе что то объяснять, если ты не прошибаем и игнорируешь все что тебе пишут? Тем более что я далеко не сторонник микросервисов, просто не согласен с той чушью что тут по их поводу поназаявляли.
Оставайся в своих заблуждениях, мне то что.
Здравствуйте, Sharov, Вы писали:
S>Резюмирую -- ВМ проще для деплоймента, но хуже для автоскейлинга. Верно?
Не только автоскейлинга, в целом в плане потребляемых ресурсов. Да, это основная причина появления контейнеров.
S>Вы слишком категоричны. Надо было писать не "так что неверно", а "верно отчасти".
Не надо мне указывать что писать. Я, в отличие от тебя, проблем в логике не допускал.
S>>>с какого-то n мой монолит становится микросервисом. НС>>Ты опять приписал мне то, чего я не говорил. То ли у тебя проблемы с логикой и пониманием написанного, то ли окончательно аргументы закончились. S>Бисер таки нашелся.
Решил дописать до конца ответ, не ты один форум читаешь.
НС>>Что ты изобрел велосипед и написал кучу кода. А в микросервисах это все умеет оркестратор искаропки, тебе достаточно только сам хелсчек написать, обычно совсем примитивный. Так что твое утверждение: НС>>
НС>>Для мс писать приходится чуточку больше кода
НС>>Оказалось точным до наоборот. S>А почему для монолита это не так? Почему там я не могу сделать это из коробки?
Ну ты же не сделал, верно? Ты рассказал как будешь писать велосипед. Почему?
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Вы слишком категоричны. Надо было писать не "так что неверно", а "верно отчасти". НС>Не надо мне указывать что писать. Я, в отличие от тебя, проблем в логике не допускал.
S>>Бисер таки нашелся. НС>Решил дописать до конца ответ, не ты один форум читаешь.
Да, похоже, нашу перепалку никто особо не читает, раз нету комментариев. Было замечание от Спанчекрякса и все.
НС>>>Что ты изобрел велосипед и написал кучу кода. А в микросервисах это все умеет оркестратор искаропки, тебе достаточно только сам хелсчек написать, обычно совсем примитивный. Так что твое утверждение: НС>>>
НС>>>Для мс писать приходится чуточку больше кода
НС>>>Оказалось точным до наоборот. S>>А почему для монолита это не так? Почему там я не могу сделать это из коробки? НС>Ну ты же не сделал, верно? Ты рассказал как будешь писать велосипед. Почему?
С брокером был вариант вообще ничего не делать, без брокера я только набросал общие идеи, которые
тут же были объявлены велосипедом, хотя и тут есть наверняка какие-то общие и известные решения. Но может Вы
таки покажете мастер класс и расскажете как такое реализовать? А то все я да я...
Здравствуйте, Sharov, Вы писали:
S>тут же были объявлены велосипедом, хотя и тут есть наверняка какие-то общие и известные решения. Но может Вы S>таки покажете мастер класс и расскажете как такое реализовать? А то все я да я...
Я тебе уже прямым текстом написал — это все делается при помощи готовых решений, а не велосипедится самостоятельно. Что непонятно?
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Код, естественно. НС>
Ожидаемая реакция.
S>>Монолит. Не масштабируется. Тормозит. Такого не встречал. Что можно сделать -- ну смотреть узкие места в коде. НС>И как будем искать? Вот в микросервисах все понятно, тебе сразу видно в каком сервисе заткнулось, прям в реальном времени. А в монолите?
Профилировщик?
S>>Слабый довод, но вот я в гугл забил "nosql monolithic architecture" и ничего кроме nosql и микросервисов не получил. НС>Там может потому что использование NoSql и архитектура никак не связаны? Да не, не может быть.
Сильно. Как можно было сделать такой вывод -- я Так не связаны, что только в мс архитектурах и используются.
НС>>>В целом да, это не два разных мира, и грань между монолитами и микросервисами не так чтобы четкая. S>>Ну! Откуда вдруг снижение к требованиям квалификации -- http://rsdn.org/forum/design/8191560
НС>Я опять полет твоей мысли не уловил. Как из отсутствия четкой грани следует отсутствие снижения требований к квалификации?
Как из отсутствия следует отсутствие. И ведь не поспоришь.
НС>>>Да ты прям КО. Ну и? Вот бизнес пришел и затребовал перф, заведомо превышающий возможности хранилища без шардинга. Ты как, таки потащишь распределенные технологии в монолит или пошлешь бизнес в жопу? S>>Буду думать что можно сделать. НС>И чего надумаешь? Опять пытаешься на конкретные вопросы отделаться общими словами?
Спрошу тогда Вашего совета. Что посоветуете?
НС>>>Нужен как только в кластере у тебя становится больше одного сервиса. Монолит вовсе не означает что сервис у тебя строго один. Для иллюстрации, чтобы ты понял о чем речь: НС>>>пусть у тебя есть внутри кластера некий storage сервис. Чтобы у тебя не было потуг втащить его в монолит, предположим что сервис делаешь не ты, ты используешь готовый (требование бизнеса). И есть некий бэк, который из стораджа читает пользовательские данные для работы. НС>>>Теперь у нас есть сценарий, когда пользователь грузит некие файлы в хранилище, а потом бэк их обрабатывает. Варианты реализации: НС>>>* Проксируем все обращения к хранилищу через твой бэк НС>>>* Выставляем хранилище отдельно наружу, аутентификацию и авторизацию делаем средствами хранилища (SAS токены, policy на бакеты/контейнеры etc) НС>>>* Выставляем хранилище отдельно наружу, аутентификацию и авторизацию делаем при помощи еще одного сервиса-прокси, реализующего auth, аналогичный бэку НС>>>* Делаем один прокси и на бэк и на хранилище, уберая всю auth логику из обоих сервисов НС>>>Что выберешь и почему? S>>Выберу, чтобы Вы не уводили беседу в сторону НС>Слив засчитан. Ты опять в ответ на конкретные примеры написал порожняк.
Ну-ну, голубчик, держите себя в руках. Мы не в кпз.
S>>Читая интернеты понял, что API Gateway Design Pattern S>>чуть ли не первый паттерн, который используют для перевода монолита на мс арх-ру. НС>На вопрос ответь, а потом паттерны обсудим.
1) Я не на допросе;
2) Чтобы я не ответил, все равно все это вывернется наизнанку и пропадет в словоблудии;
3) На всякий случай этот вариант " аутентификацию и авторизацию делаем средствами хранилища " ибо
монолит(т.е.кодовую базу) лишний раз трогать не надо (а то мало ли -- тут уберем auth, а тут понадобиться);
4) Но скорее всего речь идет о прокси и об этом -- https://stackoverflow.com/questions/35756663/api-gateway-vs-reverse-proxy
Что-то есть общее, да, но это далеко не одно и то же.
S>>>> Access token pattern, НС>>>Это, по твоему, специфика микросервисов? А в монолите ты что, будешь креды в каждом запросе гонять? S>>Для монолитов не увидел в нем необходимости. НС>Я задал конкретный вопрос. Где ответ? Каким образом ты собрался осуществлять аутентификацию без токена?
Через reverse proxy. Т.е.прячем все за LB.
НС>>>Вопрос — ты OPA сайдкаром навесишь, поднимешь отдельным сервисом или будешь пытаться инсталировать его прямо в ВМ со своим монолитом? S>>Не знаю каким боком тут sidecar НС>И правда. Каким боком. Я уже понял что ты даже не понимаешь о чем пишешь.
Ну кто бы сумлевался.
S>>У нас авторазация, напоминаю. Так что sidecar не выберу. НС>Чего блин? Какая связь между авторизацией и сайдкаром?
Предсказуемо!
НС>Возьмем пример, приведенный выше. Предположим, бизнес решил не изобретать велосипед и не рукописать логику авторизации прямо в коде, цементируя ее в продукте. Вместо этого он хочет воспользоваться готовым решением с возможностью настраивать правила авторизации без правки кода. Для конкретики, пусть это будет OPA.
Т.е. речь об авторизации. Есть ли смысл в асинхронной авторизации? Далее, привел цитату
Never use a Sidecar Pattern for synchronous activities that must complete prior to generating a user response. Doing so will add some delay to end-user response times.
Где я не прав? (Ответ знаю -- везде ).
НС>На всякий случай, а то у тебя опять какая то фантастика в голове, рекомендации с сайта ОРА: НС>
НС>To integrate with OPA outside of Go, we recommend you deploy OPA as a host-level daemon or sidecar container. When your application or service needs to make policy decisions it can query OPA locally via HTTP. Running OPA locally on the same host as your application or service helps ensure policy decisions are fast and highly-available.
НС>Так почему ты не выберешь сайдкар? Нравится лишняя латентность на каждый внешний запрос (some delay to end-user response times)? Вкупе с отсутствием токенов прям прекрасное архитектурное решение.
Ну что пристовать к человеку, который в мс арх-ре не работал? Что нагуглил то и показал. Что я могу сделать, если противоречие?
НС>System design interview у меня бы ты точно не прошел, вне зависимости от твоего опыта с микросервисами, просто в силу проблем с базовой архитектурой распределенных систем.
Свят, свят, свят.
S>>Ну-ну, зачем же так? Речь об распределенном трейсенге: НС>Как только у тебя сервисов больше одного — трейсинг, внезапно, становится распределенным. Даже в монолитах. Ты ж сам написал про кролика. В таких условиях трейсинг должен протрекать все путешествие сообщения, от входящего вызова, его породившего, через очередь, и до получения клиентом конечного результата.
Логично, конечно. У rmq есть своя панель и ui для управления, мониторинга и tracing'а + еще один наш монолит. Что делать?
Впендюирть распеределенный трейсинг для 2-х сервисов, у одно из которых tracing и мониторинг встроены by design.
Люди используют распределенный трейсинг для 10, а то 100 или более сервисов, а мы для 2х. Выкусите все!
Дайте угодаю -- Вы из Челябинска?
НС>>>Нет, все варианты мимо. S>>Я даже не сомневался. Я даже хотел сначала написать имеет ли смысл отвечать на этот вопрос, по скольку Вы все равно все вывернете S>>наизнанку. НС>Чувак, я тебе на конкретных примерах все объяснил, даже человек не в теме начнет что то понимать, а ты решил что это так я выворачиваюсь. Ну и какой смысл мне тебе что то объяснять, если ты не прошибаем и игнорируешь все что тебе пишут? Тем более что я далеко не сторонник микросервисов, просто не согласен с той чушью что тут по их поводу поназаявляли.
В ответ назаявляли неменьшую без доказательную чушь. Клин клином, как говорится.
Здравствуйте, SkyDance, Вы писали:
C>>Я бы не сказал, что "легко". Запуск виртуалки на EC2 требует что-то около четырёх-пяти десятков сервисов. SD>Вот прям "требует", или "историческая реализация такова, что"?
Да, требуют. Так как надо найти и зарезервировать физический узел, виртуальные сетевые интерфейсы, IP-адреса, EBS, настроить маршрутизацию и т.д. К этому добавляются тонкости типа учёта Reserved Instances, проверки безопасности, интеграция с биллинговой системой.
А ещё бывают сложности типа Launch Group — это требование запустить несколько узлов, которые физически находятся поблизости.
SD>Сколько из них могут лежать (и потом, eventually, добраться в нужную кондицию)?
Практически всё будет критично.
Ну тогда понятно, почему AWS так периодично ложится. Лично мое мнение, если на критическом пути столько компонентов, это лишь вопрос времени, когда оно в очередной раз накернится.
Разве что там традиционная индус-трия, когда старые сервисы принципиально стараются не трогать, поддерживая as-is, а все новые фичи приделывают параллельно, без рефакторинга существующей инфраструктуры.
Хм, учитывая что ты писал про "захотелось мне, и сделал я копию со своими перламутрами", кажется, так оно и обстоит. И, само собой, это легко оправдать "бизнес точкой зрения".
Здравствуйте, SkyDance, Вы писали:
C>>Практически всё будет критично. SD>Ну тогда понятно, почему AWS так периодично ложится. Лично мое мнение, если на критическом пути столько компонентов, это лишь вопрос времени, когда оно в очередной раз накернится.
Обычно сам EC2 не ложится. Кроме того, контрольная плоскость построена по принципу "статической стабильности". Т.е. если отломается сервис, то уже запущенные системы/сессии не будут затронуты. Так что если хочется надёжности, то можно использовать классический EC2 + EBS + Load Balancer, и он на практике будет железно надёжным.
SD>Разве что там традиционная индус-трия, когда старые сервисы принципиально стараются не трогать, поддерживая as-is, а все новые фичи приделывают параллельно, без рефакторинга существующей инфраструктуры.
Нет, это просто реально сложная задача. Кстати, весь стек неиндусы переписали всего несколько лет назад.
SD>Хм, учитывая что ты писал про "захотелось мне, и сделал я копию со своими перламутрами", кажется, так оно и обстоит. И, само собой, это легко оправдать "бизнес точкой зрения".
За EC2 в AWS следят строго, а вот в сервисах вокруг него — случается. Например, я бы не рекомендовал Lambda для чего-то критичного.