Video thumbnail

    Григорий Петров. Сложность, убивающая микросервисы

    Valuable insights

    1.Микросервисы часто усложняют системы вместо упрощения: Стремление клиентов декомпозировать монолиты в микросервисы, часто на новом языке, не приводит к простоте. Напротив, это вводит новый, более высокий уровень когнитивной сложности для команд разработки.

    2.Нейрофизиология объясняет сложность освоения кода: Осознание сложного кода зависит от активации устойчивых смысловых единиц (когнитомов) в долговременной памяти. Эти единицы формируются годами практического опыта, а не за счет краткосрочного обучения.

    3.Фреймворки монолитов предоставляют готовые смысловые блоки: Известные фреймворки, такие как Ruby on Rails или Django, формируют у разработчиков одинаковые детали Лего, позволяя быстро осознавать большие конструкции, чего не хватает в разрозненной экосистеме микросервисов.

    4.Распределенные системы не прощают архитектурных ошибок: В отличие от монолитов, где технический долг можно накапливать, распределенные системы мгновенно реагируют на плохие архитектурные решения или некачественный контроль ошибок, что приводит к катастрофическому увеличению времени отклика.

    5.Освоение Dev Platform требует длительной консолидации памяти: Создание внутренней платформы разработки для поддержки сотен микросервисов требует месяцев и лет для того, чтобы разработчики перенесли навыки работы с этой платформой в долговременную память и начали работать комфортно.

    6.Контроль архитектурных границ в монолитах проще: В монолитных приложениях возможно использование линтеров для принудительного соблюдения архитектурных границ, проверяя синтаксическое дерево кода на предмет недопустимых зависимостей и вызовов.

    Введение: Критика микросервисов

    В сфере аутстаффинга и обучения разработчиков наблюдается тенденция, когда клиенты обращаются с запросом на декомпозицию существующих монолитных систем, например, написанных на Python, в архитектуру микросервисов с использованием Go. Ожидается, что такой переход автоматически приведет к упрощению системы. Однако на практике разработчикам приходится тратить значительные усилия, чтобы объяснить, что простота не будет достигнута, и что сложность может возрасти.

    Простые микросервисы могут быть сложнее, чем монолиты.

    Исторический контекст возникновения распределенных систем

    Архитектура микросервисов имеет давнюю историю, уходящую корнями в середину девяностых годов, когда распределенные системы использовались в телекоммуникациях. Тогда это было вынужденной мерой, поскольку серверное оборудование было дорогим, вертикально масштабируемым, а связь между серверами не отличалась высокой скоростью. Такие системы применялись как крайняя мера, когда другие способы построения больших систем были исчерпаны.

    Недавняя критика и реальность микросервисной идеологии

    В последние полтора года наблюдается осторожная критика микросервисной архитектуры. Приводятся примеры крупных сервисов, которые меняют свою структуру. Например, Amazon Prime мигрирует с микросервисов. Также отмечается, что такие сервисы, как Instagram или WhatsApp, поддерживаются относительно небольшими командами инженеров, что контрастирует с масштабами, которые обычно ассоциируются с по-настоящему микросервисной архитектурой.

    Идеология против практической реализации

    Основная идеология микросервисов заключается в том, что за каждый сервис отвечает отдельная команда, а взаимодействие происходит через хорошо документированные API, что не сложнее использования сторонних API. Однако при разработке реалистичных функций, затрагивающих несколько сервисов, неизбежно возникает необходимость общения с другими командами, что усложняет процесс, выходящий за рамки идеализированных API-контрактов.

    • Миграция Amazon Prime с микросервисной архитектуры.
    • Относительно небольшие команды инженеров в Instagram и WhatsApp.
    • Аудиты стартапов, подчеркивающие, что чем проще, тем лучше.

    Нейрофизиология и когнитивная нагрузка на разработчика

    Желание быстро обучать разработчиков является ключевым. Если 20 лет назад обучение до нужного уровня занимало около трех лет, то сейчас необходимо понимать, как мозг осознает код и что именно делает код сложным. Современная нейрофизиология предполагает, что сознание основано на долговременной памяти, содержащей сотни тысяч смыслов, которые академик Анохин называет когнитомами и связями между ними.

    Кратковременная и долговременная память

    Смыслы, на которые не направлено внимание и которые не имеют сильных связей, деактивируются за несколько секунд. Кратковременная память оперирует теми смыслами, которые активированы в данный момент. Исследования с использованием фМРТ показывают, что количество удерживаемых элементов в рабочей памяти (кошелек Миллера) крайне низко, что подчеркивает фундаментальное различие между долговременной памятью (выжженные нейрональные ансамбли) и кратковременной (процесс их включения/выключения).

    • Внимание направляется на имя (смысл активируется).
    • При переключении внимания на следующее имя, предыдущий смысл быстро затухает.
    • Цикличное переключение внимания позволяет удерживать лишь ограниченное число элементов.

    Формирование смысловых единиц в долговременной памяти

    Смыслы, которые формируют основу для осознания кода в долговременной памяти, берутся из нескольких источников. Это не только синтаксис выученного языка программирования, но и опыт использования фреймворков, библиотек и внутренних идиом стека. Осмысленные имена идентификаторов также вносят вклад, помогая рассказать историю, но синтаксис составляет лишь очень малую часть общего ассортимента деталей Лего, необходимых для осознания сложного кода.

    Источник
    Пример осознания
    Синтаксис языка
    Осознание тривиальных конструкций Python
    Опыт использования фреймворка
    Понимание, как отображаются поля модели в админке
    Опыт использования библиотек
    Осознание фрагмента матрицы при работе с библиотекой NumPy
    Идиомы стека
    Понимание странной конструкции опытным разработчиком

    Граф осознания и временные рамки

    Сознание программиста можно уподобить графу, который постоянно достраивается в реальном времени за счет поступающей информации (то, что видят, слышат, ощущают) и одновременно разрушается по мере затухания смыслов. Для активации смысла он должен уже существовать в долговременной памяти. Новые детали Лего не могут быть построены в реальном времени; для их формирования требуются месяцы и годы.

    Когнитивная сложность и фрагментация микросервисов

    Программная сложность (Soft Complexity) является фактором, который убивает проекты, поскольку программист не может отойти на шаг назад и оценить общую картину, как это делает художник. Главная проблема микросервисов заключается в сложности ориентирования. В монолитах разработчики опираются на устоявшиеся фреймворки (Django, Rails), которые дают готовые смысловые конструкции для сознания. В мире микросервисов такого универсального инструментария нет.

    Необходимость внутренних платформ разработки

    Каждая компания, работающая с микросервисами, вынуждена создавать собственные велосипеды, то есть внутренние платформы разработки (Dev Platform), как это сделала Spotify с проектом Эй. Для навигации по большим проектам необходимо знать карту микросервисов и карту команд, поддерживающих эти сервисы, что добавляет нетривиальные коммуникационные накладные расходы.

    Роль Kubernetes в бизнес-логике

    Kubernetes позиционируется как замечательная сетевая операционная система и язык для описания инфраструктуры, но он не является фреймворком для описания сотен тысяч строк бизнес-кода, который пишут программисты. В результате крупные компании тратят годы на разработку внутренних Dev Platform, чтобы обеспечить необходимый уровень абстракции для своих разработчиков.

    Цена обучения и устойчивость к ошибкам

    Аналогия с пациентом, которому удалили гиппокамп, показывает, что формирование долговременной памяти происходит годами, а не месяцами. Разработчику, переходящему с монолита, потребуются месяцы и годы, чтобы навыки работы со сложной Dev Platform перешли в долговременную память и работа стала комфортной. В то время как стандартные веб-фреймворки формируют одинаковые детали Лего у всех разработчиков, платформы для микросервисов у всех разные.

    Долговременная память все-таки формируется годами, а не месяцами.

    Непрощение ошибок в распределенных системах

    • Они не прощают плохих архитектурных решений.
    • Они не прощают плохой контроль ошибок.
    • Они не прощают хаки, которые могут быть допустимы в монолите.

    Если в монолите можно накопить некоторое количество технического долга, то в микросервисной архитектуре из-за комбинаторного взрыва задержек система может перестать работать через пару недель. Микросервисы действительно могут быть круты для изготовления надежных и масштабируемых проектов, выдерживающих миллионы RPS, но это достигается ценой огромных инвестиций в процессы, тулинг и обучение людей.

    Альтернативы и заключительные выводы

    Микросервисы добавляют совершенно новый уровень сложности, к которому многие команды не готовы. Существует возможность проводить архитектурные границы внутри монолита, используя линтеры для синтаксического контроля зависимостей. Это позволяет избежать непредсказуемости, когда изменение в одном месте вызывает сбой в другом, сохраняя при этом преимущества изолированного релиза фич.

    Архитектура Цитадель и производительность

    Дэвид Хаммер Хейсон пропагандирует архитектуру «Цитадель», где ядро бизнес-логики остается в виде «Majestic Monolith», а вокруг него размещаются микросервисы для задач, требующих максимальной скорости и изоляции. При этом отмечается, что современные языки, такие как Ruby, значительно медленнее Python, который, в свою очередь, в 100 раз медленнее C++. Даже на мощном сервере с Ruby on Rails и PostgreSQL производительность может быть ограничена из-за постоянных операций чтения/записи в базу.

    Язык
    Относительная скорость (относительно C++)
    Ruby
    В 4 раза медленнее Python
    Python
    В 100 раз медленнее C++

    Выбор архитектур, языков и фреймворков не является бесплатным, поскольку мозгу требуется время, повторение и обучение для освоения больших концепций. Если не заботиться о коде, как художник, который может отойти и оценить работу, программист не может получить такого же обзора, что и является основой программной сложности.

    Questions

    Common questions and answers from the video to help you understand the content better.

    Почему клиенты ожидают упрощения при переходе от монолита к микросервисам на Go?

    Клиенты ожидают упрощения, поскольку микросервисы позиционируются как более простая идеология, где за каждый сервис отвечает отдельная команда и взаимодействие происходит через API. Однако этот переход добавляет новый, более высокий уровень когнитивной сложности, который не всегда учитывается.

    Как нейрофизиология объясняет, почему опытному разработчику сложно освоить новую микросервисную платформу?

    Нейрофизиология показывает, что осознание кода требует активации смысловых единиц (когнитомов), которые формируются в долговременной памяти годами. Новая внутренняя Dev Platform требует месяцев или лет для того, чтобы эти детали Лего сформировались и стали доступны для быстрого оперирования.

    Какую роль играют фреймворки, такие как Django или Rails, в снижении когнитивной нагрузки на разработчика?

    Фреймворки предоставляют разработчикам стандартизированные, наработанные годами смысловые детали Лего. Это позволяет им быстро осознавать сложные конструкции типового проекта и строить большие системы, используя уже сформированные нейрональные ансамбли.

    Почему распределенные системы менее терпимы к техническому долгу по сравнению с монолитами?

    Распределенные системы не прощают плохих архитектурных решений и ошибок контроля ошибок. В отличие от монолита, где технический долг можно накапливать, в микросервисах некорректные решения приводят к комбинаторному взрыву задержек и быстрому отказу системы.

    Что такое архитектура «Цитадель», предложенная Дэвидом Хаммером Хейсоном?

    Архитектура «Цитадель» предполагает сохранение основного ядра бизнес-логики в виде «Majestic Monolith» в центре. Вокруг этого ядра размещаются несколько аутпостов в виде микросервисов, которые используются для тех задач, где требуется максимальная скорость или изоляция.

    This article was AI generated. It may contain errors and should be verified with the original source.
    VideoToWordsClarifyTube

    © 2025 ClarifyTube. All rights reserved.