-10%Переходите к нам от другого подрядчика — дадим скидку на первый этап работ

Обновление цен и остатков по API в каталоге

Обновление цен и остатков по API в каталоге 1С-Битрикс: очередь сообщений, воркеры и пакетная запись без блокировок

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

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

Коротко

  • Не пишите каждое изменение в базу синхронно — принимайте его в очередь, а в каталог записывайте отдельным воркером.
  • Обновляйте пакетами в короткой транзакции: сотни строк за один проход вместо сотни отдельных запросов.
  • Снабжайте сообщения версией/меткой времени — воркер применяет только свежие данные и идемпотентен к повторам.
  • Инвалидируйте кэш точечно по тегам затронутых товаров, а не сбрасывайте весь каталог на каждое изменение остатка.
  • Меряйте лаг очереди, скорость записи и число дедлоков — без метрик «часто обновлять» превращается в «часто ронять».

Зачем обновлять цены и остатки часто

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

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

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

Что именно мы обновляем и где это лежит

Прежде чем строить обмен, нужно чётко понимать, какие сущности мы трогаем и в каких таблицах Битрикса они живут. «Цена» и «остаток» на витрине — это на самом деле несколько связанных объектов, и путаница между ними — источник половины ошибок интеграции.

Что обновляемГде хранится в 1С-БитриксНюансы
Цена товараМодуль «Торговый каталог», таблица цен (тип цены + товар + валюта)Цен может быть несколько типов: розница, опт, для B2B-клиентов. Обновлять нужно нужный тип.
Складской остатокМодуль «Торговый каталог», количество товара; при многоскладности — остатки по складамЕсть общий доступный остаток и остатки в разрезе складов, их нельзя смешивать.
Доступность / наличиеРасчётное поле на основе остатка и настроек «показывать при нуле»Флаг «в наличии» часто пересчитывается автоматически и его не нужно писать напрямую.
Цены торговых предложений (SKU)Те же таблицы цен, но для элементов инфоблока предложенийУ модели-родителя своей цены обычно нет — она на конкретных SKU.
РезервыМодуль «Интернет-магазин» (sale), резервирование под заказыДоступный остаток = физический минус резерв; важно, чтобы источник и сайт считали одинаково.

Ключевой вывод из этой таблицы: обновление остатка — это не «записать число в поле товара». Это согласование физического остатка, резервов и правил отображения. Поэтому в интеграции всегда договариваются заранее: что считается «доступным остатком», кто владеет резервами (сайт или учётная система) и по какому типу цены идёт обновление. Если этого не сделать, витрина и склад будут показывать разные цифры даже при технически исправном обмене.

Архитектура: источник, очередь, приёмник

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

Смысл разделения в том, что источник не ждёт, пока данные лягут в каталог. Он «выстреливает» изменением и освобождается, а тяжёлую работу по записи делает воркер в удобном ему темпе. Если поток данных вырос — очередь просто временно удлиняется, а не создаёт пиковую нагрузку на витрину. Если воркер упал — сообщения ждут в очереди и обработаются после перезапуска, ничего не теряется.

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

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

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

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

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

Конкурентные блокировки. Когда несколько параллельных запросов пишут в одни и те же таблицы цен и остатков, СУБД вынуждена сериализовать доступ через блокировки строк. Запросы встают в очередь ожидания, растёт время отклика, а в худшем случае возникают взаимные блокировки (дедлоки), которые база разрывает откатом транзакций.

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

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

Вывод простой: прямая синхронная запись плохо масштабируется по частоте. Она приемлема для редких единичных правок, но как только речь заходит о «часто» — её нужно менять на буферизацию через очередь и пакетную запись. Именно это разрывает вредную связку «больше обновлений → медленнее каталог».

Очереди и воркеры: развязываем приём и запись

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

Что именно даёт такая развязка:

