Интеграция 1С с внешними сервисами, мобильными клиентами и сайтами чаще всего строится на базе HTTP-сервисов и Web-сервисов. При возрастании нагрузки критически важным становится механизм работы пула сеансов. Разберем подробно, по каким разрезам платформа 1С разделяет сеансы в пуле, где задаются эти параметры, как включить повторное использование сессий и как это влияет на производительность.
Платформа 1С:Предприятие 8.3 поддерживает повторное использование сеансов для обслуживания входящих HTTP- и SOAP-запросов. Чтобы запрос был обработан уже существующим сеансом из пула (без затрат времени на полноценный старт сеанса), все ключевые параметры входящего подключения должны полностью совпадать. Разберем каждый разрез пула сеансов:
Web-сервисы (SOAP) или HTTP-сервисы (REST/JSON/XML). Сеанс, созданный для HTTP-сервиса, не может быть использован для вызова Web-сервиса, и наоборот.Имя ветки «Общие — HTTP-сервисы» или «Общие — Web-сервисы»). Для каждого конкретного сервиса создается свой изолированный пул.Проанализируем, где в конфигураторе и в файлах публикации на веб-сервере задаются указанные свойства:
Общие → HTTP-сервисы (или Web-сервисы). В свойствах сервиса указывается имя, корневой URL, а также параметр ПовторноеИспользованиеСеансов (значения Использовать / НеИспользовать / Авто).Администрирование → Публикация на веб-сервере. На вкладке Прочие настраиваются флаги Разделение данных и Безопасное.Рассмотрим пример тонкой настройки пула сеансов в файле default.vrd для конкретного HTTP-сервиса:
<httpService name="MobileAPI"
rootUrl="mobile"
enable="true"
reuseSessions="autouse"
sessionMaxAge="60"
poolSize="10"
poolTimeout="30"
waitTimeout="5"/>
Разберем назначение атрибутов управления пулом:
poolSize — максимальное количество параллельно удерживаемых сеансов в пуле для данного сервиса.poolTimeout — время жизни неактивного сеанса в пуле (в секундах). Если за это время новых вызовов не поступило, сеанс уничтожается и освобождает память.waitTimeout — предельное время ожидания освобождения сеанса из пула при пиковой нагрузке, когда все сеансы лимита poolSize заняты.Выясним, как работает обслуживание запросов при включенном повторном использовании сеансов:
GET или POST) и возвращает HTTP-ответ.Практика показывает, что повторное использование сеансов способно увеличить пропускную способность сервисов в разы: система может стабильно обрабатывать сотни коротких запросов в секунду при минимальной нагрузке на процессор сервера приложений.
При использовании пула сеансов необходимо учитывать важные технические особенности платформы:
ПриНачалеСеанса в модуле управляемого приложения или сеанса отрабатывает только один раз — при физическом создании соединения. Для каждого последующего входящего запроса этот обработчик повторно не вызывается. Поэтому инициализацию контекста и проверку входящих параметров необходимо выполнять непосредственно внутри метода HTTP-сервиса.При использовании стандартной Basic-аутентификации браузеры и многие HTTP-клиенты кэшируют заголовок Authorization до закрытия процесса или вкладки. Чтобы принудительно сбросить сессию на клиенте, можно применить следующие подходы:
401 Unauthorized и заголовком WWW-Authenticate: Basic realm="1C", что заставит браузер очистить сохраненные данные авторизации.Пример программной проверки авторизационного токена в методе HTTP-сервиса:
Функция ОбработатьЗапросGET(Запрос)
ЗаголовокАвторизации = Запрос.Заголовки.Получить("Authorization");
Если ЗаголовокАвторизации = Неопределено Или Не СтрНачинаетсяС(ЗаголовокАвторизации, "Bearer ") Тогда
Ответ = Новый HTTPСервисОтвет(401);
Ответ.УстановитьТелоИзСтроки("Требуется авторизация по токену");
Возврат Ответ;
КонецЕсли;
Токен = Сред(ЗаголовокАвторизации, 8);
Если Не ТокенАвторизацииДействителен(Токен) Тогда
Ответ = Новый HTTPСервисОтвет(403);
Ответ.УстановитьТелоИзСтроки("Токен недействителен или просрочен");
Возврат Ответ;
КонецЕсли;
// Выполнение бизнес-логики сервиса
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки("{""status"": ""success""}");
Возврат Ответ;
КонецФункции
При проектировании высоконагруженных API важно помнить о двух аспектах:
202 Accepted.