<?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/monolit/feed/" rel="self" type="application/rss+xml" />
	<link>https://koniglabs.ru/tag/monolit/</link>
	<description></description>
	<lastBuildDate>Wed, 21 May 2025 12:54:00 +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/monolit/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Serverless vs монолит: что выбрать в среде AWS?</title>
		<link>https://koniglabs.ru/serverless-vs-monolit/</link>
					<comments>https://koniglabs.ru/serverless-vs-monolit/#respond</comments>
		
		<dc:creator><![CDATA[Alexey Palatkin]]></dc:creator>
		<pubDate>Mon, 30 Aug 2021 16:21:54 +0000</pubDate>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[serverless]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[монолит]]></category>
		<guid isPermaLink="false">https://koniglabs.com/?p=6240</guid>

					<description><![CDATA[<p>The post <a href="https://koniglabs.ru/serverless-vs-monolit/">Serverless vs монолит: что выбрать в среде AWS?</a> appeared first on <a href="https://koniglabs.ru">König Labs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div id="tm-row-69dc491f351fa" class="vc_row vc_row-outer vc_row-fluid"><div id="tm-column-69dc491f35cbd" 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><span style="font-weight: 400;">Скажу сразу &#8211; оба архитектурных подхода имеют место быть. И монолит и Serverless, конечно, имеют свои плюсы и минусы. Но как подобрать лучший подход для конкретного ИТ-продукта? Я изучил этот вопрос и решил поделиться своими мыслями. Может быть, получится сэкономить кому-то время в поисках лучшего решения. </span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Меня зовут Василий Широченко, я backend-разработчик в Konig Labs. Когда я в очередной раз столкнулся с темой выбора архитектурного подхода для приложения в среде Amazon Web Services (про это тоже поговорим), я работал над мобильным приложением для обучения игре на фортепиано. Так что, все выводы в статье будут основаны на реальной практике. Поехали!</span></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f35f61"></div>
</div></div></div></div><div id="tm-row-69dc491f36011" class="vc_row vc_row-outer vc_row-fluid"><div id="tm-column-69dc491f36179" 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">
			<h2><span style="font-weight: 400;">Начинаем с требований</span></h2>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Для начала, давайте разберемся, почему вопрос архитектуры так важен. </span><span style="font-weight: 400;">Планирование архитектуры ИТ-продукта всегда проводится перед стартом разработки. Это критически важно, т.к. как и архитектура здания, архитектура ИТ-продукта не должна “посыпаться” при малейших изменениях, и в перспективе должна выдержать масштабирование, увеличение нагрузки и возрастающую сложность. Стоимость внесения изменений при этом должна оставаться адекватной. </span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Также, верно подобранная архитектура &#8211; гарантия того, что реализация продукта будет учитывать нюансы всех требований (бизнесовых, нефункциональных, процессных и т.д.). </span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Теперь немного контекста о проекте, на примере которого будем рассуждать об архитектуре, и его предметной области. Заказчик поставил задачу разработать мобильное приложение, которым люди, интересующиеся игрой на фортепиано, могут пользоваться на платформах iOS и Android. Приложение должно уметь сканировать с листа произведения, записанные в классической музыкальной нотации, и далее распознавать нотный стан, сами ноты, знаки альтерации и т.д. (рис. 1, рис. 2).</span></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f36331"></div>
</div></div></div></div><div id="tm-row-69dc491f363ed" class="vc_row vc_row-outer vc_row-fluid same-height vc_row-o-content-bottom vc_row-flex"><div id="tm-column-69dc491f36558" class="wpb_column vc_column_container vc_col-sm-6"><div class="vc_column-inner "><div class="wpb_wrapper"><div class="tm-box-image style-02 tm-animation move-up" id="tm-box-image-69dc491f366b4">
	
	
	<div class="content-wrap">
		
<div class="content">

	<div class="images">
					<div class="image">
				<img decoding="async" src="https://koniglabs.ru/wp-content/uploads/2021/08/scanning-50x108.png" data-src="https://koniglabs.ru/wp-content/uploads/2021/08/scanning-80x174.png" class="ll-image unload" alt="scan" width="80" height="174" />			</div>
		
			</div>

	
			<div class="text">Рис. 1. Сканирование с листа</div>	
	</div>
	</div>

	
</div>
</div></div></div><div id="tm-column-69dc491f37311" class="wpb_column vc_column_container vc_col-sm-6"><div class="vc_column-inner "><div class="wpb_wrapper"><div class="tm-box-image style-02 tm-animation move-up has-image-hover" id="tm-box-image-69dc491f37461">
	
	
	<div class="content-wrap">
		
<div class="content">

	<div class="images">
					<div class="image">
				<img fetchpriority="high" decoding="async" src="https://koniglabs.ru/wp-content/uploads/2021/08/recognition-50x28.jpg" data-src="https://koniglabs.ru/wp-content/uploads/2021/08/recognition.jpg" class="ll-image unload" alt="recognition" width="512" height="288" />			</div>
		
					<div class="image-hover">
				<img fetchpriority="high" decoding="async" src="https://koniglabs.ru/wp-content/uploads/2021/08/recognition-50x28.jpg" data-src="https://koniglabs.ru/wp-content/uploads/2021/08/recognition.jpg" class="ll-image unload" alt="recognition" width="512" height="288" />			</div>
			</div>

	
			<div class="text">Рис. 2. Распознавание нот</div>	
	</div>
	</div>

	
</div>
</div></div></div></div><div id="tm-row-69dc491f3b9bd" class="vc_row vc_row-outer vc_row-fluid"><div id="tm-column-69dc491f3bb65" class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner "><div class="wpb_wrapper"><div class="tm-spacer" id="tm-spacer-69dc491f3bcce"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><span style="font-weight: 400;">Затем, на основании т.н. эталонной записи, пользователь исполняет свой вариант музыкального произведения на фортепиано. После игры система производит поиск ошибок и неточностей в игре учащегося (пользователя). Для каждого пользователя хранится история его попыток, показывается процент точности </span><i><span style="font-weight: 400;">попадания</span></i><span style="font-weight: 400;">. Также есть экран статистики в разрезе дня/недели/месяца/года. В принципе, получается </span><i><span style="font-weight: 400;">несложная </span></i><span style="font-weight: 400;">предметная область. </span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Конечно, мы понимаем, что приложение само по себе не будет работать, потому как где-то необходимо сохранять прогресс их игры, статистику и другие важные данные. По этим причинам необходимо разработать backend-часть для приложения. </span></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f3bdaa"></div>
</div></div></div></div><div id="tm-row-69dc491f3be67" class="vc_row vc_row-outer vc_row-fluid"><div id="tm-column-69dc491f3c008" 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">
			<h2><span style="font-weight: 400;">Про выбор архитектуры</span></h2>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Как я уже говорил, мы будем сравнивать монолитный и Serverless подходы. На самом деле, еще затронем микросервисный, но вскользь. Далее поймете, почему.</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Сперва предлагаю кратко пройтись по всем трем подходам, посмотреть на “профпригодность” каждого из них и уже более детально рассмотреть то, что мы выбрали.</span></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f3c217"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<h4><span style="font-weight: 400;">Монолитное решение</span></h4>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Кратко напомним, что подразумевается под монолитным решением. Прежде всего, все </span><i><span style="font-weight: 400;">слои </span></i><span style="font-weight: 400;">приложения находятся в рамках единой кодовой базы, и, как следствие, публикация такого решения производится не частично (например, поменяли только визуальную составляющую), а целиком на все приложение.</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Так исторически сложилось, и более того, подтверждено различными опросами среди разработчиков, что монолитная архитектура &#8211; самый распространенный способ построения программного обеспечения. Почему так? Все благодаря своей простоте в разработке и поддержке по сравнению с более сложными подходами (если рассматривать те же микросервисы). Простота заключается в едином развертывании, когда у нас бизнес-логика всего приложения, UI (то, что видит конечный пользователь), хранение данных (база данных) и возможно другие дополнительные компоненты находятся в общем репозитории, разрабатываются совместно и публикуются на сервер в рамках одного процесса. </span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Конечно, у любого решения есть и минусы. Эволюция любого приложения &#8211; довольно непредсказуемый процесс, потому как появляются новые требования от заказчика. Эти требования необходимо стараться как-то “вписать” в существующее рабочее решение. В случае с монолитом, у разработчиков очень часто появляется соблазн нарушить определенные рамки и конвенции, разработанные на этапе проектирования, вследствие чего система начинает сильно </span><i><span style="font-weight: 400;">вязнуть</span></i><span style="font-weight: 400;">, и вносить все новые и новые изменения становится труднее.</span></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f3c2e9"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<h4><span style="font-weight: 400;">Микросервисы</span></h4>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Архитектура, построенная на основе микросервисов &#8211; подход, набравший огромную популярность последние лет десять. Весьма распространен в больших проектах с долгим жизненным циклом, когда разработкой занимается несколько команд, каждая из которых отвечает за свои несколько микросервисов. В нашем блоге уже была статья про микросервисы, если интересно вникнуть в детали, читайте здесь: <a href="https://koniglabs.ru/cqrs-microservices/" target="_blank" rel="noopener noreferrer">Микросервисы и CQRS: оптимизируем затраты на продукт</a>.</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Среди явных плюсов: система разбита на модули, каждый из которых поддерживается определенной командой разработки, независимые публикации отдельно взятых микросервисов (допустим, в системе развернуто два микросервиса A и B, мы можем обновить микросервис B, не затронув при этом микросервис A). В то же время, приходится мириться с определенными ограничениями и иметь в виду, например, что для качественной разработки требуется высокая квалификация специалистов. Плюс ко всему, не стоит забывать и о том, что, несмотря на кажущуюся гибкость в разделении бизнес-процессов на так называемые</span><i><span style="font-weight: 400;"> ограниченные контексты</span></i><span style="font-weight: 400;">, стоит обязательно позаботиться о системе логирования и мониторинга (о записи действий приложения в специальный файл и о сборе, хранении метрик по инфраструктуре приложения). Более того, микросервисы должны уметь </span><i><span style="font-weight: 400;">общаться </span></i><span style="font-weight: 400;">друг с другом &#8211; реализуется это посредством различных протоколов, таких как </span><i><span style="font-weight: 400;">http</span></i><span style="font-weight: 400;">, </span><i><span style="font-weight: 400;">amqp </span></i><span style="font-weight: 400;">и других. Т.е., в отличие от монолита, здесь дополнительно нужно продумать и реализовать API.</span></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f3c3cf"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<h4><span style="font-weight: 400;">Serverless</span></h4>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Serverless &#8211; данный подход стал применяться сравнительно недавно (последние несколько лет). Его суть в том, что облачный провайдер (по примеру AWS, Azure и др.) предлагает воспользоваться т. н. бессерверными вычислениями &#8211; пользователям теперь не надо заботиться о конфигурировании и поддержке сервера &#8211; за вас все делает провайдер (сколько ресурсов потребуется &#8211; столько провайдер и предоставит). </span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Этот подход достаточно новый. С одной стороны, простота &#8211; главное его преимущество перед остальными подходами. Здесь мы имеем в виду удобство работы с инфраструктурой (сервисы, службы, логирование, мониторинг, вертикальное и горизонтальное масштабирование).</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">С другой стороны, есть палка о двух концах &#8211; это управление бюджетом. Провайдер предлагает определенные расценки за использование ресурсов, которые можно посчитать в </span><i><span style="font-weight: 400;">калькуляторе </span></i><span style="font-weight: 400;">на сайте. Вот только есть нюанс динамически выделяемых ресурсов &#8211; к этому вопросу стоит относиться крайне внимательно &#8211; об этом будет рассказано более подробно ниже. Так что советуем не закрывать статью, вдруг дальше будет написано, где находится Янтарная комната… 🙂</span></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f3c498"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<h4><span style="font-weight: 400;">Наши мысли</span></h4>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Итак, что мы имеем? Монолит как самый популярный вариант, микросервисы, как пример слабо связанной архитектуры и serverless &#8211; эдакий многообещающий вариант построения приложений. Ах, да, чуть не забыли &#8211; команду backend-разработчиков из двух человек 🙂</span></p>
<p><span style="font-weight: 400;"><br />
</span> <span style="font-weight: 400;">Посовещавшись, пришли к выводу, что микросервисы мы отметаем по причине того, что бизнес-модель не является </span><i><span style="font-weight: 400;">сложной </span></i><span style="font-weight: 400;">(даже если забегать вперед с </span><i><span style="font-weight: 400;">возможными </span></i><span style="font-weight: 400;">дополнениями) в связи с четко поставленными требованиями к конечному продукту для пользователей. Да, зарекаться не стоит, но взвесив все “за” и “против” решили оставить для более детального рассмотрения два варианта: монолитное решение и serverless.</span></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f3c55f"></div>
</div></div></div></div><div id="tm-row-69dc491f3c723" class="vc_row vc_row-outer vc_row-fluid"><div id="tm-column-69dc491f3c8cb" 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">
			<h2><span style="font-weight: 400;">Использование монолита и serverless: детально</span></h2>
<p><span style="font-weight: 400;">Прежде всего, для наглядности приведем сводную таблицу со списком основных сервисов, которые предоставляет AWS. Каждый из этих сервисов может быть использован в любом из предложенных архитектурных решений. Почему AWS &#8211; спросите вы? Все дело в том, что во-первых, заказчик был заинтересован в использовании инфраструктуры AWS, во-вторых, действительно AWS является лидером среди облачных провайдеров во всем мире.</span></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f3ca5b"></div>
<div class="tm-image tm-animation move-up" id="tm-image-69dc491f3cadb">
			<div class="image"><img decoding="async" src="https://koniglabs.ru/wp-content/uploads/2021/08/servisy-aws-50x28.png" data-src="https://koniglabs.ru/wp-content/uploads/2021/08/servisy-aws.png" class="ll-image unload" alt="AWS services" width="1202" height="694" /></div>	</div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><em><span style="font-weight: 400;">Рис. 3. Сервисы AWS, необходимые в backend-части</span></em></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f3ef59"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><span style="font-weight: 400;">Позже мы более детально посмотрим на их использование и какое место каждый из этих элементов занимает в построении архитектуры приложения.</span></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f3f051"></div>
</div></div></div></div><div id="tm-row-69dc491f3f122" class="vc_row vc_row-outer vc_row-fluid"><div id="tm-column-69dc491f3f2e2" 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">
			<h3><span style="font-weight: 400;">Монолитное решение</span></h3>
<h4><span style="font-weight: 400;">Инфраструктурный вопрос</span></h4>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f3f4d7"></div>
<div class="tm-image tm-animation move-up" id="tm-image-69dc491f3f644">
			<div class="image"><img decoding="async" src="https://koniglabs.ru/wp-content/uploads/2021/08/example-of-backend-architecture-50x45.png" data-src="https://koniglabs.ru/wp-content/uploads/2021/08/example-of-backend-architecture.png" class="ll-image unload" alt="backend-architecture" width="512" height="466" /></div>	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f41a1d"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><em><span style="font-weight: 400;">Рис. 4. Предложенный вариант архитектуры backend’а, построенной на базе монолита</span></em></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f41ad9"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><span style="font-weight: 400;">Из схемы на рис. 4 видно, что в системе есть мобильный клиент. Далее из мобильного приложения отправляется запрос в облачную инфраструктуру AWS, а конкретно,в виртуальную машину Ec2 instance. Запрос первым делом попадает на сервер nginx, который отвечает за перенаправление запроса в наше приложение. Что собой представляет приложение? </span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Это приложение, написанное на Python, со всеми необходимыми нам endpoint’ами, бизнес-логикой и т.д., запущенное и работающее в Docker-контейнере. Все остальные необходимые сервисы &#8211; это просто компоненты, созданные однажды. Хранилище файлов можно удобным образом выделить в S3. В качестве сервера БД выступает RDS (Relational Database Service). Так как в системе предусмотрена отправка email-уведомлений, то можно использовать либо Sendgrid, как на схеме, либо AWS SES (Simple Email Service). </span><span style="font-weight: 400;"><br />
</span></p>
<p>&nbsp;</p>
<p><i><span style="font-weight: 400;">P.S. Забегая вперед, хочется отметить, что на схеме не учтен момент с алгоритмом нахождения ошибок в игре пользователя (SMR). Предполагалось, что этот блок будет являться частью API, но после замеров нагрузки стало ясно, что такие тяжелые вычисления необходимо выносить в специальный сервис. Поэтому дальше в оценке можно будет увидеть этот дополнительный пункт.</span></i></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f41b9d"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<h4><span style="font-weight: 400;">Оценка трудозатрат на разработку (с учетом на одного разработчика)</span></h4>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f41c45"></div>
<div class="tm-image tm-animation move-up" id="tm-image-69dc491f41cb0">
			<div class="image"><img decoding="async" src="https://koniglabs.ru/wp-content/uploads/2021/08/trudozatraty-1-50x10.png" data-src="https://koniglabs.ru/wp-content/uploads/2021/08/trudozatraty-1.png" class="ll-image unload" alt="Трудозатраты монолит" width="1058" height="232" /></div>	</div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><em><span style="font-weight: 400;">Рис. 5. Трудозатраты на разработку монолитного решения</span></em></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f43da6"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><span style="font-weight: 400;">Пока что эти цифры нам ни о чем не говорят, чуть позже сравним их со значениями для serverless-решения.</span></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f43e54"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<h4><span style="font-weight: 400;">Затраты на хостинг</span></h4>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f43efb"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><span style="font-weight: 400;">* Исходим из расчета на 1000 активных пользователей системы</span></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f43f9d"></div>
<div class="tm-image tm-animation move-up" id="tm-image-69dc491f44003">
			<div class="image"><img decoding="async" src="https://koniglabs.ru/wp-content/uploads/2021/08/zatraty-na-hosting-50x22.png" data-src="https://koniglabs.ru/wp-content/uploads/2021/08/zatraty-na-hosting.png" class="ll-image unload" alt="Затраты на хостинг" width="1169" height="530" /></div>	</div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><em><span style="font-weight: 400;">Рис. 6. Затраты на хостинг</span></em></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f45f32"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><b>Итого: ~ 265$ / месяц</b></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f45fe9"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<h5><span style="font-weight: 400;">Плюсы</span></h5>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Традиционная кодовая база. Можем сменить хоста в любой момент и практически ничего менять не придется</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Упрощенная схема инфраструктуры (общий сервер почти для всего, если не используем выделенные сегменты инфраструктуры)</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Ec2 запущен в режиме 24/7, поэтому нет проблемы «холодного старта»</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Довольно предсказуемая ценовая политика, что весьма важно!</span></li>
</ol>
<p>&nbsp;</p>
<h5><span style="font-weight: 400;">Минусы</span></h5>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Повышенная ответственность со стороны разработки: настройка веб-сервера nginx, настройка логирования, настройка мониторинга сервисов приложения. Плюс необходима соответствующая квалификация разработчиков.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Масштабирование. Нет гарантии, что однажды не упремся в пороговое значение.  Для горизонтального масштабирования необходима настройка, что само по себе непросто (стоимость будет увеличиваться в разы).</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Если захотелось бесплатно поднять БД, то придется настроить бэкапы и мониторинг самостоятельно. Это сложнее, чем просто «выставить галочку» в RDS «мне нужны бэкапы каждый день в 24:00», а значит и стоимость работы все равно будет недешевой. </span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">При изменении чего-либо в конфигурации сервера не всегда получается понять, что пошло не так</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Авторизацию в серверной части, например, придется реализовывать самостоятельно</span></li>
</ol>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f460f8"></div>
</div></div></div></div><div id="tm-row-69dc491f461fd" class="vc_row vc_row-outer vc_row-fluid"><div id="tm-column-69dc491f46470" 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">
			<h3><span style="font-weight: 400;">Serverless</span></h3>
<h4><span style="font-weight: 400;">Инфраструктурный вопрос</span></h4>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f4662d"></div>
<div class="tm-image tm-animation move-up" id="tm-image-69dc491f46690">
			<div class="image"><img decoding="async" src="https://koniglabs.ru/wp-content/uploads/2021/08/example-of-serverless-architecture-50x49.png" data-src="https://koniglabs.ru/wp-content/uploads/2021/08/example-of-serverless-architecture.png" class="ll-image unload" alt="Example of serverless-architecture" width="512" height="509" /></div>	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f48650"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><em><span style="font-weight: 400;">Рис. 7. Архитектура serverless backend’а приложения</span></em></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f48700"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><span style="font-weight: 400;">В данном случае система выглядит немного интересней 🙂 </span></p>
<p><span style="font-weight: 400;">Нет привычных nginx’а, Docker’а, вместо них появились какие-то Lambda с нумерацией от 1 до N, Step Function, Cognito… На самом деле все не очень сложно. Если вспомнить, что serverless тесно связано с понятием FaaS, то можно увидеть, что вместо единого API у нас получились разрозненные lambda-функции, каждая из которых отвечает за свой endpoint. Например, чтобы создать пользователя в системе (выполнить POST-запрос /users) мы вызываем определенную lambda-функцию, задача которой создавать пользователей &#8211; ничего более!</span></p>
<p><span style="font-weight: 400;">Тот блок, который помечен как Step Function &#8211; </span><i><span style="font-weight: 400;">долгая </span></i><span style="font-weight: 400;">задача, выполняющаяся асинхронно (</span><i><span style="font-weight: 400;">дело в том, что мы не можем блокировать выполнение http-запроса до момента получения результата, потому как алгоритм нахождения ошибок может выполняться десятки секунд, а пользователь не очень хочет видеть заблокированный экран приложения</span></i><span style="font-weight: 400;">).</span></p>
<p><span style="font-weight: 400;">Cognito &#8211; мощный сервис авторизации пользователей в системе.</span></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f487bf"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<h4><span style="font-weight: 400;">Оценка трудозатрат на разработку (с учетом одного разработчика)</span></h4>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f48861"></div>
<div class="tm-image tm-animation move-up" id="tm-image-69dc491f488b7">
			<div class="image"><img decoding="async" src="https://koniglabs.ru/wp-content/uploads/2021/08/trudozatraty-serverless-50x11.png" data-src="https://koniglabs.ru/wp-content/uploads/2021/08/trudozatraty-serverless.png" class="ll-image unload" alt="Трудозатраты serverless" width="1057" height="235" /></div>	</div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><em><span style="font-weight: 400;">Рис. 8. Трудозатраты на разработку</span></em></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f4a5f1"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><span style="font-weight: 400;">Чуть позже сравним 🙂</span></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f4a695"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<h4><span style="font-weight: 400;">Затраты на хостинг</span></h4>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f4a736"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><span style="font-weight: 400;">* Исходим из расчета на 1000 активных пользователей системы</span></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f4a7d3"></div>
<div class="tm-image tm-animation move-up" id="tm-image-69dc491f4a828">
			<div class="image"><img decoding="async" src="https://koniglabs.ru/wp-content/uploads/2021/08/zatraty-na-hosting-serverless-50x20.png" data-src="https://koniglabs.ru/wp-content/uploads/2021/08/zatraty-na-hosting-serverless.png" class="ll-image unload" alt="Затраты на хостинг serverless" width="1202" height="502" /></div>	</div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><em><span style="font-weight: 400;">Рис. 9. Затраты на хостинг &#8211; serverless</span></em></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f4c574"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><b>Итого: ~ 250$ / месяц</b></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f4c617"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<h5><span style="font-weight: 400;">Плюсы</span></h5>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Подход развертывания конфигурации через</span><i><span style="font-weight: 400;"> template.yaml</span></i><span style="font-weight: 400;">, который, имеет очевидные достоинства в виде четко структурированного файла с описанием AWS инфраструктуры + любые изменения отслеживаются Git’ом (можно выявить проблемы, связанные с изменением конфигурации) + хорошо документировано на официальном сайте.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Lambda-функции являются изолированными, удобно тестируются, для каждой из них создана своя группа для мониторинга.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Cloud Watch – очень удобный инструмент для сбора логов и мониторинга сервисов AWS. Для Python есть мощная библиотека boto3, которая позволяет выполнять любые операции с сервисами AWS.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Удобный CI/CD (с использованием environment-переменных): dev-stack/prod-stack/etc.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Мы не заботимся об обслуживании lambda-функций, мы лишь пишем код и точка. Хотя нет, не точка – еще платим деньги, сколько – не известно – вот такая простая математика, все зависит от ситуации. Тогда почему этот пункт в плюсах?..</span></li>
</ol>
<h5></h5>
<h5><span style="font-weight: 400;">Минусы</span></h5>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Высокий порог вхождения при отсутствии опыта. </span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">«Холодный старт» у lambda-функций – специфическое ограничение, для нашего проекта некритично.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Грамотная настройка IAM-политик и их полное соблюдение требуют соответствующей квалификации специалистов, что есть не всегда.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Кодовая база достаточно плотно завязана на AWS-провайдере.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Зачастую, невозможно предсказать нагрузку и предотвратить автомасштабирование (пример – черная пятница), что ведет к непредсказуемым затратам.</span></li>
</ol>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f4c6ff"></div>
</div></div></div></div><div id="tm-row-69dc491f4c7d2" class="vc_row vc_row-outer vc_row-fluid"><div id="tm-column-69dc491f4c989" 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">
			<h2><span style="font-weight: 400;">Подведение итогов</span></h2>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f4cb6d"></div>
<div class="tm-image tm-animation move-up" id="tm-image-69dc491f4cbd4">
			<div class="image"><img decoding="async" src="https://koniglabs.ru/wp-content/uploads/2021/08/sravnenie-stoimostej-50x19.png" data-src="https://koniglabs.ru/wp-content/uploads/2021/08/sravnenie-stoimostej.png" class="ll-image unload" alt="Сравнение стоимостей" width="1042" height="402" /></div>	</div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><em><span style="font-weight: 400;">Рис. 10. Сравнение стоимостей</span></em></p>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f4ea5c"></div>

	<div class="wpb_text_column wpb_content_element  tm-animation move-up" >
		<div class="wpb_wrapper">
			<p><span style="font-weight: 400;">Итак, как можно видеть из таблицы (рис. 10), стоимость инфраструктуры не сильно разнится, если смотреть со стороны стоимости разработки. Зато стоимость работ оценена практически в два раза больше. Это весомый аргумент в пользу монолитного решения. Плюс ко всему, как говорилось ранее, это и простота, и меньший порог вхождения и т.д. Тем не менее, есть несколько пунктов, которые перевесили наше решение в сторону выбора serverless: </span></p>
<p>&nbsp;</p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Заказчик имеет положительный опыт разработки с использованием инфраструктуры AWS  и настаивает на serverless;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">решение выглядит масштабируемым, т. е. со стороны разработки «практически» не потребуется ничего предпринимать с ростом нагрузки. Те затраты, которые понес заказчик в начале, с лихвой окупятся при масштабировании. А это значительный плюс по сравнению с монолитным решением;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">SAM &#8211; об этом будет рассказано более подробно в следующей в статье;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Со стороны команды разработки, действительно хотелось опробовать современный подход в разработке, поэтому остановились на serverless 🙂</span></li>
</ul>

		</div>
	</div>
<div class="tm-spacer" id="tm-spacer-69dc491f4eb3a"></div>
</div></div></div></div><div id="tm-row-69dc491f4ec13" class="vc_row vc_row-outer vc_row-fluid"><div id="tm-column-69dc491f4edf3" class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner "><div class="wpb_wrapper"><div class="tm-button-wrapper tm-animation move-up" id="tm-button-69dc491f4f038">
		<a class="tm-button style-flat tm-button-nm tm-button-" href="https://b24-9tnih8.bitrix24.site/crm_form4/"
		target=" _blank"	>

		
						<span class="button-text" data-text="Консультация по архитектуре ПО">
				Консультация по архитектуре ПО			</span>
			
		

	</a>
</div>
<div class="tm-spacer" id="tm-spacer-69dc491f4f0e9"></div>
</div></div></div></div><div id="tm-row-69dc491f4f227" class="vc_row vc_row-outer vc_row-fluid"><div id="tm-column-69dc491f4f4b6" 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">
			
		</div>
	</div>
</div></div></div></div>
<p>The post <a href="https://koniglabs.ru/serverless-vs-monolit/">Serverless vs монолит: что выбрать в среде AWS?</a> appeared first on <a href="https://koniglabs.ru">König Labs</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://koniglabs.ru/serverless-vs-monolit/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>