Расскажу про системы с микросервисной архитектурой (MSA). Как они устроены, как я их анализировала, какие увидела проблемы и преимущества.
Статья не раскрывает лучшие практики использования микросервисов и не разоблачает их излишнюю популярность. Основная цель - описать технологию и процесс работы с ней с точки зрения системного аналитика.
Если Ваш опыт отличается от того, что указано в статье - пишите комментарии, будет полезно. Ведь систем на микросервисах становится все больше, а в школе к такому не готовят.
Содержание
1. Что такое система с MSA
"Микросервисная архитектура - это стиль проектирования, который разбивает приложение на отдельные сервисы с разными функциями. <...> В микросервисной архитектуре единицей модульности являются сервисы. Сервисы обладают API, которые служат непроницаемым барьером." К. Ричардсон "Микросервисы. Паттерны разработки и рефакторинга"
Система с MSA - сильная и независимая. Согласно задумке, она может не заботиться о масштабируемости, использовать разные стеки технологий и легко исправлять свои ошибки. Ее подход позволяет быстро развиваться и быть гибкими в поддержке.
На практике это все может оказаться запутавшейся в себе и своих связях, перегруженной и довольно хрупкой конструкцией. Все зависит от способа приготовления и места приложения.
То есть, как неоднократно писали (раз, два, три), MSA полезна не везде. Решение о ее использовании не тривиально, такие системы сложны для понимания и требуют особого внимания к своей архитектуре.
1.1. Выявление микросервисов
Вы спросите меня, что такое микросервисы? Я отвечу, что это, как правило, небольшие сервисы.
И вы уйдете, так и не узнав, что каждый реализует свою функцию, у каждого своя база данных и может быть свой стек технологий.
Самый сложный, вероятно, вопрос: как выделять микросервисы? Правильного ответа или алгоритма для этого нет. Все зависит от домена и того, какие проблемы вы решаете.
В главной шпаргалке по MSA в блоке Декомпозиция есть пополняемый перечень используемых подходов.
Давайте рассмотрим на примере способ декомпозиции по поддомену.
Этот подход основан на domain-driven design (DDD). То есть необходимо выявить поддомены системы, у каждого из которых своя доменная модель. Далее поддомены конвертируются в микросервисы.
Допустим, мы делаем систему для заказа продуктов в небольшом магазине рядом с домом. У нас есть пользовательские истории:
заказа (order);
оплаты (payment);
доставки товара (delivery).
Для обеспечения этих процессов необходимо где-то хранить информацию о наличии и количестве продуктов (stock). А также вести финансовый и бухгалтерский учет всех операций (accounting).
Опираясь на доменную модель, мы можем выделить следующие микросервисы:
Orders - для сбора, хранения и обработки заказов;
Payment - для проведения продаж;
Delivery - для хранения информации о передаче в доставку (этот сервис будет взаимодействовать с внешней системой службы доставки);
Stock - для хранения информации об остатках товаров в магазине и их характеристиках;
Accounting - для хранения бухгалтерских и учетных данных (возможно это просто адаптер для нашей 1С).
Но это не единственный вариант. При декомпозиции стоит внимательно изучить бизнес-процессы и пользовательские требования, а также варианты развития системы.
Например, если конечный пользователь заказывает и оплачивает продукты во внешней системе партнера (какой-нибудь продуктовый маркетплейс). В наш магазин просто приходит информация о необходимости собрать и отправить заказ. Оплату партнер отправляет нам раз в месяц суммарно за все сделанные заказы, с учетом возвратов и пр. В этом случае отдельный микросервис Payment пока что не нужен.
Теперь, когда мы выделили основные микросервисы для нашего домена, давайте посмотрим, что с ними происходит в рамках системы и как при этом работают бизнес-процессы.
1.2. Микросервисы и бизнес-процессы
Бизнес-процессы в системе с MSA обычно проходят через несколько микросервисов.
Вернемся к нашему примеру заказа товаров через интернет. С учетом выявленных микросервисов процесс будет примерно таким:
Каждый этап бизнес-процесса обеспечивается отдельным сервисом. Выглядит симпатично и довольно удобно, согласитесь. Ошибки и доработки легко локализуются, у каждого микросевиса своя простая и понятная всем обязанность.
Но что происходит, когда в системе работает сразу несколько бизнес-процессов?
Скорее всего, эти процессы где-то используют одни и те же данные, а значит будут обращаться к одним и тем же микросервисам, или создавать для себя реплики и разбираться с согласованностью.
Ниже в разделе "Процесс разработки системы с MSA" еще напишу про варианты развития событий в такой ситуации. Но так или иначе стоит учитывать, что разные процессы могут использовать одни и те же микросервисы, причем, бывает, на разных этапах и по-разному.
Например, мы можем в системе для заказа товаров через интернет также проводить процесс продажи товаров непосредственно в магазине. В новом процессе сервис Stock появляется только после оплаты. В отличие от заказа через интернет, где есть предварительная проверка наличия товара.
Для ускорения и упрощения реализации бизнес-процессов в MSA иногда создают отдельные управляющие микросервисы и/или используют инструменты автоматизации.
1.2.1. Управляющие микросервисы
Иногда имеет смысл создать управляющий микросервис, который следит за прохождением процессов через разные сервисы и внешние системы.
В управляющем микросервисе будет происходить вызов разных MS в нужной последовательности. А также, возможно, какая-то промежуточная логика, характерная для конкретного процесса.
Так, для обработки продажи товара в магазине можно создать управляющий микросервис Processes. Он сначала вызовет MS Payment для проведения оплаты, затем MS Stock для изменения остатков товара и MS Accounting для фиксации финансовых операций в отчетности.
1.2.2. Платформы BPM
В управляющих микросервисах удобно использовать движки для автоматизации процессов, например Camunda BPM. Такие инструменты позволяют в графическом виде задавать последовательность действий, проверки и условия переходов. При запуске процесса платформа самостоятельно выполняет все описанные шаги.
Вернемся к нашему примеру продажи в магазине:
При реализации этого процесса через Camunda необходимо сделать его BPMN-схему (например, в Camunda Modeler):
Каждый прямоугольник на схеме ссылается на код с логикой:
-
Payment Process - проведение оплаты вызовом MS Payment.
Error Message - если оплата не состоялась по какой-то причине, то происходит отправка сообщения об ошибке и завершение процесса.
Change Stock - изменение количества товара в MS Stock.
Change Accounting - обновление фин. отчетности в MS Accounting.
При инициации продажи MS Processes запустит этот процесс и Camunda выполнит каждый этап в заданной последовательности.
Более сложные схемы могут включать разветвления, таймеры, подпроцессы и пр.
Удобно, что уже описанные элементы одного процесса легко переиспользуются в другом процессе. Также небольшие изменения можно реализовывать без программирования.
Мы рассмотрели, как выделять микросервисы и как их складывать в нужном порядке для реализации процессов. Теперь давайте посмотрим на способы взаимодействия микросервисов с друг другом и внешним миром.
1.3. Интеграции
Как вы, наверное, уже догадались, система с MSA - это тот еще Вавилон, где интегрируются все со всеми любыми мыслимыми способами.
Помимо своей базы данных у каждого микросервиса еще и свой API, любого протокола и вероисповедания. Вот он, век индивидуализации, во всей своей красе.
1.3.1. Взаимодействие между микросервисами
Нет каких-то правил или ограничений для формата интеграций между микросервисами. В рамках одной системы используют разные протоколы и подходы, синхронное и асинхронное взаимодействие.
Обычно архитекторы отдают предпочтение REST+JSON/GraphQL/gRPC и обмену сообщениями с помощью брокера типа Kafka и MQ Rabbit. Итоговый выбор инструментов зависит от требований и возможностей команды.
Рассмотрим возможную последовательность вызовов для реализации процесса продажи товара в магазине из нашего примера:
MS Processes вызывает MS Payment для инициации оплаты и ждет от него обратную связь, чтобы продолжить свою работу. После получения ответа, происходит аналогичный синхронный вызов к MS Stock для списания товаров. Далее в сообщении для брокера уходит информация для MS Accounting, реализуя асинхронное взаимодействие. И MS Processes завершает свою работу, совершенно не беспокоясь, получил MS Accounting данные о покупке или нет.
Стоит учитывать, что каждый микросервис может внезапно отказать и у нас таких ненадежных ребят много. То есть доступность в MSA на самом деле так себе. Многие брокеры гарантируют доставку, и никто не висит "на линии", ожидая ответа. Поэтому рекомендуется по возможности использовать асинхронное взаимодействие между сервисами.
Но в любом случае всегда надо продумывать сценарии-"предохранители": то есть писать отдельный код на случай отказа каждого звена в процессе.
1.3.2. Интеграции с другими сервисами
Внешние сервисы, если им повезет, взаимодействуют с MSA-системой через API-шлюзы.
По К. Ричардсону API-шлюзы занимаются:
объединением API для запросов к нескольким микросервисам;
распределением запросов по нужным микросервисам;
преобразованием разных протоколов интеграций (как микросервисов, так и внешних систем);
реализацией граничных функций вроде аутентификации.
Вполне вероятно, что для каждого фронта или внешней системы будет свой API-шлюз. Так как это соответствует духу независимости и позволяет командам не убить друг друга.
В нашем примере в качестве API-шлюза вполне может выступать MS Processes. Однако при более сложных процессах и интеграциях бывает проще и надежнее их разделить. Например, если у нас есть свой фронт и внешний сервис, которые интегрируются по разным протоколам и поддерживаются разными командами. Но внутри приложения обе интеграции запускают один и тот же процесс.
Как правило внешним системам шлюз предоставляет REST+JSON API, так как в нему все привыкли и считают простым для интеграции. Но можно использовать и GraphQL, который позволяет клиенту указывать в запросе, какие именно данные нужно вернуть. Этот подход помогает при работе с несколькими клиентами, у каждого из которых свои цели и пристрастия.
Можно использовать и другие инструменты для разработки API-шлюзов, можно вообще взять готовый продукт, например AWS API Gateway. Главное - не забыть договориться со всеми потребителями нашего API.
1.4. Отчеты и мониторинг
Итак, у нас есть микросервисы и их интеграции, которые реализуют бизнес-процессы. Для нормального функционирования за этим всем нужно пристально наблюдать, выявлять эффективность и слабые места. И здесь тоже есть свои особенности, связанные с архитектурным подходом.
Нельзя просто так взять и одним запросом к БД собрать сквозной отчет по процессу. Для этого нужен специальный сервис, который будет собирать копии нужных таблиц из всех микросервисов. И только на его основе специально обученные люди будут создавать красивые картинки. В общем, чтобы заказчик мониторил бизнес-показатели, без DWH и BI-системы не обойтись.
Также сложновато без специальных инструментов, типа Kibana, посмотреть, где сломался объединяющий несколько API процесс. И, конечно, для этого необходимо продумывать систему логирования: что, как и когда каждый микросервис будет писать в логи.
И еще желательно, чтобы кто-то периодически тыкал во все ваши микросервисы палочкой, проверяя их доступность. Этот механизм тоже требует отдельных сервисов и проработки их логики.
Волшебство здесь в том, что все эти прибамбасы должны быть согласованы на уровне компании и аккуратно выполняться всеми командами, учитывая интересы всех и вся. Но это уже совсем другая история.
Подводя предварительный итог можно сказать, что на каждый чих аспект системы нужен отдельный микросервис, интеграция и, возможно, отдельная технология. Это придает определенное своеобразие работе с MSA, в том числе задачам аналитика.
2. Что происходит с аналитиком
Если коротко, то аналитик на проектах с MSA устраняет неопределенность. Впрочем, как и везде.
Есть десятки микросервисов и их интеграций, разные технологии и архитектурные паттерны. Процессы, которые действуют по-разному и имеют разные цели, но пересекаются с друг другом. В такой ситуации командам очень сложно разобраться, что, куда и зачем передается, как проходит процесс полностью, что на него может повлиять, на что он может повлиять.
То есть здесь кому-то очень важно уметь:
приводить хаос в порядок;
выявлять требования;
проектировать интеграцию;
понимать ключевые и потенциально опасные части процессов;
контролировать знания команды о системе;
доносить до бизнеса возможности и ограничения продукта.
В общем, для бизнеса и команды аналитик может быть более чем полезен в микросервисной ситуации. Осталось понять, как аналитику не лопнуть от такого счастья.
2.1. Процесс разработки системы с MSA
Часто команды выделяются на продукт или продуктовое направление.
В нашем примере могло бы быть такое разделение:
Команда А - разрабатывает все, что связано с процессом оффлайн продаж в магазине.
Команда Б - делает процесс онлайн-продаж и все соответсвующие задачи.
Микросервисы Payment, Stock и Accounting используются в обоих процессах.
Каждый общий сервис может дорабатываться только конкретной командой, возможно, это будет третья Команда В. Но это может стать узким местом и замедлить разработку. Так как другим командам придется ждать, пока у команды-владельца сервиса дойдет очередь до их задачи.
Еще можно дублировать общие микросервисы, не смешивая разные процессы. То есть у обеих команд будут свои Payment, Stock и Accounting. Таким образом каждая команда сможет дорабатывать и развивать их исключительно для целей своего продукта. В этом случае придется строго следить за согласованностью данных. И смириться с тем, что вы будете дублировать большинство доработок.
Общие микросервисы также могут дорабатываться сразу обеими командами. Но тогда необходимо, чтобы кто-то решал конфликты интересов, обеспечивал обратную совместимость и отслеживал целостность и независимость каждого такого микросервиса. Хорошо, если для этого назначается конкретная команда и конкретные люди, которые будут делать вдумчивое ревью каждой доработки.
2.2. Задачи аналитика
Для адекватного анализа необходимо знать все, что как-либо затрагивает или может затронуть твой продукт. То есть аналитикам на проектах с MSA необходимо понимать:
свой продуктовый процесс;
логику работы всех задействованных в продукте микросервисов и механизмы их взаимодействий;
процессы продуктов, которые используют те же микросервисы;
внешние интеграции, их механизм и логику.
Рассмотрим пример, когда надо добавить в метод создания заказа новое поле discount. В этом поле содержится размер скидки, которую интернет-магазин предоставил покупателю.
Для реализации этого небольшого изменения необходимо:
Понять, есть ли в системе подобное поле для скидок, которые предоставляет наш магазин. Если есть, то проработать их взаимодействие и исключить путаницу.
Добавить поле в API-шлюзе для внешних систем.
Добавить поле в API MS Order, его логику и, возможно, БД.
Понять, необходимо ли передавать новое поле в MS Payment. Или достаточно изменить логику расчета цены товара при передаче данных о заказе.
Обновить публикуемые сообщения, связанные с созданием заказа. Определить, какие еще сервисы должны быть оповещены о предоставлении скидки через брокер сообщений (например, MS Accounting).
Добавить в MS Accounting новое поле и логику его обработки.
Продумать, что делать, если на любом из этапов случится сбой (транзакций на весь процесс нет в силу разных БД у микросервисов).
Узнать, как этот показатель должен отражаться в бизнес-отчетах и добавить его в DWH/BI (если повезет, через специально обученных людей).
Бизнес-требования и функционал системы определяют, в каких микросервисах, API и БД должны появиться поле и логика его обработки. То есть разработчик с этим не подскажет. А для заказчика это будет "вам нужно всего лишь добавить одно поле".
Систему с MSA не получится рассматривать как чёрный ящик, где аналитик определяет требования к результату "на выходе". Потому что "на выходе" тут - это на границе каждого микросервиса и все эти границы надо проектировать и определять.
Таким образом, с точки зрения анализа систему с MSA можно рассматривать как десятки небольших систем и интеграций между ними. То есть задачи схожи с работой над любой интеграцией. Но есть один нюанс - интеграций много и они меняются при каждой доработке, вслед за малейшим изменением логики или данных.
2.3. Возможные проблемы
Обозначу основные проблемы, с которыми довелось столкнуться, в порядке убывания бесячести.
2.3.1. Ничего не понятно
Многообразие сервисов, интеграций и технологий со стороны может выглядеть как запутанный клубок разных проводов. И чтобы вытащить свою зарядку для телефона, приходится распутывать LAN, провод от лампочки, чей-то переходник и Ктулху знает что еще.
Но в отличие от проводов, с микросервисами часто еще и не понятно, как их вообще распутывать.
Можно читать код. И мы, например, поймем, что нотификация отправляется при условии comission= true. А почему так происходит - не узнаем. И тем более не узнаем, что где-то в другом конце системы при comission= false отправляется другая нотификация.
Можно обращаться к гуру, которые все это делали и помнят. Только гуру, как известно, всегда заняты, потому что незаменимы. И скорее всего они что-то забыли или, что хуже, не знают о том, что они что-то забыли.
Мне видится, что единственный адекватный способ решить эту проблему - это создать культуру и паттерны ведения документации. Документации, которая описывает общую архитектуру, процессы, точки влияния и, главное, бизнес-требования, которые стоят за логикой работы сервисов. Можно воспользоваться моей памяткой.
Это, конечно, сложная задача, потому что требует слаженной работы всех аналитиков, их координации и дисциплинированности. А также понимания со стороны руководства, что это необходимая работа. Если у меня когда-нибудь получится внедрить или хотя бы увидеть такую красоту в рамках всей системы - обязательно об этом напишу.
2.3.2. "Чужие" доработки
Это когда ничего не понятно, а потом раз - и становится еще непонятнее. Потому что другая команда что-то сделала в общем микросервисе. Другая команда молодец. А у вас что-то сломалось или не работает новый функционал, который, судя по документации, должен бы работать.
Решение видится в совокупности факторов:
повсеместное покрытие автотестами, что и так обязательно для MSA;
документирование всех изменений в едином пространстве ДО реализации (например, писать новые требования на общей странице и выделять их тегами со ссылкой на задачу, где эти требования будут реализованы);
обязательный этап анализа - проверка влияния доработки на другие процессы;
очень дружная и активная коммуникацией аналитиков.
Документирование в таких объемах само по себе может стать проблемой, поэтому стоит посмотреть в сторону автоматизации. Так вы не будете тратить время хотя бы на таблички с API и БД. Но для этого придется поуговаривать разработчиков прикрутить какой-нибудь swagger2markup и выгрузку актуальных полей БД.
Ну или можно строго придерживаться правила "один микросервис - одна команда".
2.3.3. Заказчику сложно
Бизнес ничего не понимает сильнее, чем обычно. Откуда такие сроки, почему все сломалось, зачем вам этот GraphQL?
Чтобы принимать решения по продукту, надо разбираться в работе системы. А значит и всех этих переплетениях процессов, о которых тут так много написано. Хорошо бы совместно с менеджерами составлять ту самую бизнес-документацию и поддерживать ее актуальность.
А еще производительность команды на микросервисах зависит от большого количества факторов. Да и задачи могу быть на самом деле не тем, чем кажутся. Тут уже аналитику надо придумать, как все эти сложности доступно объяснить. Можно попробовать пример с гномиками, как у Максима Цепкова. Или показать на простом примере вроде добавления поля discount. И, опять же, если будут схемы и описания, можно просто тыкать пальцем - где и что вам нужно в итоге сделать для реализации этой "быстрой" доработки.
2.3.4. Требуется много знаний
На самом деле это не проблема, а возможность получить новые навыки и посмотреть на разные технологии.
Но начинать карьеру в такой обстановке - это, кажется, Спарта. Особенно если система обладает всеми проблемами из списка выше. Возможно, кураторство и планы индивидуального развития облегчат ситуацию.
Помимо знаний о самой MSA, нужно быть готовым разобраться в принципах REST, брокеров сообщений и любом способе интеграции, который придет в голову вашему архитектору.
Возможно вас также затронут JWT, инстансы, балансировка, развертывание, анализ производительности, доступности и другие сложные слова.
Ну и совершенно не лишним будет стандартный набор аналитика из работы с требованиями, моделирования, написания понятной документации, БД и SQL и проектирования интеграций.
Очень рекомендую книгу Ричардсона "Микросервисы. Паттерны разработки и рефакторинга" - там про все понемногу и очень понятно объясняется.
2.4. Плюсы MSA для аналитика
Несмотря на все проблемы и сложности, работать с микросервисами мне понравилось. И вот почему:
Во-первых, это интересно. Это как большой конструктор, из которого можно собирать разные процессы. Менять кубики местами и переворачивать нужными гранями для разных плоскостей. Если нравятся интеграции и копаться в технических аспектах - то вы по адресу.
Относительно легко добавлять новые продукты и функции. Для этого пишут новые микросервисы и не нужно беспокоиться о том, что новый код как-то сломает работающие процессы. И даже если вы правите уже работающие микросервисы, то отследить зависимости и влияние проще, чем в монолите.
Если вы знаете свои процессы, то скорее всего быстро сможете определить, в каком микросервисе у вас сбоит при ошибке. И так как микросервисы относительно простые - то исправить тоже будет несложно (наверное). И при обновлении можно выкатить только свой микросервис, не беспокоя соседей.
Скорее всего вы будете работать с профессионалами. Микросервисная архитектура создает вызовы для аналитиков, разработчиков, QA, DevOps и даже менеджеров. То есть все члены команды должны обладать определенным опытом и навыками для нормальной реализации этого подхода.
Как писала выше, работа с MSA - это возможность узнать много нового и поработать с разными технологиями. А значит и развиваться в любимом деле, вырасти как специалист и открыть для себя новые карьерные перспективы.
В системах с микросервисами аналитик бОльшую часть времени занимается именно анализом. На "неаналитические" задачи попросту не остается ресурса. Здесь аналитик по полной реализует свои профильные hard и soft скиллы.
Итог
Микросервисная архитектура - это много разных технологий, интеграций и возможностей для развития как систем, так и людей.
Работа на проекте с MSA подразумевает особый подход, определенные навыки и знания. Нужно разобраться в деталях процессов и технологий. Возможно, изучить что-то или придумать новую схему работы, взаимодействия с заказчиком и коллегами.
Все это вполне постижимо и действительно интересно, хоть поначалу и не совсем прозрачно.
Надеюсь, после этой статьи кому-то станет немного понятнее, что может скрываться за этими загадочными словами в вакансиях. И к чему готовиться, если у вашего техлида внезапно улучшилось настроение и загорелись глаза.
Комментарии (22)
Paskin
13.10.2021 00:13-1В качестве аналитика, я бы вместо последовательности вызовов (диаграмма "Процесс OfflineSale") описал бы зависимости - что нужно вызывать после чего. И все микросервисы заставил бы слушать шину сообщений. Чтобы например, управление запасами работало не синхронно, а по событию об оплате, в свою очередь генерируя событие Purchase - тем более что у вас все равно message broker уже присутствует. Если захочется - все эти события можно пересылать еще и клиенту - держа его в курсе происходящего.
Это позволит избежать многих проблем - от простейших, когда ответ не возвращается пока функция-обработчик запроса не закончит работу - до более сложных, когда все обработчики ждут "притормознувший" микросервис, отказывая клиентам в обслуживании других запросов.
И разбираться в этом гораздо проще - по логам брокера сразу видно, что происходило и когда.TatyanaSalnikova Автор
13.10.2021 00:20Спасибо за комментарий. Там ниже написано про возможные проблемы с доступностью и что в идеале взаимодействия между микросервисами лучше делать через брокер. Но аналитик не всегда принимает такие решения и иногда просто работает с тем, что есть. А бывают и прямые вызовы микросервисами друг друга. Поэтому на диаграмме указала разные варианты взаимодействия.
Подскажите, а в каким формате Вы бы описывали зависимости?
Paskin
13.10.2021 00:41+1Граф бы нарисовал, либо таблицу - успех какого действия (или их набора) "запускает" текущее действие.
Nashev
16.10.2021 11:06Не слышал, чтоб менеджеры очередей были серебряной пулей. У них там свои беды, кажется
Paskin
16.10.2021 21:08"Серебряной пули" не существует - но проще поддерживать один менеджер очередей, чем 3-5 разных HTTP-клиентов/серверов, сервисов discovery, балансировщиков и прочие инфраструктуры.
Katjka
13.10.2021 11:47Большое спасибо за статью! Схемы к статье в какой программе прорисовывались (process offline sale, интеграция с внешним сервисом и т.д.) - очень эффектные получились для восприятия (BPM процесс я так поняла в Camunda Modeler)? Спасибо.
TatyanaSalnikova Автор
13.10.2021 11:48+1Спасибо) Это https://excalidraw.com. А bpmn в Camunda Modeler, да.
Arashi5
13.10.2021 14:09+1Спасибо. Добавил статью в закладки. Буду шарить аналитикам с монолитным сознаним.
IgorNE
15.10.2021 12:50На бизнес вы зря наговариваете) Сейчас продуктовые команды обычно содержат достаточно прошаренный бизнес. У нас, например, даже архитектуру прорабатывают с архитекторами )
TatyanaSalnikova Автор
15.10.2021 12:52Ну что тут скажешь: Вам крупно повезло) Очень рада, что такие кейсы есть.
axtrace
15.10.2021 14:59Было бы интересно узнать подробнее про последовательность и форматы документации.
Делаете ли модель потоков данных? Когда/как разбиваете на процессы? Диаграммы последовательностей, что еще создаете?
TatyanaSalnikova Автор
16.10.2021 15:06Ох, это тема для отдельной статьи. Ну и как и писала, пока у меня и коллег не получилось внедрить систему документации, которая бы закрывала все вопросы.
DFD не делали: верхнеуровнево эти данные на схемах бизнес-процессов отображали, а ниже уже на сиквенсах. Процессы формируются в соответствии с бизнес-задачами (то есть задача реализовать такой вот процесс) или по сути являются вариантами использования.
Документировать стараюсь начиная с описания бизнес-процесса (схема/BRD/use cases). Далее есть шаблон для описания микросервиса и его API, схемы bpmn для Camunda. Диаграммы sequence, activity, state в основном.
По поводу диаграмм также хочу отметить, что в ситуации, когда процесс правят много команд, иногда лучше вообще не рисовать диаграмму. Потому что кто-то обязательно забудет ее изменить и она станет неактуальной. А лучше никакой документации, чем неактуальная, выдающая себя за актуальную.
Вот кстати хороший шаблон для описания микросервиса: https://github.com/cer/microservice-canvas
Moskal368
16.10.2021 23:19Одной из проблем тех, кто работает с Сервисами, является неправильное структурирование. Вот на этом ресурсе https://www.opengroup.org/soa/source-book/soa_refarch/p5.htm описана 10 уровневая модель. Эта модель широко применяется в мире. Более того, примерно тоже самое, что описано на этом сайте, но с небольшими отличиями является стандартом ISO/IEC 18384 части 2 и 3. Хороший пример практического применение 10 уровневой модели - это любимый многими Kubernetes, он с небольшими оговорками полностью ложится в эту модель.
Ресурс очень большой. И для того, чтобы прочесть его, не говоря уже о том, чтобы осознать требуется время. Причем, надо сразу понимать, что работа в парадигме SOA требует перестройки сознания. Многое то, что является привычным и банальным в SOA, работает не так. Например, UML имеет расширения. Поэтому я бы советовал начать вот с этого https://www.opengroup.org/soa/source-book/togaf/p4.htm
Если это покажется слишком заумным, то посмотреть на рисунок, описывающий эталонную архитектуру SOA из предыдущей ссылки и прочесть https://www.opengroup.org/soa/source-book/soa_refarch/p4.htm
На возражение Аналитиков, что это все ближе к Архитекторам, чем к Аналитикам хочется возразить, что понимание 10 уровневой модели помогает правильно структурировать сквозной характер событий на уровнях Интеграции (Integration), Качества обслуживания (Quality of Service) и Информационном (Information).
EgorMaryushko
20.10.2021 13:40Татьяна, большое спасибо за интересную статью!
Заинтересовал момент о квалификации аналитика и пороге вхождения в проекты с микросервисной архитектурой. В голове родился популистский слоган: "Джунам и новичкам тут нет места!" Но давайте по порядку.
Если смотреть со стороны, то аналитиков и их задачи в проекте с микросервисной архитектурой можно разделить на две роли/категории:
аналитики решения (аналитики кроссервисных задач)
аналитики сервисов
аналитики решения - работают с кроссервисными задачами, включающими интеграции, очереди, балансировки и все остальные прелести, перечисленные автором. Они должны обладать широкими знаниями технологий, опытом и глубоким пониманием системы.
аналитики сервисов - решают задачи, контекст которых локализован внутри отдельных сервисов, и для аналитика это становится просто продуктом, который имеет ряд внешних интеграций.
Таким образом, из различий в решаемых задачах, уровне компетенций и глубине знания продукта вытекает приведенный выше лозунг с небольшим уточнением: "Джунам и новичкам в решении кроссервисных задач нет места".
Обусловлено это тем, что джун, не решавший ранее никаких задач, потеряется в дебрях межсервисных взаимодействий, технологий и бизнес логики, опытный новичок на проекте так же будет плутать без глубоких знаний назначения сервисов.
Однако вопросы роста команды, вместе с ростом количества задач и текучки кадров, всегда будут актуальны, отсюда наиболее эффективным маршрутом адаптации и развития аналитиков видится их первичное привлечение к решению задач в рамках отдельных сервисов с последующим расширением кругозора на всю систему и переходом уже в разряд аналитиков решения.
Интересно услышать ваше мнение на этот счет? =)
TatyanaSalnikova Автор
20.10.2021 14:03Егор, спасибо.
Такого варианта распределения задач не видела. Вот какие соображения есть на этот счет: задачи обычно приходят на процесс в целом, то есть старшему аналитику так или иначе нужно будет прорабатывать общую задачу. Далее старший аналитик декомпозирует большую кроссервисную задачу на более простые подзадачи. В этот момент теоретически старший аналитик может раздавать подзадачи младшим аналитикам. В целом, это хороший способ обучения и распределения задач.
Однако, в реальной жизни часто при проработке подзадач всплывают моменты, из-за которых нужно править другие части большой задачи. То есть в итоге общее время выполнения задач при таком распределении скорее всего будет бОльше, чем если бы старший аналитик все делал сам.
Возможно, есть проекты с относительно стабильным функционалом и исчерпывающей документацией, где микросервисы внутри себя хранят значительные куски бизнес-логики. Кажется, что там эта схема может оказаться рабочей. Но в других случаях это скорее решение для процесса адаптации аналитиков. И при условии, что новый сотрудник будет обучаться достаточно быстро.
akhkmed
Большое спасибо за статью.
Насколько детально должен системный аналитик задуматься о поддержании целостности данных, когда он рисует диаграмму последовательности по взаимодействию микросервисов? Либо этот вопрос оставим для архитектора/разработчиков?
TatyanaSalnikova Автор
Спасибо за комментарий.
Не совсем поняла вопрос: целостность данных должна поддерживаться при проектировании БД. Диаграмма последовательности описывает вызовы к сервисам. Или Вы что-то другое имели в виду? Может, есть пример?
qrKot
Видимо, тут вопрос про что-то вроде распределенных транзакций и непротиворечивость данных.
В случае с транзакциями: при отмене заказа в сервисе orders должен измениться незарезервированый остаток в сервисе stock (навскидку, все совпадения случайны).
В случае непротиворечивости данных: должно ли при изменении наименования товара А в сервисе goods изменяться название товара в заказе сервиса orders.
Ну и плюсом: микросервисная архитектура накладывает свои ограничения, боттлнеки - чья головная боль, аналитика или архитектора?
TatyanaSalnikova Автор
Спасибо. Такие задачи часто определяются бизнес-требованиями и непосредственно влияют на функционал. Так что аналитику как минимум нужно знать о их реализации. В моей практике это описывал аналитик в требованиях (не обязательно прямо всё в диаграммы вставлять, они так становятся тяжело читаемыми). А команда подхватывала и задавала неудобные вопросы/тест-кейсы для проверки полноты, непротиворечивости и пр.
Но в принципе нет какого-то универсального свода обязанностей для любого члена команды разработки. В agile-командах люди договариваются и сами решают, как им удобнее работать. То есть команда может решить, что аналитику лучше заниматься общением с заказчиком и разработкой процессов, а все эти предохранители, повествования, взаимосвязи данных и пр. - задача разработчиков. И на конкретном продукте это действительно может быть эффективно.
По поводу архитекторов: тут, на мой взгляд, тоже зависит от конкретики. То есть если все процессы плохо работают из-за низкой доступности сервисов и синхронного обмена между ними - это скорее коллегиальная задача, лидируемая архитектором. А если в вашем апи-шлюзе перегружен какой-то метод - вроде можно и самим решить вопрос. В целом, мне кажется, что любая проблема системы/продукта - это общая головная боль, каждый должен подключаться к решению по мере своих возможностей и компетенций.
akhkmed
Думаю, что когда аналитик проектирует диаграммы последовательности, то уже начинает понемногу вторгаться на территорию архитектора из-за учёта нефункциональных требований. Ну а когда в требованиях появляется указание использовать асинхронное взаимодействие и отдать обработку ошибок на откуп брокеру, то без проработки возможных последствий, а в особенности недостижимого консистентного состояния в общем случае, это вторжение не пройдёт незамеченным. И речь тут вообще не про роли в agile, а про последствия для системы.
TatyanaSalnikova Автор
В целом да, когда кто-то выполняет работу, для которой у него недостаточно компетенций - это чревато проблемами. Однако не факт, что аналитик не в состоянии качественно проработать "возможные последствия". Особенно если речь идет о конкретных процессах системы, а не об общих арх. подходах.
Архитектор может дать арх.шаблон и общие рекомендации по реализации процессов. Аналитики же прорабатывают конкретные взаимодействия и все возможные последствия. На мой взгляд, это нормальный работающий процесс. Конечно, при условии достаточного уровня компетенций как у аналитиков, так и у архитектора.
akhkmed
Спасибо, что уточнили. Этот вопрос и подразумевал.