Контекст: 9 миллионов карточек, пик в Чёрную пятницу
«Маркетлайн» — большой маркетплейс электроники и быта. Основной формат страницы — карточка товара со сложной шапкой, отзывами, рекомендациями и галереей. До миграции среднее время отдачи такой карточки составляло 820 мс по 50‑му перцентилю и 2100 мс по 95‑му. На пике BFCM прошлого года 95‑й перцентиль уходил за 4.5 секунды, и команда наблюдала прямую корреляцию с падением конверсии в добавление в корзину.
Предыдущий CDN‑провайдер (зарубежный, с edge‑узлами в Хельсинки и Стокгольме) с осени 2023 года стал нестабильным для российских клиентов. Команда искала российскую альтернативу — с понятным биллингом в рублях и подходящей моделью кэширования для товарной выдачи.
Что мы сделали
1. Перевели статику и картинки на edge
Перевод занял один день. Сменили CNAME у поддомена static.marketline.ru и подняли отдельный поддомен img.marketline.ru для динамической оптимизации картинок. На img‑поддомене включили AVIF/WebP «на лету» с ресайзом по URL‑параметру:
https://img.marketline.ru/p/8421-toaster.jpg?w=480&q=78&fmt=avif
В шаблонах товарной карточки и листинга это выглядит как один атрибут srcset. Никаких npm‑пакетов, никакого пересжатия исходников.
«Мы не верили, что переключение займёт меньше дня. Внутри маркетплейса вызвали скепсис: предыдущий CDN мы переезжали 6 недель. Здесь — буквально один CNAME и плагин для админки.»
2. Кэш карточек на 5 минут с tag‑инвалидацией
Самое сложное было с самими карточками: html генерируется бэкендом, и в нём есть динамические блоки (наличие, цена с учётом промокода пользователя, рекомендации). Мы разделили рендер на две части: скелет карточки (заголовок, описание, основная галерея, спецификации) — кэшируется на 5 минут с тегами вида product:{id}, category:{cat_id}; и персональные блоки — подгружаются на клиенте через отдельные fetch‑запросы с короткими TTL.
Инвалидация настроена так: при изменении цены или наличия товара бэкенд дёргает POST /v1/cache/purge с тегом конкретного продукта. Среднее время от изменения в БД до пропадания старого html на всех 32 узлах — 410 мс.
3. Бот‑защита и rate‑limit
До перехода на 3TP Cachly у «Маркетлайна» был отдельный подрядчик по WAF и анти‑парсингу. После анализа логов мы увидели, что 14% трафика — это парсеры конкурентов и SEO‑краулеры, которые забирают ровно карточки товаров. На едином сервисе бот‑защиту включили правилом:
{
"name": "anti-scraping",
"match": { "path": "/product/*" },
"rate_limit": { "rpm": 60, "by": "ip" },
"challenge": { "score_below": 30, "action": "js" }
}
Это снизило исходящий трафик с edge на 18%. Не потому что меньше пользователей — а потому что меньше парсеров.
Результаты на 14‑й день
- TTFB: p50 — 820 → 320 мс (−61%), p95 — 2100 → 760 мс (−64%)
- LCP по реальным пользователям: 2.4 с → 1.5 с
- Cache hit ratio на карточках: 0% (раньше не кэшировались) → 91%
- Конверсия в добавление в корзину: +9.4% относительно AA‑группы (статистически значимо)
- Стоимость трафика: −34% при росте показов на 12%
Что не получилось сразу
Первая попытка кэшировать листинг категорий с фасетным фильтром привела к взрывному росту количества уникальных URL: каждое сочетание фильтров — новый ключ. За сутки набралось 1.8 млн вариантов, и реальный hit‑ratio был всего 22%. Решили нормализовать URL: фильтры по ценам округляем до диапазонов, малозначимые фильтры исключаем из ключа кэша. После этого hit‑ratio стал 68%.
Со стримингом видео на карточках товаров временно отложили — он у нас идёт через отдельную инфраструктуру. На горизонте 6 месяцев тоже планируем перевести.
Команда и сроки
Над миграцией с нашей стороны работали два инженера по производительности и платформенный архитектор. От 3TP Cachly — один solutions‑инженер, который сидел с нами в общем Telegram‑канале. Общая длительность от первого письма до полного перевода прод‑трафика — 11 рабочих дней, включая выходные на котрольных запусках.
Чёрная пятница в этом году у нас впервые прошла без алертов от мониторинга и без созыва команды реагирования. Уже только за это переход себя окупил.