Переезд веб-портала: от монолита к микросервисной архитектуре

в 14:40, , рубрики: Блог компании SimbirSoft, микросервисы, Разработка веб-сайтов

Делимся опытом модернизации архитектуры веб-портала, позволившей сделать продукт удобным, стабильным и отказоустойчивым: посещаемость выросла с 350 тысяч до 7 миллионов пользователей! История будет полезна тем, кто планирует расширение своего продукта. Для начала разберемся, какие факторы могут помешать работе и развитию веб-портала:

  • Моральное устаревание. Подход к юзабилити, адаптация к разным устройствам, элементарный внешний вид и структура со временем перестают отвечать запросам аудитории.
  • Технологическое устаревание. Веб-стандарты и технологии постоянно совершенствуются. Изменения затрагивают как инструменты разработчика (например, фреймворки, базы данных, прочее ПО), так и фундаментальные основы веба. Из относительно недавнего — массовый переход с http на https и отказ от поддержки устаревших DNS.
  • Ошибки и сбои. Разработчики могут неидеально справляться со своей задачей и допускать огрехи. Вследствие этого в работе сайта могут происходить нарушения — начиная с того, что кнопки не срабатывают с первого раза, до полного отказа систем.

Кейс

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

Аудит

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

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

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

Переезд веб-портала: от монолита к микросервисной архитектуре - 1

Микросервисы

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

  • Выгрузка, хранение и управление данными из проектов открытых источников;
  • Динамическое создание RSS-лент;
  • Динамическое создание системы блоков, компоновка материалов любых сервисов в структурные блоки;
  • Добавление к материалам сервисов дополнительных данных;
  • Сервис технической поддержки;
  • Единый каталог различных данных.

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

Переезд веб-портала: от монолита к микросервисной архитектуре - 2

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

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

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

  • Решили проблему масштабирования.
  • Внедрили более эффективный процесс разработки распределенными командами.
  • Настроили динамическое управление ресурсами для бесперебойной и быстрой работы системы.

Модернизация стека технологий

Параллельно мы обновили стек технологий. Если изначально портал базировался на php 5.6 и MySQL 5.6, то в ходе усовершенствования движка мы перевели его на версии php 7.0 и MySQL 5.7. Внедрили фреймворк Yii2, обеспечили кеширование memcache.

Переезд веб-портала: от монолита к микросервисной архитектуре - 3

Очередь задач

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

Непрерывная интеграция

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

Для того, чтобы свести к минимуму ошибки, мы ввели дополнительные контуры разработки. Цепочка состоит из нескольких контуров тестирования приложения и инфраструктуры: предрелизный, где проходит последнее тестирование сборки (pre-prod), боевой (prod), несколько тестовых контуров для тестирования сразу нескольких билдов, а также контур для разработчиков.

Система сборок

На начальном этапе из исходников проекта создаются сборки (builds). Вместо разрозненного набора классов, стилей и обработчиков используются объединённые сущности — каждая в оболочке одного исполняемого файла. В сборку помещаются только необходимые конструкции для выполнения событий на странице. Это дополнительно обеспечивает гибкость и скорость работы сайта.

Мониторинг ошибок

GitLab CI дает продвинутые возможности валидации кода и автоматического тестирования. При малейшем несоответствии сборок заданным параметрам система оповещает разработчиков и не позволяет запустить дальнейший процесс реализации компонента до исправления ошибок. Дополнительно мы установили Sentry — полноценный инструмент мониторинга ошибок.

Переезд веб-портала: от монолита к микросервисной архитектуре - 4

Оптимизация процессов

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

Мониторинг и эксплуатация

Все процессы — как на ладони. Мониторинг состояния каждого узла нам обеспечивает Zabbix — комплексная система отслеживания. Мы получили возможность заглянуть в самое ядро структуры проекта и увидеть её компактно.

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

Стабилизация и рефакторинг

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

Новая архитектура — база для роста

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

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

Автор: SSul

Источник

* - обязательные к заполнению поля