Автор статьи: Артем Михайлов

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

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

Примером микросервисной архитектуры может быть крупный интернет-магазин, который имеет несколько микросервисов, каждый из которых отвечает за отдельный функционал. Например, один микросервис занимается учетом товаров, другой – обработкой заказов, третий – формированием отчетности. Каждый микросервис имеет свой API и может взаимодействовать с другими микросервисами через этот API. Таким образом, одна часть приложения (например, модуль учета товаров) может быть изменена или обновлена без изменения другой части (например, модуля обработки заказов), что делает приложения более масштабируемыми и позволяет быстро вносить изменения. 

Основные проблемы реализации микросервисной архитектуры

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

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

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

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

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

Неправильная гранулярность сервисов

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

Существует несколько распространенных проблем, связанных с неправильной гранулярностью сервисов:

  1. Слишком мелкие сервисы могут привести к увеличению накладных расходов на сетевое взаимодействие между сервисами. Каждый запрос между сервисами может вызывать задержку и потери данных, поэтому необходимо находить баланс между числом сервисов и такими факторами, как скорость обработки запросов и объем передаваемых данных.

  2. Сервисы, которые должны быть объединены, могут приводить к более сложному управлению кодом и также могут затруднить отладку и мониторинг. В некоторых случаях несколько более крупных сервисов могут быть более эффективными и практичными, чем большое количество мелких сервисов.

  3. Отсутствие учета потребностей каждого сервиса может привести к "зависимостям между сервисами", когда каждый сервис начинает зависеть от других сервисов для реализации своих задач. Это может создать циклические зависимости, которые могут привести к нестабильности и недоступности всей системы.

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

Неудачный выбор технологий и стека

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

Это может привести к следующим проблемам:

  • Низкая производительность. Некоторые языки программирования, фреймворки и технологии могут привести к значительному снижению производительности системы.

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

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

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

  • Исследуйте и сравните разные технологии и фреймворки перед их использованием в системе.

  • Изучайте все возможные альтернативы, чтобы выбрать лучшее соответствие своим потребностям.

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

  • Закладывайте валидные критерии в выборе технологий и стека, такие как производительность, надежность и безопасность.

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

Незавершенность процессов коммуникации и автоматизации 

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

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

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

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

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

Наконец, важно создать надежную инфраструктуру для CI/CD, которая упростит процесс развертывания и обновления приложений. Для достижения этой цели можно использовать различные инструменты, такие как Jenkins и GitLab, которые обеспечивают автоматизацию процесса сборки, тестирования и доставки.

Отсутствие или некорректное использование API Gateway

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

  1. Проблема взаимодействия сервисов

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

  2. Проблема безопасности

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

  3. Проблема масштабируемости

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

  4. Проблема мониторинга и анализа

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

    Рекомендуется использовать API Gateway как единый интерфейс для взаимодействия между сервисами в любом микросервисном приложении.

Заключение

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

Напоследок хочу порекомендовать бесплатный вебинар про метрики: зачем они нужны и какие виды бывают. Коллеги расскажут про prometheus, как он устроен, как его развернуть в kubernetes и интегрировать с вашими приложениями, а также вы сможете сделать приложение на spring boot с метриками для prometheus.

Комментарии (6)


  1. amakhrov
    28.05.2023 20:04

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

    А каким образом заворачивание всех меж-сервисных запросов на API gateway уменьшит нагрузку на сеть или вероятность сетевых ошибок?


    1. VladimirFarshatov
      28.05.2023 20:04
      +5

      Зачем "уменьшить"? Увеличить куда как полезнее, с т.з. заставления бизнеса закупать овер-гигабитные сети, маршрутизаторы и супер компьютеры! Неужели Вы против Технического Прогрессу? ;)

      Заодно гейтвеем очень удобно создать единую точку отказа, заведомо перегруженную по нагрузке, особенно сетевой .. упало, так сразу всё, гадать, искать, читать логи .. сразу становится лишним. ;)


    1. akurilov
      28.05.2023 20:04

      Я подозреваю что здесь смешаны в кучу api gateway и кэш/graphql


  1. maxzh83
    28.05.2023 20:04
    +1

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

    Неправильный выбор технологий и стека станет причиной множества проблем при практически любой архитектуре, не только микросервисной


    1. akurilov
      28.05.2023 20:04

      А что мешает масштабировать api gateway itself on demand?


  1. pinoquinho
    28.05.2023 20:04
    +2

    К сожалению время идёт и наблюдается перетекание качества в количество. Количество растёт, а вот качество.

    Как известно, микросервисная архитектура позволяет разбивать приложения на более мелкие и управляемые блоки.

    Ребят, ну вы серьёзно? Вы же вроде как курсы IT, должны же знать - вся история программирования есть разные способы разбиения приложения на более мелкие и управляемые блоки. Функции, подпрограммы, библиотеки, объекты, модули, программы, тысячи их. И нет, микросервисная архитектура не предлагает новых способов разбиенич приложения на более мелкие и управляемые блоки - просто использует существующие . Ну разве что затрудняет переиспользование.
    Вроде же большая, уважаемая контора, с высоким рейтингом на хабре, вроде как обучающая людей, ну как же такое писать то можно.
    Ну в конце то концов, несмотря на всю мою лютую, дикую ненависть к микросервисам, ну ведь у них тоже есть своя область применение, полезные свойства. Возможность быстрее делать апдейт маленького сервиса большого приложения (обычно не особо нужно, ну если, конечно у вас не монстр, стартующий два часа. И не работает на практике потому что в апдейт чаще выкатывают кучу микросервисов). Самое главное - независимость сервисов - делай свои сервисы так, чтоб они продолжали работать даже когда родительский микросервис недоступен - позволяет не растерять всех пользователей, когда что-то накрылось - типа что-то накрылось, но что-то ещё продолжает работать. Возможность гибко масштабироваться (обычно не нужно - load balancer-а обычно более чем достаточно). Решить проблему с нехваткой физических ресурсов (CPU, Memory). Но интернет-магазин, если это не озон-амазон в качестве примера - ну ё-маё. Всё равно, что использовать NoSQL просто для фана - ну и что, что одна нода, зато есть возможность масштабироваться, когда-нибудь.
    Ну зайдите с другой стороны. "Когда вам придётся работать с заказчиком, который ничего не понимает в IT, то слова микросервис и k8s будут его сильно возбуждать - даже в баню везти не придётся. И сразу станет понятно почему под проект надо так много железна - кластер же, отказоустойчивость, микросервисы. И сразу станет не так важно, что мы просим за проект в 10 раз больше, чем нужно - на железо придётся потратиться ещё в 10 раз больше, так что всё обосновано, всё норм."
    Вот уже прошли сезоны хайпа на orb, sql, xml, rest, docker - всё прошло и заняло своё место. А "микросервисы - это наша серебряная пуля" продолжает жить. "У нас всё очень современно. Java17, spring boot, микросервисы, k8s, scram, agile". "А почему к вас микросервисы? Да хз, консультант сказал - пилите микросервисы, монолит уже не модно".