0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p><strong>Этот текст не объясняет, что такое микросервисы и как работает такая архитектура. Но если вы впечатлены историей успеха микросервисов и надеетесь на них как на панацею в своем приложении - этот материал написан для вас. Этот текст о сложностях, с которыми вы столкнетесь при использовании микросервисов, а также об ответственности разработчиков при выборе инструментов для работы.</strong></p>
1
<p><strong>Этот текст не объясняет, что такое микросервисы и как работает такая архитектура. Но если вы впечатлены историей успеха микросервисов и надеетесь на них как на панацею в своем приложении - этот материал написан для вас. Этот текст о сложностях, с которыми вы столкнетесь при использовании микросервисов, а также об ответственности разработчиков при выборе инструментов для работы.</strong></p>
2
<p><em>Примечание - Это адаптированный перевод статьи<a>STOP!! You don’t need Microservices</a>Эбина Джона, архитектора сетей и веб-разработчика. Повествование ведётся от лица автора оригинала.</em></p>
2
<p><em>Примечание - Это адаптированный перевод статьи<a>STOP!! You don’t need Microservices</a>Эбина Джона, архитектора сетей и веб-разработчика. Повествование ведётся от лица автора оригинала.</em></p>
3
<p>Впервые я услышал о микросервисах в 2013 году из видео на YouTube, посвященном архитектуре Netflix. Это потрясающая история успеха, но тогда я не придал ей значения. Она была слишком сложной для меня - человека, который на тот момент только начал постигать принципы разработки.</p>
3
<p>Впервые я услышал о микросервисах в 2013 году из видео на YouTube, посвященном архитектуре Netflix. Это потрясающая история успеха, но тогда я не придал ей значения. Она была слишком сложной для меня - человека, который на тот момент только начал постигать принципы разработки.</p>
4
<p>Затем наступил бум микросервисов, - а проект, в котором я работал, перешел на эту архитектуру. Буду честен: широкие возможности модульной архитектуры тогда были скрыты от меня. И я, будучи невежественным разработчиком, который старается держаться подальше от DevOps, просто добавил дополнительный слой плотности.</p>
4
<p>Затем наступил бум микросервисов, - а проект, в котором я работал, перешел на эту архитектуру. Буду честен: широкие возможности модульной архитектуры тогда были скрыты от меня. И я, будучи невежественным разработчиком, который старается держаться подальше от DevOps, просто добавил дополнительный слой плотности.</p>
5
<p>Спустя пять лет я работал над другим проектом и с другими людьми. Тогда я столкнулся с множеством проблем, которые возникли из-за плохо спроектированных микросервисов в сочетании с результатом работы девопсов-любителей. Тогда туман рассеялся и я увидел, насколько хрупки и несовершенны микросервисы - это заставило меня заново взглянуть на архитектуру в целом. Лучше поздно, чем никогда.</p>
5
<p>Спустя пять лет я работал над другим проектом и с другими людьми. Тогда я столкнулся с множеством проблем, которые возникли из-за плохо спроектированных микросервисов в сочетании с результатом работы девопсов-любителей. Тогда туман рассеялся и я увидел, насколько хрупки и несовершенны микросервисы - это заставило меня заново взглянуть на архитектуру в целом. Лучше поздно, чем никогда.</p>
6
<p>Если вы архитектор или дизайнер сервисов, который раздумывает над внедрением микросервисов как архитектуры по умолчанию, призываю вас задать себе несколько вопросов.</p>
6
<p>Если вы архитектор или дизайнер сервисов, который раздумывает над внедрением микросервисов как архитектуры по умолчанию, призываю вас задать себе несколько вопросов.</p>
7
<h3>Ваше приложение действительно настолько велико, что его можно разбить на микросервисы?</h3>
7
<h3>Ваше приложение действительно настолько велико, что его можно разбить на микросервисы?</h3>
8
<p>Не все приложения достаточно велики, чтобы их можно было разбить на отдельные, более мелкие части. Микросервисы, как следует из названия, представляют собой набор служб, у каждой из которых есть определенная функция. В идеальном мире каждая из них представляет собой законченное приложение.</p>
8
<p>Не все приложения достаточно велики, чтобы их можно было разбить на отдельные, более мелкие части. Микросервисы, как следует из названия, представляют собой набор служб, у каждой из которых есть определенная функция. В идеальном мире каждая из них представляет собой законченное приложение.</p>
9
<p>На графике ниже - гипотетическое сравнение "затрат на строку кода" между микросервисами и традиционным монолитом. Микросервисы требуют больших ресурсов (времени и вычислительных мощностей) на старте, но чем больше будет сервис, тем дешевле они обходятся. Стоимость - это то, о чем должен думать каждый. Если вас это не заботит, вероятно, вам вообще не стоит принимать такие решения.</p>
9
<p>На графике ниже - гипотетическое сравнение "затрат на строку кода" между микросервисами и традиционным монолитом. Микросервисы требуют больших ресурсов (времени и вычислительных мощностей) на старте, но чем больше будет сервис, тем дешевле они обходятся. Стоимость - это то, о чем должен думать каждый. Если вас это не заботит, вероятно, вам вообще не стоит принимать такие решения.</p>
10
<p>Ваша база кода будет расти в будущем, а это может добавить новый уровень сложности. Но не стоит забывать, что правильно разработанный код всегда можно перевести на микросервисы при приближении к точке пересечения графиков.</p>
10
<p>Ваша база кода будет расти в будущем, а это может добавить новый уровень сложности. Но не стоит забывать, что правильно разработанный код всегда можно перевести на микросервисы при приближении к точке пересечения графиков.</p>
11
<h3>Отдельные компоненты приложения действительно нуждаются в масштабировании?</h3>
11
<h3>Отдельные компоненты приложения действительно нуждаются в масштабировании?</h3>
12
<p>Объясню на примере. Допустим, product owner пришел к вам с идеей сделать новый сервис - систему управления персоналом (HRMS) для организаций, численность сотрудников которых превышает 10 тысяч человек. Энтузиаст технологий внутри вас сразу предложит решение - микросервисная архитектура. Дальше происходит примерно следующее:</p>
12
<p>Объясню на примере. Допустим, product owner пришел к вам с идеей сделать новый сервис - систему управления персоналом (HRMS) для организаций, численность сотрудников которых превышает 10 тысяч человек. Энтузиаст технологий внутри вас сразу предложит решение - микросервисная архитектура. Дальше происходит примерно следующее:</p>
13
<p>На картинке показан крайний случай, но он помогает понять суть вопроса. Одно из главных преимущества использования архитектуры микросервисов - простота масштабирования отдельно взятого компонента. Можно найти множество приложений, в которых этот принцип сработает, но нужно ли это вашему приложению?</p>
13
<p>На картинке показан крайний случай, но он помогает понять суть вопроса. Одно из главных преимущества использования архитектуры микросервисов - простота масштабирования отдельно взятого компонента. Можно найти множество приложений, в которых этот принцип сработает, но нужно ли это вашему приложению?</p>
14
<h3>Есть ли у вас транзакции, связанные с услугами?</h3>
14
<h3>Есть ли у вас транзакции, связанные с услугами?</h3>
15
<p>Здесь речь пойдет, вероятно, о самом стратегически важном вопросе, ведь транзакции, охватывающие несколько сервисов, отвечают за всю архитектуру. Распределение транзакций между службами может привести к их взаимной блокировке в результате серии тупиковых ситуаций, которые трудно отследить. Кроме того, возникает перманентное<a>состояние гонки (race condition)</a>, которое может нанести ущерб работоспособности всего сервиса и портить кровь инженерам.</p>
15
<p>Здесь речь пойдет, вероятно, о самом стратегически важном вопросе, ведь транзакции, охватывающие несколько сервисов, отвечают за всю архитектуру. Распределение транзакций между службами может привести к их взаимной блокировке в результате серии тупиковых ситуаций, которые трудно отследить. Кроме того, возникает перманентное<a>состояние гонки (race condition)</a>, которое может нанести ущерб работоспособности всего сервиса и портить кровь инженерам.</p>
16
<p>Cервисы REST не имеют состояния по определению и не должны участвовать в транзакциях, которые проходят по нескольким сервисам. В мире высокой производительности двухфазная фиксация (<a>2PC</a>) - ненужное зло. А протокол<a>SAGA</a>добавит еще один уровень сложности, к которому вы можете быть не готовы.</p>
16
<p>Cервисы REST не имеют состояния по определению и не должны участвовать в транзакциях, которые проходят по нескольким сервисам. В мире высокой производительности двухфазная фиксация (<a>2PC</a>) - ненужное зло. А протокол<a>SAGA</a>добавит еще один уровень сложности, к которому вы можете быть не готовы.</p>
17
<p>"Микросервисы в конечном счете создают проблемы согласованности, поскольку они стремятся к децентрализации управления данными. С монолитом вы можете выпустить множество обновлений за одну транзакцию. Микросервисам для обновления тех же данных требуется больше ресурсов, в то время как распределенные транзакции не приветствуются (по уважительной причине). Разработчики должны знать о проблемах с согласованностью и иметь под рукой инструмент, способный обнаружить асинхронность между службами прежде чем писать код, о котором потом пожалеют" -<a>писал</a>программист Мартин Фаулер.</p>
17
<p>"Микросервисы в конечном счете создают проблемы согласованности, поскольку они стремятся к децентрализации управления данными. С монолитом вы можете выпустить множество обновлений за одну транзакцию. Микросервисам для обновления тех же данных требуется больше ресурсов, в то время как распределенные транзакции не приветствуются (по уважительной причине). Разработчики должны знать о проблемах с согласованностью и иметь под рукой инструмент, способный обнаружить асинхронность между службами прежде чем писать код, о котором потом пожалеют" -<a>писал</a>программист Мартин Фаулер.</p>
18
<p>Итак, можно ли добиться того, чтобы транзакции охватывали разные службы? Конечно! Но стоит ли делать цепочку действий поверх сервисов без состояния (stateless)? Вероятно, нет.</p>
18
<p>Итак, можно ли добиться того, чтобы транзакции охватывали разные службы? Конечно! Но стоит ли делать цепочку действий поверх сервисов без состояния (stateless)? Вероятно, нет.</p>
19
<h3>Сервисам необходимо часто общаться друг с другом?</h3>
19
<h3>Сервисам необходимо часто общаться друг с другом?</h3>
20
<p>В традиционном монолитном сервисе каждый экземпляр микросервиса представлен в виде модуля системы. Связь между ними осуществляется в памяти, а задержка близка к нулю. Внедрение микросервисов означает, что коммуникация между службами переходит от транзакций в памяти к сетевым инструкциям.</p>
20
<p>В традиционном монолитном сервисе каждый экземпляр микросервиса представлен в виде модуля системы. Связь между ними осуществляется в памяти, а задержка близка к нулю. Внедрение микросервисов означает, что коммуникация между службами переходит от транзакций в памяти к сетевым инструкциям.</p>
21
<p>Есть множество проверенных решений этой проблемы, но все они имеют свою цену - задержку. Переход от транзакций, которые выполняются в памяти, к сетевой связи, увеличивает единицу задержки с наносекунд (нс) до микросекунд (мс).</p>
21
<p>Есть множество проверенных решений этой проблемы, но все они имеют свою цену - задержку. Переход от транзакций, которые выполняются в памяти, к сетевой связи, увеличивает единицу задержки с наносекунд (нс) до микросекунд (мс).</p>
22
<p>Представьте, что три разных сервиса общатся друг с другом по сети. Если каждый вызов службы занимает 100 мс (а так нередкое бывает под нагрузкой), 300 мс придется тратить только на ожидание ответа сети.</p>
22
<p>Представьте, что три разных сервиса общатся друг с другом по сети. Если каждый вызов службы занимает 100 мс (а так нередкое бывает под нагрузкой), 300 мс придется тратить только на ожидание ответа сети.</p>
23
<p>Некоторые приложения по своей природе тесно интегрированы с компонентами и сервисами. Дополнительный уровень связи, который увеличивает задержку, может привести к катастрофическим результатам - например, в приложениях, которые обрабатывают данные в реальном времени. Представьте, что вы решили увеличить задержку связи диспетчеру в аэропорту или хирургу во время операции - это почти то же самое.</p>
23
<p>Некоторые приложения по своей природе тесно интегрированы с компонентами и сервисами. Дополнительный уровень связи, который увеличивает задержку, может привести к катастрофическим результатам - например, в приложениях, которые обрабатывают данные в реальном времени. Представьте, что вы решили увеличить задержку связи диспетчеру в аэропорту или хирургу во время операции - это почти то же самое.</p>
24
<h3>И еще немного фактов</h3>
24
<h3>И еще немного фактов</h3>
25
<ul><li><p><strong>Дополнительная сложность.</strong>Да, сложность решения не может быть определена количественно и сравнивать ее можно только в относительном выражении. Хотя изначально микросервисы предназначены для того, чтобы упростить архитектуру приложения за счет разделения монолита на части, микросервисная архитектура сложна в развертывании и обслуживании.</p>
25
<ul><li><p><strong>Дополнительная сложность.</strong>Да, сложность решения не может быть определена количественно и сравнивать ее можно только в относительном выражении. Хотя изначально микросервисы предназначены для того, чтобы упростить архитектуру приложения за счет разделения монолита на части, микросервисная архитектура сложна в развертывании и обслуживании.</p>
26
</li>
26
</li>
27
<li><p><strong>Стоимость развертывания.</strong>Микросервисы - это распределенные системы с молекулярной структурой, а распределение имеет свою цену. Если монолит можно развернуть на одной виртуальной машине или в контейнере, то каждой службе в микросервисной структуре (по крайней мере, в идеальном мире) требуется отдельная виртуальная машина или контейнер. Их объем меньше, чем у монолита, но, скорее всего, они обойдутся дороже даже без учета стоимости обслуживания.</p>
27
<li><p><strong>Стоимость развертывания.</strong>Микросервисы - это распределенные системы с молекулярной структурой, а распределение имеет свою цену. Если монолит можно развернуть на одной виртуальной машине или в контейнере, то каждой службе в микросервисной структуре (по крайней мере, в идеальном мире) требуется отдельная виртуальная машина или контейнер. Их объем меньше, чем у монолита, но, скорее всего, они обойдутся дороже даже без учета стоимости обслуживания.</p>
28
</li>
28
</li>
29
<li><p><strong>Команда DevOps.</strong>Без команды DevOps поддерживать и контролировать микросервисы не получится, а найм таких специалистов может и помочь, и навредить компании. С одной стороны, DevOps - это широко распространенное и проверенное операционное решение. Но если компания небольшая, найм таких специалистов скорее принесет убытки, чем сделает организацию более прогрессивной.</p>
29
<li><p><strong>Команда DevOps.</strong>Без команды DevOps поддерживать и контролировать микросервисы не получится, а найм таких специалистов может и помочь, и навредить компании. С одной стороны, DevOps - это широко распространенное и проверенное операционное решение. Но если компания небольшая, найм таких специалистов скорее принесет убытки, чем сделает организацию более прогрессивной.</p>
30
</li>
30
</li>
31
<li><p><strong>Высокая связанность компонентов.</strong>Некоторые части сервиса тесно связаны друг с другом. Попытка разделить их только для того, чтобы "вписаться" в архитектуру, может закончиться катастрофой. Отсутствие опыта. Отсутствие опыта имеет решающее значение при решении любых проблем - в том числе вопросов, связанных с сервисно-ориентированной архитектурой. Когда дело доходит до микросервисов, ущерб приумножается: если вы разворачиваете сервисы в неправильном порядке или происходит сбой, при котором один из зависимых сервисов выходит из строя, менять что-то может быть слишком поздно.</p>
31
<li><p><strong>Высокая связанность компонентов.</strong>Некоторые части сервиса тесно связаны друг с другом. Попытка разделить их только для того, чтобы "вписаться" в архитектуру, может закончиться катастрофой. Отсутствие опыта. Отсутствие опыта имеет решающее значение при решении любых проблем - в том числе вопросов, связанных с сервисно-ориентированной архитектурой. Когда дело доходит до микросервисов, ущерб приумножается: если вы разворачиваете сервисы в неправильном порядке или происходит сбой, при котором один из зависимых сервисов выходит из строя, менять что-то может быть слишком поздно.</p>
32
</li>
32
</li>
33
<li><p><strong>Сквозное тестирование.</strong>Традиционное монолитное приложение позволяет запускать тесты почти мгновенно. Наличие нескольких сервисов с взаимозависимостью приведет к задержке тестирования без жизнеспособной оркестрации. Хаотические контракты на данные. Разработка и хранение контрактов на данные внутри команды сильно отличается от обмена ими между командами. При работе с микросервисами ваша команда может не находиться в одном регионе, не говоря уже об использовании одного и того же языка программирования. Выработка контрактов с данными для особых нужд будет стоить вам времени и места.</p>
33
<li><p><strong>Сквозное тестирование.</strong>Традиционное монолитное приложение позволяет запускать тесты почти мгновенно. Наличие нескольких сервисов с взаимозависимостью приведет к задержке тестирования без жизнеспособной оркестрации. Хаотические контракты на данные. Разработка и хранение контрактов на данные внутри команды сильно отличается от обмена ими между командами. При работе с микросервисами ваша команда может не находиться в одном регионе, не говоря уже об использовании одного и того же языка программирования. Выработка контрактов с данными для особых нужд будет стоить вам времени и места.</p>
34
</li>
34
</li>
35
<li><p><strong>Устаревшая база кода.</strong>Давайте будем честны - большинство из нас каждый день работает с устаревшей базой кода. Быстро развитие технологий двигает нас вперед, но в то же время они еще больше изолируют нас от legacy-кода. Вы уверены, что только что разработанный фреймворк на RabbitMQ, будет хорошо работать с устаревшим приложением на<a>IBM AIX</a>?</p>
35
<li><p><strong>Устаревшая база кода.</strong>Давайте будем честны - большинство из нас каждый день работает с устаревшей базой кода. Быстро развитие технологий двигает нас вперед, но в то же время они еще больше изолируют нас от legacy-кода. Вы уверены, что только что разработанный фреймворк на RabbitMQ, будет хорошо работать с устаревшим приложением на<a>IBM AIX</a>?</p>
36
</li>
36
</li>
37
<li><p><strong>Проблемы при отладке.</strong>Каждая служба будет иметь собственный набор файлов журнала для анализа. Чем больше сервисов, тем больше файлов.</p>
37
<li><p><strong>Проблемы при отладке.</strong>Каждая служба будет иметь собственный набор файлов журнала для анализа. Чем больше сервисов, тем больше файлов.</p>
38
</li>
38
</li>
39
</ul><p><em>Выше я пытался ответить на вопрос, стоит ли использовать микросервисы. Мой ответ - определенно нет.</em></p>
39
</ul><p><em>Выше я пытался ответить на вопрос, стоит ли использовать микросервисы. Мой ответ - определенно нет.</em></p>
40
<h3>Итоги</h3>
40
<h3>Итоги</h3>
41
<p>Микросервисы заслужили свою популярность - они помогли решить проблемы, которые в сообществе считались неразрешимыми. Истории Netflix, Uber, SoundCloud и Amazon об адаптации микросервисов для многих стали источниками вдохновения - и успех не ограничивается только потребительскими приложениями. У меня был опыт работы с американским гигантом в сфере здравоохранения и я был очарован возможностями дизайна архитектуры каждый раз, когда открывал исходный код.</p>
41
<p>Микросервисы заслужили свою популярность - они помогли решить проблемы, которые в сообществе считались неразрешимыми. Истории Netflix, Uber, SoundCloud и Amazon об адаптации микросервисов для многих стали источниками вдохновения - и успех не ограничивается только потребительскими приложениями. У меня был опыт работы с американским гигантом в сфере здравоохранения и я был очарован возможностями дизайна архитектуры каждый раз, когда открывал исходный код.</p>
42
<p>Я не стану осуждать вашу доверчивость, если вы внедрили микросервисы пять лет назад. Тогда было другое время и все, что мы можем сделать сейчас - честно рассказать о минусах этой архитектуры. К 2021 году сообщество достаточно обожгло об нее руки. Теперь ясно, что безосновательно внедряя архитектуру микросервисов, вы превратите свой плохой код в плохую инфраструктуру.</p>
42
<p>Я не стану осуждать вашу доверчивость, если вы внедрили микросервисы пять лет назад. Тогда было другое время и все, что мы можем сделать сейчас - честно рассказать о минусах этой архитектуры. К 2021 году сообщество достаточно обожгло об нее руки. Теперь ясно, что безосновательно внедряя архитектуру микросервисов, вы превратите свой плохой код в плохую инфраструктуру.</p>
43
<p>Мне нравятся увлеченные программисты - я сам был и остаюсь таковым. Они поклоняются тому, что делают, и переходят все границы, чтобы решить стоящую перед ними проблему. Но руководитель компании не может поступать также - это может стоить организации целое состояние. Мне жаль вас разочаровывать, но микросервисы не должны быть архитектурой приложения по умолчанию - это не та серебряная пуля, которую вы искали. Сохраняйте равновесие с<a>KISS</a>и<a>YAGNI</a>.</p>
43
<p>Мне нравятся увлеченные программисты - я сам был и остаюсь таковым. Они поклоняются тому, что делают, и переходят все границы, чтобы решить стоящую перед ними проблему. Но руководитель компании не может поступать также - это может стоить организации целое состояние. Мне жаль вас разочаровывать, но микросервисы не должны быть архитектурой приложения по умолчанию - это не та серебряная пуля, которую вы искали. Сохраняйте равновесие с<a>KISS</a>и<a>YAGNI</a>.</p>
44
<p>Как у энтузиаста, у вас есть право иметь свои технологии-фавориты. Однако важно сделать прагматичный выбор между тем, что вам больше нравится, и тем, что лучше всего подходит.</p>
44
<p>Как у энтузиаста, у вас есть право иметь свои технологии-фавориты. Однако важно сделать прагматичный выбор между тем, что вам больше нравится, и тем, что лучше всего подходит.</p>