Как работает веб-сервис 1С при одновременных запросах?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции систем часто возникает классический сценарий: внешнее приложение (например, интернет-магазин, мобильный клиент или сторонний микросервис) обращается к опубликованному веб-сервису 1С. Представим ситуацию, когда к методу СоздатьНоменклатуру одновременно обращаются десять вызывающих систем. Как поведет себя платформа 1С? Выделятся ли под это отдельные потоки, выстроятся ли запросы в очередь или система вернет ошибку перегрузки? Разберем подробно внутреннюю кухню работы веб-сервисов 1С:Предприятие.

Файловая база против клиент-серверной: принципиальная разница

Поведение системы при параллельных запросах напрямую зависит от варианта работы информационной базы:

  1. Файловый вариант работы. Здесь возможности параллельной работы крайне ограничены. Архитектура файловой СУБД 1С устроена так, что в один момент времени транзакцию на запись может выполнять только один сеанс. Если к веб-сервису файловой базы придет 10 одновременных запросов, они выстроятся в строгую очередь. Обработка будет выполняться последовательно, что неизбежно приведет к задержкам ответов (таймаутам) для тех клиентов, которые оказались в конце очереди.
  2. Клиент-серверный вариант работы. В серверной базе ситуация принципиально иная. Платформа способна обрабатывать запросы параллельно. На каждый вызов веб-сервиса поднимается отдельное соединение и сеанс в пределах установленных лимитов пула. По умолчанию размер этого пула составляет 10 штук. Если одновременно приходят 10 запросов, они распределяются по 10 параллельным сеансам и обрабатываются сервером 1С одновременно. Если же придет 11-й запрос, он будет ожидать освобождения любого из сеансов в очереди.

Для понимания того, как именно происходит это «параллельное чудо» без катастрофической потери производительности, нам необходимо разобраться в механизмах пулирования.

Различие между пулом соединений и пулом сеансов

Часто разработчики путают пул низкоуровневых соединений и пул сеансов 1С. Однако это два совершенно разных уровня абстракции:

Пул соединений (Connection Pool). Это физические соединения между модулем расширения веб-сервера (который установлен на Apache или IIS) и кластером серверов 1С (процессами rphost). Эти соединения удерживаются открытыми, чтобы не тратить время на установление сетевого контакта при каждом запросе.

Пул сеансов (Session Pool / Повторное использование сеансов). Это логические сеансы пользователей внутри самой 1С. Инициализация полноценного сеанса (запуск модуля управляемого приложения, чтение параметров сеанса, проверка прав) — крайне ресурсоемкая операция, занимающая от 1 до 3 секунд. Если бы на каждый HTTP- или веб-запрос создавался новый сеанс с нуля, высоконагруженная интеграция была бы невозможна.

Для решения этой проблемы в платформе реализован механизм Повторного использования сеансов (Session Reuse). Платформа держит в памяти «спящие» сеансы, которые уже прошли авторизацию и инициализацию. При поступлении запроса веб-сервер мгновенно «будит» готовый сеанс, передает ему управление для выполнения метода СоздатьНоменклатуру, забирает результат и отправляет сеанс обратно «спать» в пул.

Настройка пулов через файл default.vrd

Все параметры параллельной работы веб-сервисов настраиваются в файле публикации default.vrd, который находится в каталоге публикации на веб-сервере. Настройки пула сеансов имеют наивысший приоритет именно здесь.

Рассмотрим структуру описания параметров повторного использования сеансов в файле конфигурации публикации:


<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       base="/MyDatabase">
    <ws>
        <point name="ExchangeService"
               alias="exchange.1cws"
               reuseSessions="autouse"
               sessionMaxAge="20"
               poolSize="20"
               poolTimeout="5"/>
    </ws>
</point>

Разберем ключевые атрибуты этой настройки подробнее:

Лицензирование при параллельных запросах

Один из важнейших практических вопросов: сколько клиентских лицензий 1С расходуется при работе веб-сервисов? Здесь нужно разделять техническую сторону вопроса и юридическую политику лицензирования фирмы «1С».

Технический аспект. Если все вызовы веб-сервиса выполняются под одной системной учетной записью (например, WebIntegration), лицензии расходуются по принципу: один активный сеанс в пуле — одна лицензия. Если в пиковый момент времени для обработки параллельных запросов платформа задействовала 10 сеансов из пула, сервер 1С заберет из общего пула доступных лицензий ровно 10 штук. Когда нагрузка спадет и сеансы будут уничтожены по истечении времени sessionMaxAge, лицензии вернутся в общий пул.

Юридический аспект (Мультиплексирование). Согласно Лицензионному соглашению «1С», использование программных средств, уменьшающих количество пользователей, непосредственно обращающихся к серверу 1С (мультиплексоров), не уменьшает количество необходимых клиентских лицензий. Если 100 внешних пользователей работают с базой 1С через веб-сайт, который в свою очередь держит пул из 10 сеансов веб-сервиса, технически будет расходоваться 10 лицензий. Однако с юридической точки зрения у компании должно быть приобретено 100 клиентских лицензий по количеству фактически работающих людей/устройств.

Ограничения и стабильность веб-серверов при высокой нагрузке

Когда количество одновременных запросов исчисляется сотнями или тысячами, начинают проявляться «детские болезни» интеграционных модулей расширения веб-серверов:

Apache на Linux. При использовании Apache критически важно обратить внимание на режим работы MPM (Multi-Processing Module). Крайне не рекомендуется использовать стандартный модуль prefork, который создает под каждое подключение отдельный тяжелый процесс операционной системы. При высокой нагрузке это приводит к моментальному исчерпанию оперативной памяти и аварийному завершению рабочих процессов 1С. Рассмотрите перевод Apache на многопоточные режимы работы — worker или event.

IIS на Windows. Работает через ISAPI-расширение wsisapi.dll. Под высокой нагрузкой могут происходить зависания сеансов или падения рабочих процессов 1С (rphost). В этом случае потребуется тонкая настройка пула приложений IIS (DefaultAppPool): ограничение по использованию оперативной памяти, настройка интервалов автоматической перезагрузки рабочих процессов w3wp и лимитов на максимальное количество подключений.

Современная альтернатива: Автономный сервер 1С

Начиная с современных версий платформы 1С:Предприятие 8.3, разработчикам доступен инструмент под названием Автономный сервер 1С (ibsrv). Он позволяет публиковать HTTP- и веб-сервисы напрямую, полностью исключая из цепочки сторонние веб-серверы вроде Apache или IIS.

Вся конфигурация публикации в автономном сервере описывается в единственном конфигурационном файле publication.yaml (аналог default.vrd). Пример настройки пулов в нем выглядит следующим образом:


VirtualDirectory:
  Path: "/MyService"
  Pool:
    Size: 20
    WaitTimeout: 10

Автономный сервер работает значительно быстрее традиционной связки с Apache/IIS, гораздо стабильнее держит высокие параллельные нагрузки и идеально подходит для развертывания в Docker-контейнерах в рамках микросервисной архитектуры.

← На главную