Очередь может быть реализована по-разному. Самый простой вариант — таблица в той же базе, куда приёмник вставляет строки, а воркер их вычитывает и помечает обработанными. Более зрелый — внешний брокер сообщений, который берёт на себя доставку, подтверждения и повторы. Для большинства магазинов на старте достаточно таблицы-очереди с запуском воркера по агенту или cron; к брокеру переходят, когда поток данных и требования к отказоустойчивости вырастают.

Цикл воркера очереди Очередь SKU-1 · qty 5 SKU-2 · price SKU-3 · qty 0 SKU-4 · price Пачка N=500 собрать и дедуплицировать Одна транзакция запись в каталог commit Ack удалить
Схема: воркер собирает сообщения в пачку, дедуплицирует повторы, пишет всё одной транзакцией и только затем подтверждает обработку.

Пакетная запись вместо поштучной

Пакетирование — главный рычаг производительности при частых обновлениях. Разница между «сто отдельных запросов» и «один запрос на сто строк» — не косметическая, а в разы, потому что фиксированные накладные расходы (открытие транзакции, планирование запроса, сброс кэша, вызовы событий) платятся один раз на всю пачку, а не на каждую позицию.

Практические принципы пакетной записи:

  1. Собирайте пачку разумного размера. Ориентир — от 200 до 1000 позиций за проход. Слишком маленькая пачка не даёт выигрыша, слишком большая — держит блокировки дольше и рискует упереться в лимиты транзакции.
  2. Дедуплицируйте внутри пачки. Если в одной пачке пришло три изменения остатка по одному SKU, применяйте только последнее по версии. Это экономит записи и предотвращает лишние срабатывания событий.
  3. Разделяйте цены и остатки. Обновление цен и остатков затрагивает разные таблицы. Иногда выгоднее вести две пачки-потока, чтобы блокировки по ценам не пересекались с блокировками по количеству.
  4. Пишите в короткой транзакции. Внутри транзакции — только запись данных. Тяжёлые побочные действия (пересчёт, уведомления) выносите за её пределы, чтобы не удерживать блокировки дольше необходимого.
  5. Управляйте событиями осознанно. Массовые обработчики событий на изменение товара при пакетной записи могут кратно замедлять обмен. Часть из них имеет смысл отключать на время пакета и запускать отложенно.
Важно: отключая обработчики событий ради скорости пакета, вы берёте на себя ответственность за то, что они делали. Если событие обновляло поисковый индекс или тегированный кэш, эти действия нужно выполнить явно после пачки — иначе витрина покажет старые данные.

Идемпотентность и порядок сообщений

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

Защита строится на двух механизмах.

Идемпотентность. Обработка одного и того же сообщения дважды должна давать тот же результат, что и однократная. Достигается это тем, что воркер записывает не «прибавить/убавить», а «установить значение как в сообщении», и помечает уже применённые сообщения по уникальному идентификатору. Повторная доставка тогда либо игнорируется, либо перезаписывает данные тем же значением — без вреда.

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

Проблема очередиЧто произойдёт без защитыРешение
Повторная доставкаДвойное применение измененияИдемпотентность по ID сообщения
Перестановка порядкаСвежий остаток затирается старымВерсия/метка времени, применяем только более новое
Частичный сбой пачкиЧасть данных записана, часть нетТранзакция: либо вся пачка, либо ничего
Сообщение на неизвестный товарОшибка или бесконечные повторыDead-letter очередь для ручного разбора

Отдельно про сопоставление товаров. Внешняя система знает товар по своему ключу — артикулу или коду номенклатуры. В Битриксе стабильным «мостом» служит внешний код элемента (XML_ID) или артикул. Никогда не сопоставляйте по названию или по внутреннему ID Битрикса, который источнику неизвестен: первое ломается при малейшем изменении названия, второе создаёт хрупкую зависимость. Один стабильный внешний ключ — основа надёжного обновления.

Блокировки, дедлоки и как их избежать

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

