Нагрузка на базу данных и скорость обмена
Ниже будет описан общий принцип работы модуля с точки зрения его нагрузки на БД и методы по снижению нагрузки.
Основная нагрузка модуля приходится на работ его основных агентов обмена:
  • Остатки (общий агент на остатки товаров, модификаций и комплектов)
  • Цены (отдельный агент для каждой сущности)
  • Сущности: товары \ модификации \ услуги \ комплекты
  • Группы (разделы)
Итого в модуле может работать до 10 агентов, которые так или иначе работают с БД.
Рассмотрим каждый агент по отдельности, его нагрузку и как ее можно снизить для конкретного агента.

Обмен остатками

Остатки обмениваются по следующей схеме:
  • Сначала считываются все записи по остаткам для конкретного товара \ модификации
  • В HL таблицы кеша идет запись этих данных, но записываются только те данные, которые изменились
  • Сразу после записи кеша, модуль выгружает остатки на сайт. Аналогично записываются только обновленные данные.
К примеру у вас стоит настройка обмена остатков каждые 60 секунд по 1000 позиций.
В этом случае максимальная нагрузка будет следующая: каждый шаг агента будет считывать 1000 позиций из МС (это не несет нагрузку на БД) и пытаться обновить 1000 строк в таблице кеша. Алгоритм будет следующий:
  • Считать 1000 позиций из таблицы кеша
  • Сравнить каждую позицию на предмет обновления данных об остатках
  • Записать только измененные данные в кеш
  • Считать все товары, участвующие в этом шаге
  • Записать в них измененные данные об остатках (при этом будут считаны все 1000 позиций из Битрикса для проверки).
Здесь нагрузку можно снизить только увеличением частотой вызова агента и лимитом выборки остатков за шаг. К примеру поставить по 200 позиций за 60 секунд. Или 500 позиций раз в 120 секунд.

Обмен ценами

Обмен ценами происходит без участия таблиц кеша. Агенты на обмен цен устанавливаются на каждую сущность по отдельности, поэтому здесь можно регулировать нагрузку на конкретную сущность.
Общий алгоритм при обмене 1000 позиций цен будет следующий:
  • Считать 1000 товаров из МойСклад
  • Найти каждый товар и считать все его цены
  • Записать только измененные или новые цены
В таком случае основная нагрузка опять же ложиться на чтение БД. Однако у цен есть одна дополнительная опция: "Учитывать дату изменения сущности в МойСклад".
Поскольку цены хранятся непосредственно в товаре МойСклад, то при изменении самого товара, можно гарантированно говорить о том, что цены товара актуальные на момент изменения. Следовательно можно использовать для снижения нагрузки на БД.
Логика этой опции следующая: если стоит галочка и в параметре "Интервал" указано целое число, то модуль изначально будет учитывать дату изменения цен перед выборкой.
Конкретный пример: вы обмениваете также 1000 позиций раз в 60 секунд, при этом вы поставили галочку учета даты изменения сущности. Модуль будет работать так:
  • Считать 1000 товаров, которые были изменены за последние N часов (N - интервал). Пусть будет так: считать 1000 товаров, которые изменились за последние 3 часа
  • Ответ от МойСклад скорее всего придет уже не 1000 товаров, а к примеру 20 товаров, потому что за последние 3 часа изменились только 20 товаров (не важно что у них изменилось, важно что изменилась дата обновления товара в МойСклад).
  • Далее модуль будет работать с теми 20-ю товарами, которые пришли ему ответом от МойСклад, соответственно нагрузка будет уменьшена в разы.
  • В следующий шаг (через минуту) модуль скорее всего вообще получит пустой ответ от МойСклад, таким образом не создав нагрузки на БД вообще.

Обмен товарами \ модификациями \ услугами \ комплектами

Этот агент работает аналогично агенту цен - он считывает напрямую из МойСклад определенную выборку товара и не использует кеш, однако при работе этого агента нагрузка на БД увеличивается из-за записи данных в разные таблицы сайта, например:
  • Название товара в таблицу инфоблока
  • Свойства сайта в таблицу свойств
  • Вес товара в таблицу товаров и т.д.
В этом агенте действуют те же правила, что и для обмена цен. Если нужно снизить нагрузку на работу агента, то можно установить галочку учета даты изменения товаров и тогда модуль будет обрабатывать только измененные товары.
Включать эту галочку следует после первого полного импорта товаров \ цен.