Комментарии 14
Есть прекрасный сайт где все это собрано https://microservices.io/index.html и книга от того же перца
Microservices Patterns: With Examples in Java есть вроде и на русском, от неё мне спать не хотелось, увлекательное чтиво
Очередной список паттернов) Ответьте: проверка данных должна быть до микросервиса или внутри?
Смотря какая проверка.
Есть проверка формата, например json по схеме.
Есть логический контроль, это бизнес требования.
Соответственно эти проверки живут в каждом сервисе по отдельности. Если сервис выполняет роль gateway - то валидация запроса на его стороне. Если сервис работает с заказами, то проверка на создание заказа живет у него. Можно создать отдельный сервис для проверки, если это большая бизнес логика и зависит от других сервисов.
Начиналось всё хорошо, а потом сага - паттерн (а не антипаттерн). Если мы вовлекаем 2-3-5-10 микросервисов в одну бизнес-операцию, это значит мы неверно их разделили. Это примерно как держать фамилию клиента в одном постгресе, его отчество в другом, а фамилию в третьем. Разумеется, если человек решит поменять ФИО (всё сразу) нам нужна будет сага. Но в действительности нам лучше бы держать изменяемые вместе данные - вместе, ваш кэп.
Если вы считаете, что нужно держать изменяемые данные вместе, то ваш путь - монолит. В MSA так не работает, держать все данные в одном месте нонсенс, например, я не смогу при проведении банковского платежа (одна бизнес операция) смешать все в кучу, уменьшение лимитов, расчет комиссии, хранение истории. И т.к. это разные сервисы, то сразу возникает распределенная транзакция и проблема согласованности данных. А как ее решать, сага или не сага, тут уж каждый решает сам, не нравится сага, придумываем свое решие, и возможно потом появится новый потерн.
Опыт автора и академический тон статьи должны как будто убедить нас, что всё написанное нужно всем. Пользуйтесь и всё у вас будет хорошо. Если прочитав эту статью вы уже идёте душить своего монолита и разделять базу данных, не торопитесь.
Для начала то о чём забыл написать автор (преклонный возраст или нежелание портить благостную картинку) - КАЖДЫЙ пункт этого набора имеет свои недостатки. Например. Вот, руководствуясь Decompose By Business Capability и Database Per Service вы вынесли покупки пользователей в одну базу, а профили пользователей в другую. Вдруг к вам прибегает окрыленное руководство и говорит - ребята срочно, у нас есть бизнес идея, для проверки нам нужно сгруппировать покупки по городам пользователей и посчитать их количество. Адрес пользователя в базе профилей, покупки в базе покупок, простой join не сделать. Как быть? В этот момент обычно приходят умные дяди с 30 летним опытом и говорят, что нам нужно data strategy, data warehouse, etl и т.д. Получается, что для того, чтобы сделать простой аналитический join в мире микросервисов вам теперь нужно иметь дополнительный тяжелый, дорогостоящий, требующий обслуживания слой. Иногда это неизбежно, но мне кажется в 90% случаев этого можно избежать.
Или же паттерн Сага. Вот вы делаете транзакцию и просходит ошибка, нужно откатиться. Ничего страшного, говорит Сергей Громов, достаточно запустить серию(sic!) компенсирующих транзакций и все вернется на свои места. Но вот в этой серии из 10 компенсирующих транзакций, восьмая упала с эксепшеном. Что теперь? Компенсируем компенсирующие транзакции? Или просто забиваем, оставляем неконсистентный стейт и называем это progressive eventual consistency?
Я уже не говорю про курьезы и перегибы, когда на 15 человек команды в компании написана сотня микросервисов. Time2market и delivery speed падают практически до 0.
Сергей как мне кажется начал не с того. Главный вопрос современности, не как удушить ваш монолит, а в каком случае вам вообще стоит использовать микросервисы и для чего они нужны. Из своего 18 летнего опыта могу сказать, что единственное, когда микросервисы действительно помогают, а не мешают - это когда у вас МНОГО разработчиков. Как в Гугле, Яндексе и прочих Майкрософтах.
Если же у вас весь отдел разработки до 50 человек, я бы порекомендовал использовать модульный монолит и сэкономить огромное количество времени и сил. Как справедливо замечает Сергей, в случае необходимости потом его всегда можно "удушить".
Я с вами практически полностью согласен (к сожаления не смог вас идентифицировать). И действительно "Главный вопрос современности, не как удушить ваш монолит, а в каком случае вам вообще стоит использовать микросервисы и для чего они нужны ", но данная статья ни в коем случае не была направлена на выбор архитектур, да и рассчитана немного на другую аудиторию, на тех молодых специалистов кому (бородатые дядьки) сказали "делаем MSA", и тут зачастую начинается изобретение велосипеда.
А по поводу выбора архитектуры, особенно MSA, на эту тему надо делать отдельную статью, но размещать ее надо будет в разделе "Философия" т.к. тут сколько люде, столько и мнений. Я сам считаю, что к выбору MSA надо подходить крайне осторожно и продуманно, т.к. недостатков и сложностей у этой архитектуры очень много. Скажу больше, лично я считаю, что часть того, что принято считать достоинствами MSA, является ее недостатками. :-) И зачастую переход на микросервисы продиктован "модой", а не реальной необходимостью.
Но повторюсь это отдельная тема. И нам все равно не никуда не деться от микросервисов (по крайней мере в ближайшем будущем) и значит нужно уметь их проектировать и понимать как они работают.
А нельзя для аналитики взять ещё один сервис и дать ему доступ к репликам нужных бд? И сервис отдельный и статистика тянется с бд которых не жалко.
Я бы не стал так критично относиться к микросервисам. В моём случае, например, так получилось, что я - единственный человек в команде по разработке системы скрейпинга, но при этом скрейперы очень разные, и их много, а контрольная панель одна. Логично, что каждый скрейпер я выделю в микросервис, который обрабатывает очередь постоянных задач и который я в любой момент могу остановить, чтобы улучшить, и запустить вновь. Так что случай с большой командой - не единственный возможный)
Вдруг к вам прибегает окрыленное руководство и говорит - ребята срочно, у нас есть бизнес идея, для проверки нам нужно сгруппировать покупки по городам пользователей и посчитать их количество. Адрес пользователя в базе профилей, покупки в базе покупок, простой join не сделать.
Аналитикам как правило и БД нужна другая, в т.ч. колоночная.
Можно сделать топик в кафке и пулять туда данные. На топик посадить отдельный сервис аналитики который будет агрегировать данные в своей базе.
Статья - краткая выжимка из книги Сэма "Создание микросервисов" ( и откровенно говоря бесполезная )
будем исходить из того, что микросервисная архитектура — это уже решенный вопрос
Дешёвка!
За такое денег много не заплатят, т.к. реализация микросервисов это не вопрос архитектора, а так... аналитика 5го ранга, который с высокой вероятностью угробит систему.
Вот за что денег заплатят это когда ты решишь вопрос где нужно выделить микросервис, а где нет и почему и сколько это будет стоить сейчас и в перспективе и при некоторых сценариях.
Разбираемся в проектировании микросервисов. Основные паттерны (Часть 1)