К содержимому

Анатомия e-commerce под нагрузкой

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

16 услуг из каталога

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

Заявка занимает пару минут. Отвечаем в течение рабочего дня.

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

Что происходит с этим трафиком дальше? Превратить его в реальную выручку на расчётном счёте способна только архитектура платформы — ничего другого не остаётся. Дальше — чистая инженерия.

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

В такие часы трафик подскакивает в 5–10 раз. Стоимость привлечения каждого клика (CAC) в сезон акций достигает максимума. И если техническая платформа не готова к наплыву, бизнес наблюдает классическую картину потери выручки.

Покупатель кликает по фильтру нужного размера, каталог замирает на 15 секунд, и человек раздражённо уходит на маркетплейс. У другого клиента собранная за полчаса корзина внезапно обнуляется прямо перед оплатой, либо в окне чекаута всплывают чужой адрес и телефон. Бывает ещё хуже: один и тот же акционный пуховик успевают оплатить сразу три человека. Склад в панике, служба поддержки принимает шквал звонков от разгневанных клиентов. И каждый звонок уже стоит денег. Бухгалтерия теряет деньги на комиссиях за обратные эквайринговые возвраты, а реклама, которая привела этих людей, уже оплачена. Дальше — больше: плановый обмен остатками с корпоративной 1С посреди дня наглухо парализует витрину в самый кассовый час года.

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

Фильтры каталога

Для покупателя выбор товара прост: открыть категорию «Обувь» и поставить галочки на нужном бренде, цвете и размере.

— Бренд: Nike (14)

— Цвет: Чёрный (8)

— Размер: 42 (3), 43 (5)

— Цена: от 8 000 до 15 000 ₽

С точки зрения бизнеса проблема кроется не в том, чтобы отфильтровать 10 кроссовок. Главное препятствие — интерактивные счётчики количества товаров в скобках рядом с каждым пунктом. Покупатель ещё не выбрал размер. Но сайт уже обязан показать, сколько именно моделей чёрных Nike останется при выборе 42-го или 43-го размера.

Большинство интернет-магазинов исторически запускаются на классических реляционных базах данных (PostgreSQL или MySQL). Они идеальны для финансового учёта: там надёжно хранятся заказы, проводки и остатки по складам. Но когда тысячи посетителей одновременно щёлкают фильтрами, базе приходится делать огромную вычислительную работу. Она пересчитывает пересечения сотен параметров по таблицам с миллионами записей.

Время отклика каталога подскакивает с комфортных 0,5 секунды до 10–20 секунд. Покупатели не готовы ждать и закрывают вкладку. Компания впустую сжигает рекламный бюджет на контекст и блогеров, потому что привлечённый клиент даже не увидел товар. Возникает эффект домино: перегруженная фильтрами база данных перестаёт отвечать не только в каталоге. Деградация добирается до чекаута и блокирует оформление заказов у тех, кто уже держал карту наготове.

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

Всю работу с витриной берут на себя специализированные поисковые движки, такие как Elasticsearch или OpenSearch. Товарные карточки хранятся в них в виде денормализованных плоских документов. Остатки по любым комбинациям фильтров рассчитываются за 15–30 миллисекунд даже при миллионном ассортименте. Наплыв 50 000 посетителей при такой схеме оставляет кассовое ядро холодным и готовым к бесперебойному приёму платежей.

Сохранность корзин

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

Под высокой нагрузкой бизнес регулярно сталкивается с тремя типичными сбоями, и каждый из них стоит живых денег. Первая беда — обнуление корзины. Покупатель потратил 40 минут на выбор гардероба, наполнил корзину, нажал «Перейти к оформлению» — и видит пустое окно. Корзины неавторизованных пользователей обычно хранятся во временной оперативной памяти серверов (например, в Redis), а в распродажи число сессий вырастает в разы. Когда выделенная память переполняется, сервер начинает автоматически стирать старые сессии, и первыми исчезают корзины тех, кто выбирал дольше других. Вероятность, что покупатель пойдёт собирать гардероб заново, стремится к нулю: вместе с корзиной магазин теряет выручку и лояльность.

Вторая беда — зависание партнёрских интеграций. Современный экран чекаута перегружен внешними сервисами, и это его главная слабость: расчёт бонусов лояльности, виджеты доставки, подсказки адресов, валидаторы промокодов. Если эти сервисы опрашиваются сайтом последовательно и без лимитов времени ожидания, сбой у любого партнёра парализует кнопку «Оплатить». Покупатель видит бесконечный спиннер загрузки.

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