Взаимная блокировка (дедлок) возникает, когда две транзакции ждут ресурсы, захваченные друг другом: транзакция A держит строку товара 1 и хочет товар 2, а транзакция B держит товар 2 и хочет товар 1. База обнаруживает тупик и откатывает одну из транзакций с ошибкой. При частом параллельном обмене это не редкость, если не соблюдать дисциплину доступа.

Как снизить вероятность блокировок и дедлоков:

Без порядка → дедлок С общим порядком → ок Транз. A Транз. B Товар 1 Товар 2 взаимное ожидание Транз. A Транз. B Товар 1 Товар 2 оба берут в порядке 1→2
Схема: если все транзакции захватывают строки в одном и том же порядке (по ключу товара), взаимная блокировка становится невозможной.

Реализация в 1С-Битрикс

Перейдём от принципов к конкретике платформы. За цены и остатки в 1С-Битрикс отвечают модули «Торговый каталог» (catalog) и «Интернет-магазин» (sale). Работать с ними можно на трёх уровнях, и для частого обновления важно выбрать правильный.

Рабочая связка для частого обновления выглядит так: внешний источник шлёт изменения на REST-эндпоинт или напрямую в таблицу-очередь; агент или демон-воркер на стороне Битрикса читает очередь пачками и пишет данные серверным API D7 в короткой транзакции; после пачки воркер точечно сбрасывает тегированный кэш затронутых товаров. Полный обмен с 1С при этом остаётся для номенклатуры, свойств и картинок, а «горячие» цены и остатки идут быстрым API-каналом.

  1. Определите ключ сопоставления. Зафиксируйте, что XML_ID или артикул — единый мост между источником и Битриксом, и что он не меняется при обновлениях.
  2. Поднимите приём в очередь. REST-эндпоинт или обработчик, который валидирует сообщение, кладёт его в таблицу-очередь с версией и сразу отвечает «принято».
  3. Напишите воркер. Агент/демон, забирающий пачку сообщений, дедуплицирующий их по SKU, применяющий только свежие версии и пишущий цены/остатки серверным API в одной транзакции.
  4. Настройте цены по типам. Убедитесь, что обновление идёт в нужный тип цены (розница, опт, B2B) и в правильной валюте; не перезаписывайте чужие типы цен.
  5. Согласуйте склады и резервы. Договоритесь, кто владелец резервов, и пишите доступный остаток единообразно с учётом многоскладности.
  6. Добавьте точечную инвалидацию кэша. После пачки сбрасывайте тегированный кэш только затронутых элементов и разделов, а не весь каталог.
  7. Включите dead-letter и логи. Сообщения на неизвестные товары и ошибки записи отправляйте в отдельную очередь с сохранением тела и причины.

Как это выглядит в админке и логах

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

Обмен цен и остатков · состояние В очереди 1 240 Лаг обработки 38 с Скорость записи 640/с Воркер активен последняя пачка 500 позиций · дедлоков за час: 0 Перезапустить 12:04:07 batch#8821 ok 500 skip 12 (old ver) dead 1
Схема: панель показывает длину очереди, лаг обработки и скорость записи; в журнале видно, сколько сообщений применено, пропущено как устаревшие и ушло в dead-letter.

Такая панель снимает большинство вопросов «а обновляются ли остатки». Видно текущую длину очереди (сколько ещё не применено), лаг (насколько витрина отстаёт от источника прямо сейчас), скорость записи и наличие проблем. Если лаг растёт, а скорость упала — сигнал разбираться: воркер завис, база под нагрузкой или источник прислал аномальный объём.

Кэш и переиндексация после обновлений

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

В 1С-Битрикс каталог опирается на тегированный (управляемый) кэш: выборки и страницы помечаются тегами инфоблока и конкретных элементов. Когда меняется товар, сбрасываются только записи кэша с его тегами, а не весь кэш каталога. Это и есть ключ к совместимости частых обновлений и скорости: обновили остаток одного SKU — «протухли» только его карточка и разделы, где он выводится, всё остальное осталось тёплым.

