Каталог на тысячу позиций обрабатывается за минуты, и никаких особых решений не требует. На ста тысячах меняется всё: обработка идёт часами, упирается не в вычисления, а в источники данных, и должна пережить перезапуск сервера.
Во что упирается время
Не в модель и не в процессор. В получение данных.
Чтобы дополнить характеристики, нужно прочитать страницу товара. Страница отдаётся за десятые доли секунды, и ускорить это нельзя — можно только читать несколько страниц одновременно. Но и здесь есть предел: обход в полную силу создаёт на сайте нагрузку, сравнимую с наплывом посетителей.
Отсюда простая арифметика: сто тысяч страниц при разумной скорости обхода — это часы, а не минуты. Это не недостаток реализации, а свойство задачи.
Пачками, а не целиком
Обработка идёт порциями по несколько сотен карточек. Причины:
Память. Сто тысяч карточек с описаниями в памяти одновременно — способ уронить процесс.
Прогресс. Результат по обработанной пачке сохраняется сразу. Прерывание не отменяет сделанное.
Видимость. Виден счётчик обработанного — а не «идёт обработка» без признаков жизни на восемь часов.
Ключевое требование к пачкам — атомарность. Прерванная на середине пачка должна отбрасываться целиком, а не сохраняться наполовину. Иначе указатель уйдёт вперёд, а часть карточек останется необработанной — и это самая неприятная из возможных ошибок, потому что она тихая.
Ночное окно
Обход собственного сайта в рабочее время конкурирует с покупателями. На большом каталоге это часы нагрузки — заметно.
Решение: окно, в котором идёт обработка. Практические требования к нему:
- Часы задаёт владелец каталога, а не разработчик: у интернет-магазина и у оптовика разные часы затишья.
- Окно может пересекать полночь — с 23:00 до 5:00 это нормальный случай, и обработка его должна понимать.
- Не успели за ночь — встали на паузу, а следующей ночью продолжили с того же места.
- Часовой пояс — ваш, а не серверный.
Последний пункт кажется мелочью ровно до момента, когда обработка начинается в три часа дня.
Инкрементальность
Каталог обновляется, а обрабатывать заново всё — расточительство: снова часы обхода, снова нагрузка на сайт, снова ожидание.
Правильное поведение: система запоминает, в каком виде товар уже обрабатывался, и при следующем запуске берёт только изменившиеся карточки.
Как это устроено: от значимых полей карточки берётся короткий отпечаток содержимого. Совпал с сохранённым — товар пропускается. Не совпал — обрабатывается заново.
Эффект на практике: после первого полного прохода последующие занимают минуты, потому что между выгрузками меняется небольшая часть каталога.
Приоритет по спросу
Если каталог обрабатывается несколько ночей, порядок имеет значение. Разумно начинать с того, что нужнее:
- Товары, которые ищут в поиске по сайту.
- Товары, попадающие в заявки клиентов.
- Всё остальное.
Тогда польза начинается с первой ночи, а не после завершения всей обработки.
Что должно пережить перезапуск
Сервер перезагружается, процесс падает, соединение обрывается. Требования:
- Указатель обработки сохраняется и указывает только на действительно завершённые пачки.
- Задача возобновляется сама, без ручного перезапуска.
- Повторная обработка не создаёт дублей предложений.
- Прогресс не идёт назад — счётчик, откатившийся на треть, пугает сильнее, чем ошибка.
Коротко
- Время обработки большого каталога определяется скоростью получения данных, а не вычислениями.
- Работа идёт пачками; прерванная пачка отбрасывается целиком, иначе часть карточек тихо пропускается.
- Ночное окно задаёт владелец каталога, оно может пересекать полночь и продолжаться следующей ночью.
- Инкрементальность по отпечатку содержимого превращает повторный проход из часов в минуты.
- Приоритет по спросу даёт пользу с первой ночи, а не по завершении всей обработки.