flowchart TD
  ivan["Клиент Иван<br/>запрос страницы корзины"]
  server["Сервер:<br/>корзина Ивана + Cookie"]
  cdn["Кэширующий прокси / CDN:<br/>сохранил персональную страницу как общую"]
  anna["Клиент Анна видит<br/>адрес и телефон Ивана"]
  peter["Клиент Пётр видит<br/>чужие личные данные"]

  ivan -- "ответ персональной страницы" --> server
  server --> cdn
  cdn --> anna
  cdn --> peter

  classDef default fill:none

Пытаясь спасти сайт от перегрузки, технические специалисты включают кэширование страниц целиком. Речь про пограничные серверы и сети доставки контента (CDN). Если настройки выполнены небрежно, сервер кэширует страницу вместе с персональными данными одного пользователя. И раздаёт эту копию всем следующим посетителям. Итог — оборотные штрафы регуляторов за нарушение закона о персональных данных (152-ФЗ), скандалы в СМИ и падение доверия к бренду.

Безопасный чекаут начинается с изолированной памяти: хранилище пользовательских сессий физически отделяется от общего кэша сайта, выделяются гарантированные ресурсы с обязательным сохранением данных на диск, чтобы корзины не стирались ни при каких обстоятельствах. Вторая опора — автономность, она же Graceful Degradation: корзина обязана работать, даже если все внешние партнёры упали. Если сервис программы лояльности не отвечает в течение 500 мс, система не блокирует заказ, а вежливо сообщает: «Списание баллов временно недоступно. Вы можете оформить заказ по текущей цене, а бонусы будут начислены позже».

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

Резервирование остатков

Представьте акцию: на флагманский пуховик объявлена скидка 50%. На складе остался ровно один экземпляр.

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

Если система проверяет реальный складской остаток только после подтверждения транзакции банком, происходит двойная продажа. Банк списывает деньги у обоих покупателей, а на складе остаток уходит в значение «−1».

Вместо медленных блокировок в основной базе данных внедряется механизм быстрой временной брони.

Работает бронь так. В момент перехода к шагу оплаты система за доли миллисекунды уменьшает доступный счётчик в быстрой оперативной памяти, и первый успевший клиент получает резерв с таймером на 15 минут. Второму покупателю сайт сразу сообщает: «Товар зарезервирован другим покупателем», причём до того, как с его карты спишутся деньги. А если первый клиент передумал, закрыл страницу или у него не прошла карта, бронь сгорает сама через 15 минут — вещь снова появляется на витрине без участия кладовщиков или операторов.

Синхронизация с 1С и ERP

Классическая ситуация в ритейле: пятница, 14:00, разгар рабочего дня. Сайт интернет-магазина внезапно начинает открываться по 15 секунд, а карточки товаров выдают ошибки.

Руководство подозревает хакерскую атаку, но виновник банален: из корпоративной 1С по расписанию запустилась плановая выгрузка каталога, самая обычная, по пятницам.

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

Сравним подходы к синхронизации в двух колонках:

ПараметрУстаревший пакетный обмен файламиПотоковый обмен изменениями (дельта)
Что передаётсяВесь каталог целиком (тяжёлый массив)Только изменившиеся строки (несколько килобайт)
Влияние на продажиЗамедление сайта, риск падения в часы пикНулевое влияние на покупателей
Скорость актуализацииРаз в 3–4 часа (остатки запаздывают)Секунды после изменения цены или остатка на складе
Устойчивость к сбоямОшибка в одном товаре ломает всю выгрузкуОшибочный товар изолируется, остальные обновляются
flowchart TD
  erp["1С / склад / ERP"]
  queue["Защитный буфер сообщений (очередь):<br/>принимает любые объёмы данных от склада,<br/>не подпуская их напрямую к живой базе сайта"]
  worker["Фоновый обработчик:<br/>дозированно обновляет данные на витрине<br/>с безопасной скоростью"]
  site["Витрина:<br/>покупатели обновлений не замечают"]

  erp -- "микропакет обновлений" --> queue
  queue --> worker
  worker --> site

  classDef default fill:none

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

Подготовка к пиковым нагрузкам

Знакомое заблуждение нетехнического менеджмента. «Если сайт начнёт тормозить в Чёрную пятницу, мы просто докупим серверов в облаке за полчаса до старта».

В реальности вертикальное наращивание мощности («купить сервер побольше») быстро упирается в физический потолок и стоит неоправданно дорого. Подготовка к пиковым нагрузкам — это планомерный процесс управления рисками.

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

