Обогащение каталога

Обработка больших каталогов: ночное окно и инкрементальность

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

Филимонов Иван3 мин чтения
Огромный склад с рядами стеллажей и жёлтыми коробками
Фото: Adrian Sulyok / Unsplash

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

Во что упирается время

Не в модель и не в процессор. В получение данных.

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

Отсюда простая арифметика: сто тысяч страниц при разумной скорости обхода — это часы, а не минуты. Это не недостаток реализации, а свойство задачи.

Пачками, а не целиком

Обработка идёт порциями по несколько сотен карточек. Причины:

Память. Сто тысяч карточек с описаниями в памяти одновременно — способ уронить процесс.

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

Видимость. Виден счётчик обработанного — а не «идёт обработка» без признаков жизни на восемь часов.

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

Ночное окно

Обход собственного сайта в рабочее время конкурирует с покупателями. На большом каталоге это часы нагрузки — заметно.

Решение: окно, в котором идёт обработка. Практические требования к нему:

  • Часы задаёт владелец каталога, а не разработчик: у интернет-магазина и у оптовика разные часы затишья.
  • Окно может пересекать полночь — с 23:00 до 5:00 это нормальный случай, и обработка его должна понимать.
  • Не успели за ночь — встали на паузу, а следующей ночью продолжили с того же места.
  • Часовой пояс — ваш, а не серверный.

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

Инкрементальность

Каталог обновляется, а обрабатывать заново всё — расточительство: снова часы обхода, снова нагрузка на сайт, снова ожидание.

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

Как это устроено: от значимых полей карточки берётся короткий отпечаток содержимого. Совпал с сохранённым — товар пропускается. Не совпал — обрабатывается заново.

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

Приоритет по спросу

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

  1. Товары, которые ищут в поиске по сайту.
  2. Товары, попадающие в заявки клиентов.
  3. Всё остальное.

Тогда польза начинается с первой ночи, а не после завершения всей обработки.

Что должно пережить перезапуск

Сервер перезагружается, процесс падает, соединение обрывается. Требования:

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

Коротко

  • Время обработки большого каталога определяется скоростью получения данных, а не вычислениями.
  • Работа идёт пачками; прерванная пачка отбрасывается целиком, иначе часть карточек тихо пропускается.
  • Ночное окно задаёт владелец каталога, оно может пересекать полночь и продолжаться следующей ночью.
  • Инкрементальность по отпечатку содержимого превращает повторный проход из часов в минуты.
  • Приоритет по спросу даёт пользу с первой ночи, а не по завершении всей обработки.

Вопросы по теме статьи

Почему обработка большого каталога идёт долго?

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

Зачем нужно ночное окно?

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

Нужно ли обрабатывать каталог заново после обновления фида?

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

Обогащение карточек товаров: описания, характеристики и теги

ИИ исправляет названия, пишет описания и дополняет характеристики, вы принимаете правки в таблице. Цены, наличие и артикулы не трогаются. На выходе — готовый YML.

Читайте дальше