Многие разработчики сталкиваются с проблемой, когда первое обращение к web-сервису 1С происходит крайне медленно (от нескольких секунд до минуты), в то время как последующие запросы выполняются практически мгновенно. Однако стоит сделать паузу в работе, как проблема возвращается. В этой статье мы подробно разберем причины возникновения «холодного старта» и рассмотрим методы борьбы с этой задержкой, включая настройку пула соединений, кэширование метаданных и тонкую настройку веб-сервера.
Прежде чем переходить к настройкам, давайте выясним причину такого поведения системы. Когда клиентское приложение обращается к web-сервису, происходит несколько ресурсоемких операций:
WSПрокси, платформа каждый раз обращается к серверу за XML-файлом с описанием функций.УстановкаПараметровСеанса и инициализируются глобальные модули конфигурации.Последующие вызовы проходят быстро, так как соединение уже «прогрето» и находится в пуле. Но как только время жизни соединения истекает, оно удаляется, и следующий пользователь снова сталкивается с ожиданием.
Основным инструментом управления жизненным циклом подключений является файл default.vrd, который создается при публикации базы. Проанализируем ключевые атрибуты, которые помогут нам удерживать соединения «горячими».
По умолчанию параметры пула могут быть не оптимальны для систем с редкими запросами. Нам необходимо отредактировать секцию <pool>. Рассмотрим основные параметры:
Пример настройки в файле 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="/MyBase"
ib="Srvr=Server1C;Ref=MyBase;">
<ws>
<pool maxAge="3600" poolSize="10" poolTimeout="5"/>
</ws>
</point>
Посмотрим на ситуацию со стороны клиента. Если вы используете программное создание прокси-класса через URL, 1С вынуждена скачивать описание сервиса при каждом запуске кода. Проанализируем два способа оптимизации:
1. Использование WS-ссылок в метаданных. Это самый эффективный способ для 1С 8.2 и 8.3. Мы импортируем WSDL-описание непосредственно в конфигурацию в раздел Общие -> WS-ссылки. В этом случае платформа берет описание структуры из своих метаданных, не тратя время на сетевой запрос к серверу.
2. Использование локального файла WSDL. Если вы не можете изменить конфигурацию, сохраните WSDL-файл на диск и обращайтесь к нему локально. Разберем пример кода:
// Вместо URL используем путь к файлу
ПутьКФайлуWSDL = "C:\WebServices\MyService.wsdl";
Определение = Новый WSОпределения(ПутьКФайлуWSDL, ИмяПользователя, Пароль);
Прокси = Новый WSПрокси(Определение, URIПространстваИмен, ИмяСервиса, ИмяТочкиПодключения);
Зачастую задержка вызвана тем, что сам веб-сервер «засыпает». Выясним, как настроить IIS (Internet Information Services) для постоянной готовности.
В диспетчере IIS необходимо найти пул приложений (Application Pool), на котором опубликована база 1С, и изменить следующие настройки:
AlwaysRunning. Это гарантирует, что процесс будет запущен сразу после старта сервера, не дожидаясь первого пользователя.Проанализируем то, что происходит внутри 1С в момент подключения. При создании внешнего соединения (которым является web-сервис) срабатывает событие УстановкаПараметровСеанса. Если в этой процедуре прописаны тяжелые запросы, обращение к справочникам или расчеты, это напрямую влияет на скорость отклика сервиса.
Рекомендуется использовать проверку режима запуска, чтобы исключить выполнение лишнего кода для web-сервисов:
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
Если ПараметрыСеанса.ТекущийПользователь.Пустая() Тогда
// Облегченная инициализация для внешних соединений
Если ПроверитьРежимРаботыСеанса() Тогда
Возврат;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция ПроверитьРежимРаботыСеанса()
// Логика определения, является ли сеанс внешним/веб-сервисом
Возврат СеансИнформационнойБазы.ПолучитьТекущийСеанс().ИмяПриложения = "WebClient"
ИЛИ СеансИнформационнойБазы.ПолучитьТекущийСеанс().ИмяПриложения = "COMConnection";
КонецФункции
Рассмотрим еще один важный аспект — сетевые задержки и авторизация. Если используется Windows-авторизация (NTLM), первый пакет запроса всегда получает отказ 401, после чего начинается многоступенчатый обмен ключами. Это может добавлять до 1-2 секунд к каждому «холодному» вызову.
Попробуйте переключиться на Basic-авторизацию (при условии использования HTTPS для безопасности), так как она передает учетные данные сразу в первом заголовке. Также стоит проверить DNS-разрешение: если обращение идет по имени сервера, попробуйте указать IP-адрес, чтобы исключить задержки на стороне DNS-сервера.
Если вышеуказанные настройки не помогают в полной мере (особенно на старых версиях платформы 8.2), можно применить метод принудительного удержания сеанса. Создадим регламентное задание внутри 1С или простое внешнее приложение, которое раз в 5-10 минут будет выполнять простейший запрос к web-сервису (например, функцию Ping(), которая просто возвращает Истина). Это позволит удерживать рабочие процессы сервера 1С и пул соединений веб-сервера в активном состоянии, полностью исключая эффект долгого первого подключения.