Вебформат

Главная/Как мы построили обмен с 1С/Технический разбор

Технический разборГлава 3 из 86 мин

Обработчик очереди: что и когда обрабатывать

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

Обработчик очереди
Обработчик очереди

Задача обработчика

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

Шаг 1. Что взять в работу
Планировщик
Каждые несколько секунд проверяет, есть ли работа в очереди
первая проверка: предыдущая обработка ещё идёт?
Да - выйти сразу
Две обработки одновременно невозможны
Нет - продолжить
Взять из журнала все выгрузки со статусом "ожидает обработки"
Очередь пуста - выйти до следующей проверки
отбор: каждая выгрузка в очереди проверяется
Получены не все части
Отложить до следующей проверки: половина выгрузки не обрабатывается никогда
Полный снимок, но пришёл более свежий
Пометить устаревшей: данные уже неактуальны
Обычное обновление или самый свежий снимок
В работу
отбор закончен
Отобранные выгрузки - на обработку
Как устроена сама обработка - шаг 2, схема ниже
Ни одна выгрузка не пропадает молча: отложенная ждёт свои недостающие части, устаревшая получает пометку в журнале, остальные уходят в обработку.

Правило первое: работает только один обработчик

Перед началом работы обработчик проверяет, не занят ли обмен предыдущим запуском. Если предыдущая обработка ещё идёт - новый запуск завершается сразу, ничего не делая.

Это исключает ситуацию, когда две программы одновременно правят одни и те же цены или остатки и мешают друг другу.

Правило второе: неполные выгрузки ждут

Если выгрузка состоит из нескольких частей и получены не все - она откладывается до следующей проверки. Каталог никогда не собирается из половины данных.

Правило третье: устаревшие снимки не обрабатываются

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

Обмен восстанавливает актуальные данные, не обрабатывая устаревшие
Сервис обработки был остановлен на сутки
За это время 1С прислала четыре полных прайс-листа: в 09:00, 13:00, 17:00 и 21:00
Каждый снимок - это четверть миллиона строк
сервис снова работает: что накопилось в очереди?
Снимки 09:00, 13:00 и 17:00
Помечаются устаревшими и не обрабатываются
Снимок 21:00
Самый свежий - только он идёт в работу
один проход вместо часов обработки
Цены на сайте снова актуальны
Наивная обработка потратила бы часы на заведомо устаревшие данные
Отбрасываются только полные снимки: каждый следующий заведомо содержит всё, что было в предыдущем. Обычные обновления - "изменились три товара", "изменились ещё два" - обрабатываются все по очереди.

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

Важно, что так отбрасываются только полные снимки. Обычные обновления - "изменились три товара", "пришла новая цена" - обрабатываются все до единого, ни одно не теряется.

Шаг 2. Как обрабатывается отобранная выгрузка
Отобранная выгрузка
Части собираются в единый файл
чтение потоком: расход памяти не зависит от размера файла
Сверка с данными сайта
Записываются только изменения - по коду из 1С, без дубликатов
ошибка в отдельной записи?
Записать в протокол и продолжить
Одна ошибочная строка не останавливает остальные тысячи
обработка дошла до конца?
Дошла
Отметка в журнале: "обработана", с замечаниями или без
Файлы уходят в архив
Прервалась: сбой, перезапуск сервера
Статус в журнале не менялся - выгрузка вернётся в работу через несколько секунд
Файлы обработанных выгрузок не удаляются, а уходят в архив - журнал хранит историю всех выгрузок за всё время работы обмена.

Правило четвёртое: одна ошибка не останавливает выгрузку

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

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

Правило пятое: отметка о завершении ставится только по факту

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

Повтор безопасен: записи привязаны к кодам из 1С, поэтому обработка просто доведёт дело до конца, не создав дубликатов.

Обзорная версия темы - статья про обмен целиком. Про сам проект - кейс B2B-платформы.

Нужен такой же обмен с вашей 1С?

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