К содержимому
MoranaLabs
Маркетплейс / E-commerce — 28 мая 2026 г.

Рекомендательный ранкинг на 1,2 млн запросов в секунду 

На 1,2 миллиона запросов в секунду главный вопрос — не какая модель точнее, а как не звать модель на каждый запрос. Ранжирование разложили на два уровня и получили 8 мс на девяносто девятом перцентиле при росте конверсии витрины на 11%.

1,2 млн RPS
пиковый ранкинг витрины
8 мс
p99 latency
+11 %
к конверсии витрины
стенд · запускается здесь

Стенд: хвост под нагрузкой

Одна реплика ранкера из парка. Прибавляйте запросы: до загрузки 0,7 не происходит ничего, после 0,9 хвост уходит в потолок. Средняя задержка при этом почти не меняется.

обслужено 0 запросов · в очереди сейчас 0теория Эрланга: ожидание 0,01 мс
32 потоков ранкера · обработка 4,6 мс на запрос ранкинга
архитектура

Тот же ответ, втрое дороже по времени. На малой нагрузке разницы не видно — она вся в хвосте и в том, сколько реплик придется держать.

0,0 мс
медиана: то, что видит большинство
0,0 мс
p99 при бюджете 8 мс
69 %
загрузка воркеров
0
отброшено: очередь 256 мест заполнена
Загрузка 69 % — здоровый режим. Хвост держится в 0,0 раза от медианы, и это почти целиком разброс самой обработки, а не очередь. Поднимайте поток и следите за p99: он тронется заметно раньше медианы.

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

Миллион запросов в секунду ломает привычную схему

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

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

Два уровня вместо одного

Работа разделена на дешевую и дорогую части.

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

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

Признаки расходятся, и это самая дорогая ошибка

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

Модель при этом не падает. Она просто работает хуже, чем на тестах, и никто не понимает почему.

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

Деградация вместо отказа

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

  1. Полная схема: отбор кандидатов плюс ранжирование моделью.
  2. При росте задержки — сокращение числа кандидатов на ранжирование.
  3. Дальше — упрощенная модель ранжирования.
  4. В крайнем случае — предрассчитанная выдача по категории.

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

Плюс 11% — как это измерялось

Не сравнением «до и после»: на маркетплейсе неделя на неделю не приходится, и любое сравнение периодов ловит сезонность, промо и погоду. Прирост конверсии витрины измерен A/B-тестом на трафике, с контрольной группой, работающей на прежней схеме, и с проверкой значимости.

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

Холодный старт и свежие товары

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

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

Кеш решает больше, чем кажется

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

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

Что стоит спросить у подрядчика такой системы

  • Какой бюджет задержки у вашего ранжирования и что происходит при его превышении.
  • Где определяются признаки и как гарантируется, что обучение и бой считают их одинаково.
  • Как измеряется эффект — A/B или сравнение периодов.
  • Что показывает витрина, когда модель недоступна.
  • Как обновляется модель и сколько времени занимает откат на предыдущую версию.

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

Направления рядом — рекомендательные системы, эксплуатация ML и потоковые ML-системы.

1,2 млн RPS
пиковый ранкинг в реальном времени
  • High-load
  • recommendation
  • ranking
  • feature store
  • inference opt
заказчик

Маркетплейс / E-commerce · детали под NDA

СтендПроверить расчет руками ↑

Те же цифры, но с ручками: порог, нагрузка, объем.

НаправлениеРекомендательные системы

Что мы делаем в этом направлении и сколько это стоит.

Комментарий инженера

Модель на тестах давала прирост, в бою — ничего. Две недели искали баг в ранжировании, а нашли расхождение в одном признаке: при обучении окно агрегации считалось по календарным суткам, а в бою — по скользящему окну. Разница в описании — одна строчка, разница в поведении модели — весь эффект. После этого мы завели правило: признак живет в одном определении, и распределения в бою сравниваются с обучающими автоматически, каждый день.
инженер ML-платформы · MoranaLabs
Другие кейсы
— заявка

Опишите задачу  ответим как инженеры. 

Оставьте имя и Telegram — остальное обсудим. Без брифов на 40 слайдов и звонков по три раза.

Отвечаем за пару часовотвечает инженер, а не отдел продажNDA до передачи данных

Любой один канал — куда удобнее, туда и ответим

Или сразу написать в Telegram

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