Что важно учитывать по кэшу и индексам при частом обмене:

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

REST, серверный API и файловый обмен — сравнение

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

КритерийREST APIСерверный API (D7)Файловый обмен (CommerceML)
Где источникВнешний, по HTTPНа том же сервере / воркер1С по расписанию
Темп обновленияБлизко к реальному времениМаксимальный для записиПлановый, партиями
Накладные расходыВысокие на вызов (полный хит)Минимальные внутри процессаСредние, но редко
Пригодность для потокаКак приём в очередьИдеально для пакетной записиНе для точечного реального времени
Авторизация «из коробки»Да, вебхуки/OAuthНе требуется (внутри)Базовая, по протоколу
Типичная рольГраница системы, приёмникДвигатель записи в каталогПолная синхронизация номенклатуры

На практике эти каналы не конкурируют, а дополняют друг друга. Крупный магазин обычно комбинирует: CommerceML тянет из 1С номенклатуру, свойства и картинки по расписанию; REST принимает «горячие» изменения цен и остатков от учётной системы или складского сервиса в очередь; серверный API внутри воркера быстро пишет эти изменения в каталог пачками. Такой гибрид даёт и полноту данных, и близкую к реальному времени актуальность цен и остатков.

Если же вы обновляете каталог ещё и из плоских выгрузок — прайсов в Excel и CSV, — стоит выстроить единые правила сопоставления по артикулу, чтобы файловый импорт и API-обмен не конфликтовали. Об этом подробно — в материале про импорт каталога из Excel и CSV в 1С-Битрикс.

Дельта-обновления и вебхуки

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

Дельту можно организовать двумя путями:

У дельты есть важная оговорка: механизм рано или поздно рассинхронизируется — потерянное событие, сбой сети, перезапуск. Поэтому дельту всегда подстраховывают периодической полной сверкой: раз в сутки (или чаще для критичных категорий) сравнивают полный срез остатков источника и сайта, находят расхождения и выравнивают. Дельта даёт скорость в моменте, полная сверка — гарантию, что накопленный дрейф не превратится в системную ошибку.

Правило двух контуров: быстрый контур (дельта/вебхуки) держит актуальность в реальном времени, медленный контур (полная сверка по расписанию) ловит и чинит рассинхрон. Вместе они дают и скорость, и надёжность; по отдельности — либо тормоза, либо накапливающиеся ошибки.

Мониторинг, метрики и алерты

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

МетрикаЧто показываетТревожный сигнал
Длина очередиСколько изменений ещё не примененоРастёт и не убывает — воркер не справляется
Лаг обработкиНа сколько витрина отстаёт от источникаПревышает бизнес-порог (например, 5 минут)
Скорость записиПозиций в секундуРезко упала при той же нагрузке
Число дедлоков/ошибокСтабильность записиВсплеск откатов транзакций
Размер dead-letterСколько сообщений не удалось применитьПостоянный рост — проблема сопоставления
Расхождение при сверкеДрейф между источником и сайтомРастёт от сверки к сверке

На основе этих метрик настраивают алерты: уведомление в мессенджер или на почту, когда лаг или очередь превышают порог, когда воркер не подавал признаков жизни N минут или когда dead-letter внезапно распух. Дешёвый, но эффективный приём — «сигнал живости»: воркер после каждой пачки обновляет метку времени последней успешной обработки, а отдельная проверка бьёт тревогу, если метка устарела. Это ловит зависший обмен раньше, чем его заметят покупатели.

Частые ошибки

Мини-FAQ. Нужен ли брокер сообщений, чтобы «правильно» обновлять остатки? Нет. Для большинства магазинов достаточно таблицы-очереди и воркера по агенту/cron. Брокер оправдан при высоком потоке, нескольких потребителях и жёстких требованиях к отказоустойчивости — это следующий шаг, а не обязательное начало.

