Веб · E-commerce · Архитектура

Магазин грузился 5 секунд — теперь мгновенно. Монолит на Laravel переписан в 7 сервисов на Go

Переписали работающий магазин с монолита на Laravel в семь независимых сервисов на Go — не остановив продажи ни на один день.

Работаем с проектом 2 года — с сентября 2024.

Магазин грузился 5 секунд — теперь мгновенно. Монолит на Laravel переписан в 7 сервисов на Go

Клиент

Марка дизайнерской мебели и декора: собственный склад в Санкт-Петербурге, салоны в Москве и Петербурге, интернет-магазин на 2 200 позиций.

Задача

Проект достался нам наследством: монолит на Laravel, страницы каталога открывались около пяти секунд, поиск по товарам тормозил, сервер съедал память без видимой причины.

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

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

Что мы сделали

Разобрали монолит на семь сервисов

Систему разнесли на семь независимых сервисов на Go. Каждый — отдельный репозиторий со своим пайплайном сборки и выкатки, поэтому релиз одного не задевает остальные.

  • Публичный REST API
  • SSR-фронтенд витрины
  • Админ-панель
  • Личный кабинет клиента
  • AI-сервис для внутренних задач
  • Генератор коммерческих предложений
  • Сервис экспорта товарных фидов

Перешли с PHP на Go

Бэкенд переписан с Laravel на Go с Fiber и Chi. Это дало предсказуемое потребление памяти и скорость отдачи, которой на прежнем стеке добиться не получалось.

Отказались от SPA в пользу серверного рендеринга

Витрину собрали на Templ и HTMX. Решение осознанное: для магазина с каталогом на 2 200 позиций органический трафик важнее клиентской интерактивности.

Результат — быстрая первая отрисовка, полная индексируемость поисковиками и отсутствие дублирования бизнес-логики между сервером и клиентом.

Вынесли поиск и добавили кеш

Полнотекстовый поиск переехал в Meilisearch, с автоматической деградацией на pg_trgm, если индекс недоступен — магазин продолжает искать даже при отказе поискового сервиса.

Часто запрашиваемые данные кешируются в Redis, что сняло пиковую нагрузку с базы.

Запустили новый дизайн одновременно с переездом

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

Переехали без остановки продаж

Новые сервисы месяцами обкатывались рядом с работающим монолитом на реальных данных. Финальное переключение выполнили за одно ночное окно, с готовым откатом.

Инфраструктура переехала на self-hosted GitLab с автоматическим CI/CD: выкатка теперь делается одним пушем вместо ручной процедуры.

Результат

  • Каталог открывается за доли секунды вместо ~5 секунд
  • Потребление памяти снизилось кратно, пиковая нагрузка на базу — в разы
  • Поиск по 2 200 товарам работает мгновенно
  • Отказ одного сервиса не роняет остальные, нагруженные части масштабируются отдельно
  • Новые функции доходят до продакшена в день выпуска
  • Магазин не простоял ни дня, каталог полностью индексируется поисковиками
  • Новая витрина выкатилась одновременно с переездом

Как это выглядит

Магазин грузился 5 секунд — теперь мгновенно. Монолит на Laravel переписан в 7 сервисов на Go

Стек

GoFiberChiTemplHTMXPostgreSQLRedisMeilisearchC#ASP.NET CoreamoCRMNGINXGitLab CI/CD

Ссылки

Услуги по теме

Нужно похожее?

Расскажите о задаче — разберём её бесплатно и назовём срок и вилку стоимости.