Ленивая модель
Сервис строит описание данных (модель EDM) не целиком, а по мере обращений:- Первый запрос сеанса строит только индекс «имя набора → объект метаданных». Служебный документ строится по этому индексу.
- Описание набора строится при первом обращении к нему и остаётся в памяти сеанса. Навигации и
$expandдостраивают нужные наборы. $metadataстроится во временной полной копии, после чего в сеансе остаётся только готовый документ.
Кэш $metadata между сеансами
Флажок **«Хранить metadata`
хранятся в базе по ключу, в который входят:
- состав публикации;
- настройки;
- профиль;
- набор доступных пользователю объектов;
- отпечаток среды: платформа, конфигурация, расширения.
$metadata нового сеанса строится за ~0,55 с вместо ~2,7 с.
Проверка изменений конфигурации:
- Полная (по умолчанию) обходит метаданные (около 0,3 с на новый сеанс) и замечает любое изменение.
- По номеру версии быстрее, но изменение конфигурации без смены номера версии сервис увидит только после перезапуска веб-сервера или сброса кэша: снимите и снова поставьте флажок кэша.
Страницы или одним ответом
Настройка «Выдача коллекций» (вкладка «Движки»):- Страницами (по умолчанию) — по 1000 строк со ссылкой
@odata.nextLinkна продолжение, как требует OData v4. - Одним ответом — весь результат в одном ответе, как у
standard.odata. Сервер читает набор порциями (размер порции — 5000 строк по умолчанию, для широких строк меньше) и пишет их в поток ответа.
- клиент прислал
Prefer: odata.maxpagesize; - запрос продолжает выдачу по
$skiptoken; - это операция
$batch; - у профиля задан лимит страницы.
Замеры
База со 100 тыс. документов (1 млн строк табличной части), 100 тыс. элементов справочника и около 1 млн записей в каждом регистре. Файловая база, веб-сервер Apache на той же машине, выдача JSON — компонентой.
Цифры по отдельным запросам:
Ответ OData4 компактнее. Например, записи регистра накопления занимают 1,5 ГБ против 3,3 ГБ у
standard.odata.
Пик памяти Apache при ответах «одним ответом» на 1,5–3,5 ГБ — 1,4–1,7 ГБ: тело ответа не держится в памяти процесса
целиком.
Многостраничный обход больших регистров дороже из-за стоимости каждой страницы, около 0,45 с на запрос с
продолжением. Выход — режим «Одним ответом» или страницы крупнее:
Prefer: odata.maxpagesize=5000 дал 145 с
против 147 с у standard.odata.Советы клиентам
- Выбирайте только нужные поля через
$select. Документы с тремя полями отдаются в десятки раз быстрее, чем целиком с табличными частями. - Фильтруйте на сервере через
$filter, а не после загрузки. - Укрупняйте страницы заголовком
Prefer: odata.maxpagesize=5000, если клиент обходит много страниц. - Не раскрывайте лишнего:
$expand=*на документе может дать сотни соединений в запросе. Число раскрытий ограничено лимитами. - Агрегируйте на сервере через
$applyи виртуальные таблицы, а не выгрузкой всех записей.
Память рабочего процесса веб-сервера
Пик памяти при построении$metadata на большой конфигурации — ориентировочно 180–300 МБ. Веб-модуль 1С не
возвращает память операционной системе до завершения рабочего процесса. Сеанс живёт до 20 секунд простоя, а процесс
httpd/w3wp остаётся, поэтому при большом пуле сеансов и частых $metadata в новых сеансах процесс может расти.
Рекомендации:
- держите
poolSizeвdefault.vrdсоразмерным числу одновременных клиентов; - оставьте
reuseSessions="autouse", чтобы запросы попадали в уже построенный сеанс; - не публикуйте лишние объекты: состав задаёт размер индекса и
$metadata; - перезапускайте рабочий процесс веб-сервера по расписанию или по достижении предела памяти.