все кейсы
Маркетплейсы и e-commerce под нагрузкой ]

Юркас

Год развиваем e-com-ядро Yurkas. Продажи не останавливались ни на день

Платформа

о проекте ]

Год развиваем e-com-ядро Yurkas. Продажи не останавливались ни на день

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

2 ГБпамять воркеров RabbitMQ вместо 50 ГБ
15 секундтяжёлые запросы вместо двух часов
3–9×ускорение API на разных эндпоинтах
20 МБпамять на самых тяжёлых пересчётах вместо 4 ГБ
задача ]

развивать критичный для бизнеса продукт без права на остановку

к нам пришла не новая разработка, а живая e-commerce-система с накопленным наследием — и с дневной выручкой, которую нельзя поставить на паузу.

запрос ]

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

вызов ]

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

конфигуратор Yurkas: номенклатура, цены, массовая генерация
способ решения задачи ]

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

путь 1 ]

Переписать с нуля

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

путь 2 ]наш выбор ]

развивать рядом

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

сделать быстро — задача подрядчика. Не уронить бизнес — задача партнёра

новая архитектура растёт, пока действующая система продаёт
подход ]

бизнес не заметил, что у него меняют ядро

старая система продаёт Новая — растёт рядом

  1. 01
    Сохраняем то, что работаетДействующий конфигуратор остаётся источником продаж до тех пор, пока новая версия не закроет его функциональность полностью. Не трогаем то, что прямо сейчас приносит выручку клиенту.
  2. 02
    Строим новое рядомКаждая бизнес-область — каталог, цены, комплекты, интеграции — живёт в своём изолированном пространстве со своими правилами. Связи между ними становятся явными.
  3. 03
    Переносим по одной страницеКаждый перенос — отдельный управляемый шаг. Сначала готовим новую версию модуля, тестируем её рядом со старой, потом переключаем трафик. В любой момент можно откатиться.
  4. 04
    Развиваем параллельноПока идёт миграция, продукт продолжает развиваться: добавляются новые правила ценообразования, сценарии, интеграции. Новая архитектура изначально проектируется под то, чтобы вмещать развитие.

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

перенос модулей: по одному, с возможностью отката
архитектура ]

архитектура, которая выдержит развитие

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

domain-driven design

Бизнес-логика вынесена в доменные модули с чёткими границами. Изменение правила в одном месте больше не означает риск для десятков смежных компонентов.

Что это даёт ]
  • — Новый функционал добавляется внутрь одного модуля, а не размазывается по всей системе.
  • — Связи между доменами становятся явными и управляемыми.
  • — Команда видит, где заканчивается одна предметная зона и начинается другая.

асинхронные очереди

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

Что это даёт ]
  • — Покупатель не ждёт, пока система пересчитывает то, что должна была посчитать ночью.
  • — Тяжёлые задачи запускаются в рабочие часы без риска положить систему.
  • — Можно горизонтально масштабировать обработку без переделки кода.
стек: PHP / Symfony / Nuxt / RabbitMQ / PostgreSQL

Современный, проверенный стек, подходящий для долгого развития. Без экспериментальных решений — где работает бизнес клиента, нет места для технологических ставок.

доменные модули с явными границами
RabbitMQ: очереди для тяжёлых операций
контроль ]

наблюдаемость и аудит

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

Что это даёт ]
  • — Любое подозрительное событие фиксируется и проверяется.
  • — Изменения в критичных зонах (цены, совместимость, номенклатура) контролируются.
  • — Снижается риск того, что ошибка станет видна только из жалобы клиента.

управляемая миграция

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

Что это даёт ]
  • — Команда видит поведение новой версии в реальных условиях до того, как она становится боевой.
  • — Изменения происходят постепенно, без эффекта «большого взрыва».
  • — Команда клиента может проверять каждый перенос до того, как он станет необратимым.
Управление и наблюдаемость ]
  • Страница системных уведомленийРазработана с нуля. Фиксирует критичные события и нештатные сценарии — операторы видят их раньше, чем они доходят до покупателя. Заменяет жалобу клиента как способ узнать о проблеме.
  • Ролевая модельВведены роли админов и суперадминов с разделением прав. Изменения в критичных зонах системы — ценах, совместимости, номенклатуре — требуют соответствующих полномочий.
настройка ролей и прав доступа
что сделано ]

год работы: ядро конфигуратора и всё, что рядом

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

Ядро системы ]
  • Перенос страниц конфигуратораПоловина ключевых страниц переведена со старой версии на новую архитектуру. Работа продолжается — оставшиеся переносятся поэтапно, с переключением трафика только после прохождения проверок.
  • Платформа для тяжёлых операцийМассовый пересчёт цен, генерация номенклатуры и синхронизация с внешним учётом выведены в очереди RabbitMQ. Поддержаны сценарии расчёта будущих цен и массовая фоновая обработка товарных позиций.
Смежные интеграции ]
  • SSO для NextcloudРеализована единая авторизация через OAuth2: синхронизация ролей, управление папками, автоматический выход при смене пароля. Передана техническая документация для администраторов.
  • Telegram-бот для поиска номенклатурыAI-помощник в Telegram для поиска по номенклатуре Бот на базе LLM помогает менеджерам и клиентам находить товары в каталоге на естественном языке — без точных артикулов. Понимает синонимы, нестрогие запросы, уточнения в диалоге. Точность поиска около 90%
рабочее место администратора конфигуратора
проект в цифрах ]

что изменилось в системе после миграции на новую архитектуру и переработки самых тяжёлых операций

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

  • память воркеров RabbitMQУстранены десятки утечек памяти, накопленных за историю проекта
  • тяжёлые запросыПосле перехода на контейнеризацию и оптимизации обработки
  • скорость APIПо разным эндпоинтам — в зависимости от типа операции
  • память на отдельных запросахНа самых тяжёлых операциях пересчёта
польза ]

что это значит для бизнеса

  • ЭффективностьТа же инфраструктура держит больше — система не упирается в железо по мере роста.
  • ОптимизацияСценарии, которые раньше нельзя было запускать в рабочие часы, теперь идут в фоновом режиме за секунды.
  • Готовность к ростуЗапас прочности для роста бизнеса — архитектура выдержит больше товаров, цен, заказов без необходимости снова трогать ядро.

продукт продолжает приносить выручку

архитектура — готова к следующему этапу развития

Эффективность
Оптимизация
Готовность к росту
следующий шаг ]

давайте обсудим ваш проект

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

что будет после заявки ]
01
созвон 30 минутобсуждаем задачу, ограничения и ожидания
02
оценка за 3 дняобъём, сроки и состав команды
03
предложениеплан первой итерации и договор
следующий кейс ]