Когда на сайт приходит в 15 раз больше людей, чем планировалось, любая система может подойти к пределу. В этот момент платформа не должна падать с белым экраном ошибки — она переходит в режим управляемой деградации (Graceful Degradation). Первыми отключаются тяжёлые персонализированные рекомендации: блоки «Вам также может понравиться» подменяются статическими витринами с бестселлерами, что снимает нагрузку с базы данных и направляет покупателей на выгодные для бизнеса позиции. Следом скрываются вторичные динамические счётчики — надписи «Сейчас этот товар смотрят 45 человек», ресурсоёмкие анимации и тяжёлые отзывы. А все свободные мощности серверов отдаются главной задаче: дать клиенту ввести данные карты и нажать кнопку оплаты.

Скорость витрины

Витрина интернет-магазина — это все страницы, с которыми покупатель взаимодействует на экране смартфона или компьютера, от каталога до чекаута.

Скорость загрузки страниц напрямую влияет на конверсию и на деньги, потому что каждый промедленный секунда измеряется процентом ушедших покупателей. По данным аналитики Google и крупных ритейлеров, задержка мобильной страницы всего на 1 секунду снижает конверсию на 7%. Если же карточка товара открывается дольше 2,5–3 секунд, показатель отказов возрастает лавинообразно.

До 1,2 секунды страница воспринимается как мгновенный отклик, и конверсия держится на максимуме. В диапазоне 2–3 секунд покупатель уже сомневается и просматривает каталог мельче. После 3,5 секунд начинается резкий уход с сайта к конкурентам или на маркетплейс.

Каталог монобрендового магазина одежды nascent.ru рос, росла и доля мобильных покупателей, и скорость страниц стала сдерживать развитие бизнеса. Время первоначальной загрузки каталога на смартфонах доходило до 3,8 секунды. Контент-команда выкладывала студийные фотографии в исходном тяжёлом качестве: каждая весила 2–4 мегабайта и перегружала каналы связи мобильных пользователей. Дополнительные задержки возникали из-за фоновых запросов к базе при просмотре фильтров.

flowchart TD
  phoneIn["Смартфон"] --> srv["Сервер магазина"]
  srv --> heavy["Тяжёлый запрос в базу;<br/>фотографии по 3–4 Мб"]
  heavy --> slow["Отклик 3,8 сек"]

  phoneOut["Смартфон"] --> cdn["Ближайшая гео-точка CDN:<br/>автосжатие WebP / AVIF, умная подгонка<br/>разрешения, ленивая подгрузка по скроллу"]
  cdn --> fast["Отклик 1,2 сек —<br/>мгновенная отдача"]

  classDef default fill:none

На уровне платформе сделали две вещи. Ручную оптимизацию кадров заменил автоматический конвейер медиаданных — фоновый серверный пайплайн: исходные снимки пережимаются в компактные форматы WebP и AVIF, вес страницы падает в 4–5 раз, а визуальная эстетика одежды не страдает. Статические файлы, шрифты и фотографии вынесли ближе к покупателям на геораспределённую сеть кэширующих серверов (CDN).

Бизнес-результат: скорость загрузки страниц каталога сократилась с 3,8 до 1,2 секунды. Резко снизился процент отказов среди мобильного трафика. Все технические работы провели на работающем магазине, без остановки продаж.

Проверка перед распродажей

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

Дальше — деньги и данные. Как работает резервирование остатков: внедрено ли быстрое бронирование с таймером, чтобы не продать один и тот же акционный товар нескольким клиентам одновременно? Как поведёт себя синхронизация с 1С — переведён ли обмен на передачу небольших порций изменений через очередь, чтобы дневная выгрузка не тормозила витрину? И финальная пара про репетицию и запасной план. Проведены ли сквозные нагрузочные испытания, при которых сайт проверяется под нагрузкой, превышающей расчётную в 2–3 раза, по реальному сценарию оформления покупки? И знает ли команда, какие тяжёлые функции — рекомендации, виджеты — можно отключить в один клик и отдать мощности серверов оформлению заказов?

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

вопросы

Что спрашивают до старта

Коротко: вопросы, которые задают до первого разговора. Детали — выше в разборе отрасли.

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

Кейс отрасли

живой проект · кейс ↔ отрасль

nascent.ru
Кейс

nascent.ru — магазин корейской одежды

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

редизайнинфраструктураразработка
Разбор

Услуги для этой отрасли

Обсудим задачу

Опишите задачу, вернёмся с планом этапа и вилкой сроков.

Обсудить проект

Заявка занимает пару минут. Отвечаем в течение рабочего дня.