Чек-лист внедрения

Сведём всё в практический список, по которому удобно принимать готовность обмена цен и остатков перед запуском:

  1. Определён ключ сопоставления. Товары матчатся по стабильному артикулу или XML_ID, а не по названию или внутреннему ID.
  2. Приём развязан с записью. Источник кладёт изменения в очередь и не ждёт их применения в каталоге.
  3. Запись пакетная. Воркер пишет пачками в короткой транзакции, дедуплицируя изменения по SKU.
  4. Обеспечена идемпотентность. Повторная доставка не применяет изменение дважды, есть контроль версий/меток времени.
  5. Порядок записи стабилен. Позиции в пачке сортируются по ключу, есть ретраи на дедлок.
  6. Кэш инвалидируется точечно. После пачки сбрасываются теги затронутых товаров, а не весь каталог.
  7. Согласованы цены и склады. Обновляется нужный тип цены и валюта, доступный остаток считается единообразно с резервами.
  8. Есть два контура. Быстрый (дельта/вебхуки) держит актуальность, медленный (полная сверка) чинит рассинхрон.
  9. Настроен мониторинг. Отслеживаются длина очереди, лаг, скорость записи, дедлоки и dead-letter; есть алерты и «сигнал живости».
  10. Есть dead-letter. Сообщения на неизвестные товары и ошибки записи сохраняются для разбора, а не теряются и не крутятся вечно.

Вывод

Частое обновление цен и остатков по API — это не вопрос «сколько запросов выдержит сайт», а вопрос архитектуры. Разорвите связку «больше обновлений → медленнее каталог»: принимайте изменения в очередь, пишите их пакетами без длинных блокировок, делайте обработку идемпотентной и инвалидируйте кэш точечно. Тогда витрина покажет актуальные цены и наличие в реальном времени и при этом останется быстрой даже в разгар обмена. Добавьте два контура (дельта плюс полная сверка) и мониторинг с алертами — и обновление данных перестанет быть источником отменённых заказов и станет незаметной, надёжной частью каталога.

Частые вопросы

Как часто можно обновлять цены и остатки по API без вреда для каталога?

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

Почему при частом обновлении остатков сайт начинает тормозить?

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

Что лучше использовать: REST API Битрикса или прямой серверный API?

REST-модуль удобен, когда источник данных внешний и общается по HTTP: он даёт готовую авторизацию, вебхуки и документированные методы. Но каждый REST-вызов проходит полный цикл инициализации ядра, поэтому для больших объёмов дешевле принимать данные в очередь, а писать их в базу серверным API D7 (классы модулей catalog и sale) пакетами внутри одного процесса-воркера.

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

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

Как гарантировать, что остаток не «откатится» на старое значение при частых обновлениях?

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

Что делать, если внешняя система прислала обновление на несуществующий товар?

Такие сообщения нельзя молча терять и нельзя гонять по кругу бесконечно. Товар сопоставляют по стабильному внешнему ключу (артикул или XML_ID); если сопоставление не найдено, сообщение уходит в отдельную очередь «недоставленных» (dead-letter) с сохранением тела и причины. Оттуда его разбирают вручную или дообрабатывают после того, как товар появится в каталоге.

Поделиться:

Нужны актуальные цены и остатки без тормозов каталога?

Спроектируем и внедрим обновление цен и остатков по API и очередям: пакетная запись, идемпотентность, точечная инвалидация кэша и мониторинг. Свяжем каталог с 1С, складом и маркетплейсами. Рассчитаем стоимость по вашей задаче.

Услуга «Интеграции»

Редакция B2Bsite

Редакция студии B2Bsite. С 2014 года команда разрабатывает и поддерживает интернет-магазины и корпоративные сайты на 1С-Битрикс, настраивает каталоги, обмен с 1С и интеграции по API и очередям для среднего и крупного бизнеса.

← Все статьи блога