<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>разработка микросервисов Archives &#8226; König Labs</title>
	<atom:link href="https://koniglabs.ru/tag/razrabotka-mikroservisov-ru/feed/" rel="self" type="application/rss+xml" />
	<link>https://koniglabs.ru/tag/razrabotka-mikroservisov-ru/</link>
	<description></description>
	<lastBuildDate>Wed, 21 May 2025 12:56:24 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://koniglabs.ru/wp-content/uploads/2019/06/cropped-favicon-32x32.png</url>
	<title>разработка микросервисов Archives &#8226; König Labs</title>
	<link>https://koniglabs.ru/tag/razrabotka-mikroservisov-ru/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Микросервисы и CQRS: оптимизируем затраты на продукт</title>
		<link>https://koniglabs.ru/cqrs-microservices/</link>
					<comments>https://koniglabs.ru/cqrs-microservices/#comments</comments>
		
		<dc:creator><![CDATA[Alexey Palatkin]]></dc:creator>
		<pubDate>Tue, 07 Apr 2020 14:50:23 +0000</pubDate>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[cqrs]]></category>
		<category><![CDATA[микросервисы]]></category>
		<category><![CDATA[разработка микросервисов]]></category>
		<guid isPermaLink="false">https://koniglabs.com/?p=3962</guid>

					<description><![CDATA[<p>The post <a href="https://koniglabs.ru/cqrs-microservices/">Микросервисы и CQRS: оптимизируем затраты на продукт</a> appeared first on <a href="https://koniglabs.ru">König Labs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div id="tm-row-69dc49282247b" class="vc_row vc_row-outer vc_row-fluid"><div id="tm-column-69dc49282473b" class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner "><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><em>Эта статья для представителей бизнеса с запросом на разработку ИТ-решения, чьи технические знания не актуальны или недостаточны для принятия обоснованных решений. То есть для тех, кто отошел от “дел технических” и работает на стороне стратегии, маркетинга или клиентского сервиса. Мы подскажем, как запустить продукт и избежать неоправданных затрат, связанных с архитектурой. А также посмотрим, как использование CQRS поможет при реализации функционала в разных клиентах приложения, и являются ли микросервисы той самой панацеей.</em></p>
<p> </p>
<h2 class="wp-block-heading">Почему архитектура важна для бизнеса</h2>
<p>Ни один программный продукт невозможно рассматривать в отрыве от конкретных бизнес-процессов. Софт существует не сам по себе, а для того чтобы автоматизировать процессы, улучшить пользовательский опыт, помочь бизнесу добиться определенных показателей. Архитектура ИТ-решения строится с учетом бизнес-архитектуры. Таким образом, она является воплощением общего видения бизнеса и закладывает предпосылки для развития, масштабирования и оптимизации продукта.</p>
<p>&nbsp;</p>
<p>Итак, какие преимущества дает грамотная и своевременная проработка архитектуры ИТ-решения?</p>
<p> </p>
<h3 class="wp-block-heading">Снижение стоимости разработки</h3>
<p>Архитектура снижает стоимость разработки не только за счет переиспользования элементов, но и за счет повышения эффективности коммуникаций и работы команды. Это можно делать в рамках одного модуля или проекта и таким образом снижать стоимость всей системы. Если не позаботиться о том, чтобы заложить архитектуру, то на более поздних этапах внесение изменений может быть дорогостоящим.</p>
<p> </p>
<h3 class="wp-block-heading">Амортизация рисков</h3>
<p>То, как система будет выглядеть, из каких частей состоять, с какими бизнес-процессами пересекаться и взаимодействовать, определяется архитектурой. Экономия средств происходит за счет того, что архитектурное проектирование указывает на риски и помогает избежать таковых на ранних стадиях. Это намного дешевле последующего устранения последствий.</p>
<p> </p>
<h3 class="wp-block-heading">Ускорение выхода на рынок</h3>
<p>Возможность сокращать время выхода на рынок особенно важна в условиях повышенной конкуренции. Бизнес, который способен удовлетворять потребности рынка быстрее и лучше других, получает конкурентное преимущество</p>
<p> </p>
<h3 class="wp-block-heading">Готовность бизнеса к изменениям</h3>
<p>Сегодня бизнес оперирует в условиях быстро меняющихся рынков. Способность адаптировать бизнес-модель и быстро вносить изменения в продукт завязано на архитектуру. Если карта развития архитектуры не будет выстроена в соответствии с картой развития ИТ-продукта и бизнеса, то эта способность будет утрачена.</p>
<p> </p>
<h3 class="wp-block-heading">Выбор оптимальных технических решений</h3>
<p>Архитектура продукта диктует ряд технических решений. Выбор языка программирования, платформы, фреймворка, инструментов разработки и т.д. определяет уровень текущих и будущих затрат. Технические средства исполнения определяют скорость изменений в продукте. Это весьма критично, в таких ситуациях, когда MVP не справляется с наплывом клиентов, выдавая отказы.</p>
<p> </p>
<h2 class="wp-block-heading">Две крайности при разработке</h2>
<p>При создании программных продуктов возникают вопросы:</p>
<p> </p>
<ul class="wp-block-list">
<li>Когда именно стоит приступать к архитектурному проектированию?</li>
<li>Какой стиль и шаблоны использовать?</li>
<li>Насколько тщательно следует прорабатывать архитектурные решения?</li>
</ul>
<p>&nbsp;</p>
<p>Мы сталкивались с разными подходами и мнениями. На одном конце спектра  &#8211; “в MVP архитектура не нужна”, на другом &#8211;  “с самого начала нужно проработать микросервисы, чтобы обеспечить гибкость и масштабируемость продукта”. Это две крайности, которые могут стоить бизнесу больших денег. Ниже рассмотрим, как выбрать золотую середину.</p>
<p> </p>
<h3 class="wp-block-heading">Типичная ситуация: “большой комок грязи”</h3>
<p>К “большому комку грязи” &#8211;  программной системе с нераспознаваемой архитектурой &#8211; приходят постепенно. А начинается все с запроса от бизнеса, который звучит примерно так: “Нам бы побыстрее выйти в релиз и получить первых клиентов. А потом уже давайте думать, что делать с клиентами и как улучшать продукт”.</p>
<p>&nbsp;</p>
<p>Для этого очень часто используется эволюционный подход. Он заключается в том, что сначала разрабатывается MVP (минимальный жизнеспособный продукт) без анализа нефункциональных требований и проработки архитектуры. Затем начинается долгий этап доработок. В результате система плохо функционирует и развивать ее все сложнее.</p>
<p> </p>
<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" class="wp-image-3990 aligncenter" src="https://koniglabs.com/wp-content/uploads/2020/04/big-ball-of-mud-3000x1477.png" alt="большой комок грязи" width="568" height="276" /></figure>
</div>
<p>Мы видели много случаев отсутствия регулярной практики по архитектурному проектированию. И каждый раз это неизбежно приводило к плачевным результатам. Например, наплыв первых клиентов приводит к сбоям в работе системы, т. к. она не выдерживает высокой нагрузки. Система “валится”. Команда “тушит пожары”. Клиенты недовольны и уходят. В результате бизнес рушится, не сумев масштабироваться.</p>
<p>&nbsp;</p>
<p>В другом случае возникает необходимость переписывания системы целиком. На это тратится больше сил и средств, чем на всю предыдущую разработку. В таких случаях приходится переучивать всех пользователей для работы с новой системой. Это в свою очередь негативно отражается на лояльности пользователей и потенциале последующих продаж.</p>
<p> </p>
<h3 class="wp-block-heading">Микросервисы не спасут</h3>
<p> </p>
<h4 class="wp-block-heading">Что такое микросервисы</h4>
<p>Существуют разные типы, способы и паттерны моделирования архитектуры. Микросервисы &#8211; один из возможных стилей архитектуры, главной особенностью которого является модульность. Такая архитектура противопоставляется монолитной, в которой разные компоненты объединены в одно целое.</p>
<p>&nbsp;</p>
<p>В микросервисной архитектуре создаются небольшие, независимые модульные сервисы. Каждый сервис решает определенную задачу. Сервисы взаимодействуют через API (application program interface) &#8211; это посредник, который связывает все элементы воедино. Каждый API запрограммирован на выполнение определенной бизнес-цели. Использование отдельных сервисов позволяет использовать наиболее подходящий технический стек для каждой конкретной задачи.</p>
<p> </p>
<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" class="wp-image-3992 aligncenter" src="https://koniglabs.com/wp-content/uploads/2020/04/Microservice_Architecture.png" alt="микросервисы" width="412" height="281" /><figcaption></figcaption></figure>
</div>
<p> </p>
<h4 class="wp-block-heading">О чем помнить при подготовке микросервисов</h4>
<p>Микросервисы очень популярны. При этом некоторые заказчики на волне хайпа требуют, чтобы все было реализовано с использованием микросервисной архитектуры, не зная реальную стоимость ее применения. Кроме того, чтобы получить пользу, надо уметь правильно микросервисы готовить. Недостаточно просто сделать несколько независимых проектов.</p>
<p>&nbsp;</p>
<p>При разделении программного продукта на микросервисы возникает много вопросов по <strong>взаимодействию сервисов</strong>. Например, как отследить цепочку вызовов различных сервисов, которая привела к конкретной ошибке? Или как понять, какой сервис сейчас является узким местом в работе системы? Эти вопросы с разной степенью успешности решаются либо готовыми инфраструктурными решениями (например, Elastic для логирования), либо под них надо разрабатывать какие-то свои инфраструктурные сервисы.</p>
<p>&nbsp;</p>
<p>Еще один момент о котором необходимо помнить &#8211; <strong>целостность данных</strong>. Поэтому заранее необходимо заложить механизмы обеспечения целостности данных. К сожалению, про это часто забывают. При эксплуатации это приводит к потери или рассинхронизации данных.</p>
<p>&nbsp;</p>
<p>Кроме того, грамотно <strong>разделить систему на независимые микросервисы </strong>на начальном этапе, как правило, не получается. Еще не известен ни точный функционал проектируемой системы, ни структура предметной области. Следовательно, неправильно выбранное разделение по сервисам приводит к сложностям и дополнительным расходам при реализации необходимых сценариев работы системы. В некоторых случаях &#8211; к полной невозможности корректного функционирования.</p>
<p> </p>
<h4 class="wp-block-heading">Микросервисы могут стоить дорого</h4>
<p>В зависимости от проекта, стоимость развертывания всей инфраструктуры для нескольких сервисов в нескольких конфигурациях, проверка работоспособности, масштабируемости и т.д. варьируется от 100 тысяч до 1 миллиона рублей.</p>
<p>&nbsp;</p>
<p>В большинстве случаев, крупные вложения в разработку инфраструктуры, особенно на начальном этапе, не оправданы. Неизвестно, будет ли система работать сколько-нибудь продолжительное время, сколько пользователей к нам придет или проект будет закрыт из-за несостоятельности бизнес-идеи.</p>
<p> </p>
<h2 class="wp-block-heading">Продуманная архитектура &#8211; залог успеха</h2>
<p>Останется ли заказчик или пользователь доволен работой системы зависит от того, насколько грамотно она спроектирована. Описание и разделение предметной области является ключевым моментом в планировании архитектуры. Даже при разработке традиционных монолитных систем это крайне важно. При построении микросервисов неправильное разделение на слабо связанные контексты приведет к нежелательным последствиям: очень сложному внесению изменений, невозможности отследить и проверить все сценарии поведения. Ошибки будут возникать и нарастать как снежный ком в самых неожиданных местах. Чтобы этого избежать, необходимо понять работу будущеей системы на всех уровнях, кто и как будет ей пользоваться. Поэтому крайне важно задуматься об архитектурном проектировании как можно раньше.</p>
<p> </p>
<h3 class="wp-block-heading">Пример</h3>
<p>Скажем, мы делаем интернет-магазин. Для того, чтобы спроектировать положительный пользовательский опыт, необходимо позаботиться о комплектации заказа, удобной оплате и оформлении доставки. Для этого разрабатывается удобный интерфейс комплектовщика, производится интеграция с платежной системой и системой складской логистики. Крайне важно понимать хотя бы основные бизнес-процессы, в которых будет принимать участие наш программный продукт, т.е. бизнес-архитектуру. В противном случае мы можем упустить очень большую часть потребностей. В свою очередь это приведет к ситуации, когда все вроде сделали правильно, но пользоваться продуктом нельзя. И, как следствие, нужны доработки. А это расходы, которые можно было избежать.</p>
<p>&nbsp;</p>
<p>Не редкость в таких ситуациях отсутствие средств: они тратятся на функции не столь критичные на данном этапе. Не проработав до конца все взаимодействия и интеграции, мы можем начать делать дорогие и бессмысленные вещи. Например, CRM-систему в то время как у заказчика нет особенных требований, и можно использовать готовое решение “из коробки”. И только проработав и поняв окружение, можно обоснованно принимать решение о выборе программной архитектуры, разделения системы на слабосвязанные контексты и т.д.</p>
<p> </p>
<h3 class="wp-block-heading">Так с чего начать?</h3>
<p>На практике, для выработки таких архитектурных решений хорошо помогает одно- или двухдневный воркшоп, на котором прорабатывается в том числе и низкодетализированный дизайн, и основные сценарии использования. В случае со стартапами, чрезвычайно важным шагом является проработка <a href="https://jo.my/business-model" target="_blank" rel="noreferrer noopener"><strong>Business Canvas</strong></a> вместе с подрядчиком для того, чтобы все стороны оценили жизнеспособность идеи. Одним из результатов воркшопа будет являться документ, описывающий нефункциональные требования к разрабатываемой системе.</p>
<p> </p>
<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" class="wp-image-3996 aligncenter" src="https://koniglabs.ru/wp-content/uploads/2020/04/Biznes-model%60.png" alt="Бизнес модель" width="622" height="320" /><figcaption>Business Model Canvas или шаблон бизнес-модели</figcaption></figure>
</div>
<p>Не исключено, что результатом может быть и закрытие проекта сразу после воркшопа. Он поможет стейкхолдерам увидеть несостоятельность бизнес-замысла, сэкономив время и деньги на технической реализации. Как бы странно ни звучало, даже в таких ситуация очень сильно возрастает доверие между участниками проекта.</p>
<p>&nbsp;</p>
<p>Резонный вопрос, надо ли это делать и дорого ли это? Отвечаем: стоимость воркшопа примерно равна стоимости двухдневной работы организованной команды. Исправление ошибок и доработки однозначно обойдутся заказчику намного дороже, чем такой воркшоп.</p>
<p>&nbsp;</p>
<p>Стоит помнить о том, что с течением времени бизнес-идея может измениться из-за внешних обстоятельств. К примеру, сейчас происходят очень большие изменения в работе практически любого бизнеса. Мы точно знаем, что мир уже не будет таким, как раньше (привет, COVID-19!). Нужно быть готовым к переменам и адаптировать свою бизнес-модель и продукт под новые реалии рынка.</p>
<p>&nbsp;</p>
<p>Как мы упоминало выше, такая гибкость закладывается адекватной архитектурой и использованием проверенных практик. Например, применение шаблона CQRS на логическом уровне архитектуры приложения (о том, что это такое, расскажем чуть ниже) в начале разработки позволит впоследствии выделять физические сервисы при развитии бизнеса и продукта.</p>
<p>&nbsp;</p>
<p>Переиспользование написанной функциональности станет возможным за счет разделения на независимые компоненты. При этом, если не пытаться сразу разделить сервисы физически, то команда сэкономит деньги на мониторинге, реализации распределенной транзакционной работы и на других зависимостях, которые пока еще не нужны для текущего уровня развития продукта.</p>
<p> </p>
<h2 class="wp-block-heading">CQRS на уровне логической архитектуры</h2>
<p> </p>
<h3 class="wp-block-heading">Коротко о CQRS</h3>
<p>CQRS (Command-Query Responsibility Segregation — разделение команд и запросов) — популярный и широко применяемый шаблон проектирования архитектуры программ. Его суть заключается в том, что все методы (т. е. определенные наборы действий) в программе могут быть двух типов. Это либо запросы, после выполнения которых состояние программы не изменяется, либо команды, которые состояние изменяют. Другими словами, запросы могут выполнять лишь чтение данных, в то время как команды обязательно включают в себя запись.</p>
<p> </p>
<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" class="wp-image-3988 aligncenter" src="https://koniglabs.com/wp-content/uploads/2020/04/command-and-query-responsibility-segregation.png" alt="CQRS" width="398" height="284" srcset="https://koniglabs.ru/wp-content/uploads/2020/04/command-and-query-responsibility-segregation.png 444w, https://koniglabs.ru/wp-content/uploads/2020/04/command-and-query-responsibility-segregation-300x214.png 300w" sizes="(max-width: 398px) 100vw, 398px" /></figure>
</div>
<p> </p>
<h3 class="wp-block-heading">Что сделали мы</h3>
<p>В этом <a href="https://koniglabs.ru/case_study/maintenance/" target="_blank" rel="noreferrer noopener" aria-label="проекте (opens in a new tab)"><strong>проекте</strong> </a>мы разработали ПО для управления и автоматизации бизнес-процессов судоходной компании. Чтобы сократить стоимость и выпустить первую версию ПО в кратчайшие сроки, мы выбрали подход внедрения CQRS на уровне логической архитектуры. Само приложение имело следующую схему:</p>
<p> </p>
<figure class="wp-block-image size-large"><img decoding="async" class="wp-image-4070" src="https://koniglabs.ru/wp-content/uploads/2020/04/CQRS_shema-arhitektury-IO.png" alt="cqrs архитектура " /></figure>
<p>Если соблюдать базовые принципы SOLID, а именно Dependency Inversion и Dependency Injection, то при хорошей настройке контейнеров инверсии управления все команды и запросы становятся небольшими кусочками, которые можно переиспользовать в разных частях вашей системы. Так и было в этом случае, что однозначно дало положительный результат.</p>
<p>&nbsp;</p>
<p>На схеме видно 3 части системы, которые вполне могут иметь схожую работу с моделью:</p>
<p> </p>
<ol class="wp-block-list">
<li>Взаимодействие офисного приложения с моделью (Admin office Desktop App)</li>
<li>Взаимодействие приложения механика с моделью (Ship Desktop Mechanic app)</li>
<li>Взаимодействие сервиса синхронизации с моделью (SyncService)</li>
</ol>
<p>Мы заметили, что люди, которые используют приложение в офисе, намного чаще читают данные с кораблей, нежели заполняют. При этом пользователи на кораблях в Offline-зоне наоборот чаще вводят данные в приложение, чем читают. Что это дает? Ценность заключается в том, что это отличная база для масштабирования системы. Если возникнет необходимость, то выделить окружающие контексты из кусочков запросов в одни физические сервисы с оптимизированной под чтение базой данных, а контексты из команд  &#8211; в другие сервисы будет намного легче. Всё это уже будет зависеть от бизнес-задач и от направлений развития архитектуры.</p>
<p> </p>
<h3 class="wp-block-heading">Примеры того, как внедрить такое разделение у себя в проекте</h3>
<p>Ниже я привожу пару основных классов на языке C#, которые можно просто переиспользовать в своих решениях.</p>
<p> </p>
<pre class="wp-block-verse">     /// &lt;summary&gt;
    ///     Универсальная фабрика для создания запросов.
    ///     Должна быть реализована в Composition Root(web api проект, главный проект сайта и т.д.)
    /// &lt;/summary&gt;
    public interface IHandlersFactory
    {
        IQueryHandler&lt;TQuery, TResult&gt; CreateQueryHandler&lt;TQuery, TResult&gt;();
 
        IAsyncQueryHandler&lt;TQuery, TResult&gt; CreateAsyncQueryHandler&lt;TQuery, TResult&gt;();
 
        ICommandHandler&lt;TCommand&gt; CreateCommandHandler&lt;TCommand&gt;();
 
        IAsyncCommandHandler&lt;TCommand&gt; CreateAsyncCommandHandler&lt;TCommand&gt;();
    }
/// &lt;summary&gt;
///   Базовый интерфейс для выполнения команды
/// &lt;/summary&gt;
 public interface ICommandHandler&lt;TCommand&gt;
    {
        void Execute(TCommand command);
    }
/// &lt;summary&gt;
///   Базовый интерфейс для выполнения запроса
/// &lt;/summary&gt;
 
public interface IQueryHandler&lt;TQuery, TResult&gt;
    {
        TResult Execute(TQuery query);
    }
 
/// &lt;summary&gt;
///   Фабрика для Ninject, создающая типизированные команды и запросы
/// &lt;/summary&gt;
public class NinjectFactory : IHandlersFactory
    {
        private readonly IResolutionRoot _resolutionRoot;
 
        public NinjectFactory(IResolutionRoot resolutionRoot)
        {
            _resolutionRoot = resolutionRoot;
        }
 
        public IAsyncCommandHandler&lt;TCommand&gt; CreateAsyncCommandHandler&lt;TCommand&gt;()
        {
            return _resolutionRoot.Get&lt;IAsyncCommandHandler&lt;TCommand&gt;&gt;();
        }
 
        public IAsyncQueryHandler&lt;TQuery, TResult&gt; CreateAsyncQueryHandler&lt;TQuery, TResult&gt;()
        {
            return _resolutionRoot.Get&lt;IAsyncQueryHandler&lt;TQuery, TResult&gt;&gt;();
        }

        public ICommandHandler&lt;TCommand&gt; CreateCommandHandler&lt;TCommand&gt;()
        {
            return _resolutionRoot.Get&lt;ICommandHandler&lt;TCommand&gt;&gt;();
        }
 
        public IQueryHandler&lt;TQuery, TResult&gt; CreateQueryHandler&lt;TQuery, TResult&gt;()
        {
            return _resolutionRoot.Get&lt;IQueryHandler&lt;TQuery, TResult&gt;&gt;();
        }
    }</pre>
<p><strong> Пример Биндинга запросов через Ninject</strong></p>
<p> </p>
<pre class="wp-block-verse">  public override void Load()
        {
            // queries
            Bind&lt;IQueryHandler&lt;GetCertificateByIdQuery, Certificate&gt;&gt;().To&lt;GetCertificateByIdQueryHandler&gt;();
            Bind&lt;IQueryHandler&lt;GetCertificatesQuery, List&lt;Certificate&gt;&gt;&gt;().To&lt;GetCertificatesQueryHandler&gt;();
            Bind&lt;IQueryHandler&lt;GetCertificateByShipQuery, List&lt;Certificate&gt;&gt;&gt;().To&lt;GetCertificateByShipQueryHandler&gt;();
………….
}</pre>
<p>После инъекции IHandlerFactory в ваш класс вы получаете возможность использовать свои команды и запросы следующим образом:</p>
<p> </p>
<pre class="wp-block-verse"> <strong>Пример выполнения запроса:</strong>
Ship ship = mHandlersFactory.CreateQueryHandler&lt;GetShipByIdQuery, Ship&gt;().Execute(new GetShipByIdQuery(id));

<strong>Пример выполнения команды:</strong>
mHandlersFactory.CreateCommandHandler&lt;DeleteReportCommand&gt;()
                    .Execute(new DeleteReportCommand(report));</pre>
<p>Но, конечно, всё надо применять ситуативно и с умом. Для этого и нужно разработать архитектуру. Другой момент, что не надо её продумывать на 300 шагов вперёд. Она должна ситуативно развиваться вместе с продуктом и давать ответы минимум на 3 вопроса:</p>
<p> </p>
<ol class="wp-block-list">
<li>Почему структура моего ИТ-продукта именно такая? Почему в этом месте надо реализовывать именно так?</li>
<li>Если я придумаю крутую реализацию, то как она ляжет на общую картину системы?</li>
<li>Каким образом будут соблюдаться нефункциональные требования системы в целом?</li>
</ol>
<p>Также очень важным этапом является момент выделения Bounded Context в системе. Данная практика хорошо помогает изобразить структуру бизнеса заказчика, найти с ним общий язык и управлять регрессией в продукте. Но об этом уже следующая статья.</p>
<p> </p>
<h4 class="wp-block-heading">Преимущества CQRS на уровне логической архитектуры</h4>
<p>Базовая архитектура рассмотренного приложения была выстроена с соблюдением разных принципов и шаблонов проектирования: MVVM, SOLID, CQRS и т.д. Это позволило переиспользовать функциональность фич для разных клиентов приложения. При этом, внедрение не занимало много времени и было достаточно недорогим.</p>
<p>&nbsp;</p>
<p>Реализация данного подхода не потребовала дополнительных затрат, так как при старте разработки у команды были уже наработанные классы и один уровень понимания архитектуры приложения. В последующих доработках этот подход полностью себя оправдал: порядка 40% функциональности можно было гибко переиспользовать. При таком подходе заказчик существенно сократил затраты на реализацию функций, определённые части которых дублируются для разных клиентов приложения. Мы оценили экономию средств в 30-40%.</p>
<p> </p>
<h2 class="wp-block-heading">Напоследок</h2>
<p>Agile-подход к разработке ошибочно трактуется как “не надо ничего проектировать заранее, надо ввязаться в бой, а там война &#8211; план покажет”. А если нам будет не хватать скорости работы или скорости изменения программы,  мы зарядим  серебряную пулю &#8211; микросервисы. Ведь на всех конференциях рассказывают, что микросервисы &#8211; это просто, и они решают сразу все проблемы. Такой оптимизм, как правило, ведет к потере денег и неработающему продукту. С другой стороны, проектировать все заранее в нашем быстро меняющемся мире практически невозможно. Как всегда надо находить баланс.</p>
<p>&nbsp;</p>
<p>Во-первых, проработка архитектуры позволяет осознанно выбрать подходящее решение на текущем этапе и в итоге сэкономить денег на разработку.</p>
<p>&nbsp;</p>
<p>Во-вторых, документирование архитектурных решений позволит в дальнейшем понять, почему именно такие решения были приняты. Более того, такой документ экономит время команды, исключая лишние обсуждения.</p>
<p>&nbsp;</p>
<p>В-третьих, периодическая валидация изменившихся условий позволяет снизить риски отказов в работе продукта или системы и принять взвешенное решение о необходимости доработки или изменения.</p>
<p>&nbsp;</p>
<p>Таким образом, следование грамотным практикам непосредственно при написании кода позволяет получить хороший фундамент, на основании которого можно будет масштабировать решение в дальнейшем.</p>
<p> </p>
<div class="wp-block-spacer" style="height: 30px;" aria-hidden="true"> </div>
<p>&nbsp;</p>

		</div>
	</div>
<div class="tm-button-wrapper  similar-post-btn tm-animation move-up" id="tm-button-69dc49282591a">
		<a class="tm-button style-text tm-button-nm tm-button-custom tm-button-icon-move has-icon icon-right" href="https://koniglabs.ru/it-solutions/"
			>

		
						<span class="button-text" data-text="Смотреть решения по отраслям">
				Смотреть решения по отраслям			</span>
							<span class="button-icon">
				<i class="linea-arrows-slim-right"></i>
			</span>
			
		

	</a>
</div>
</div></div></div></div><p>The post <a href="https://koniglabs.ru/cqrs-microservices/">Микросервисы и CQRS: оптимизируем затраты на продукт</a> appeared first on <a href="https://koniglabs.ru">König Labs</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://koniglabs.ru/cqrs-microservices/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>