При резком увеличении количества одновременных обращений к веб-сервисам 1С (от 100–300 параллельных запросов) система может начать аварийно завершать процессы веб-сервера или службы кластера 1С, отдавать ошибки таймаутов или зависать. Разберем по шагам, почему возникает эта проблема, как провести детальную диагностику и какие архитектурные и серверные настройки позволяют стабилизировать работу интеграций под высокой нагрузкой.
Проанализируем природу обработки вызовов в 1С. Каждый входящий синхронный SOAP- или HTTP-запрос занимает отдельный сеанс на сервере 1С на все время своего выполнения. Если вызов длится долго, пул сеансов лавинообразно разрастается, блокируя доступную память и потоки.
Выясним контрольные нормативы производительности для веб-сервисов:
rphost, взаимоблокировкам на уровне СУБД и падению веб-сервера по таймауту.Если специфика бизнес-логики не позволяет сократить время выполнения алгоритма до сотен миллисекунд (например, требуется расчет сложного отчета, проведение тяжелого документа или пакетная обработка данных), необходимо отказаться от ожидания результата в одном соединении. Разберем шаблон реализации асинхронного взаимодействия через фоновые задания:
ФоновыеЗадания.Выполнить() и мгновенно возвращает вызывающей стороне уникальный идентификатор задания (УникальныйИдентификатор). Длительность этого вызова составляет менее 50 миллисекунд.Посмотрим на пример организации запуска фонового задания внутри веб-сервиса:
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(ВходныеДанныеСтруктура);
ФоновоеЗадание = ФоновыеЗадания.Выполнить(
"ИнтеграцияСервер.ВыполнитьТяжелуюОбработку",
ПараметрыЗадания,
Строка(Новый УникальныйИдентификатор),
"Обработка входящего пакета веб-сервиса"
);
ИдентификаторЗадания = Строка(ФоновоеЗадание.УникальныйИдентификатор);
Возврат ИдентификаторЗадания;
Устаревшие версии платформы 1С (включая ветку 8.2 и ранние релизы 8.3) имеют жесткие ограничения по механизмам пулинга сеансов и распараллеливания сетевых соединений. Использование 32-разрядного веб-сервера накладывает ограничение на адресное пространство процесса (до 2–3 ГБ), которое быстро исчерпывается при разборе объемных XML-пакетов множеством потоков.
Для обеспечения стабильности выполним следующие шаги:
wsapache24.dll или wsisapi.dll) исключают падения процесса из-за нехватки виртуальной памяти при пиковых нагрузках.По умолчанию в Apache на платформе Windows модуль mpm_winnt может быть сконфигурирован на обработку малого числа одновременных потоков, из-за чего при 200–300 одновременных запросах новые подключения сбрасываются или ставятся в очередь, вызывая падение дочернего процесса httpd.exe.
Откроем конфигурационный файл httpd.conf (или httpd-mpm.conf) и скорректируем параметры многопоточности:
mpm_winnt_module: зададим директивы ThreadsPerChild 500 и ThreadLimit 500.KeepAliveTimeout до 1–2 секунд либо отключим KeepAlive Off, чтобы завершенные соединения не удерживали выделенные потоки веб-сервера.В файле публикации веб-сервиса default.vrd настроим параметры пула соединений, чтобы контролировать создание сеансов и не перегружать кластер 1С лавиной подключений.
Разберем ключевые параметры секции service и пула соединений:
autouse, что позволит платформе автоматически повторно использовать свободные сеансы между разными вызовами одного и того же сервиса.Под высокой нагрузкой один процесс rphost может стать узким местом из-за внутренней синхронизации потоков при транзакциях и парсинге данных. Настроим параметры кластера через консоль администрирования 1С:
rphost (настройка параметров «Количество информационных баз на рабочий процесс» или «Количество соединений на рабочий процесс»).Если веб-сервисы продолжают падать, определим точное место сбоя с помощью Технологического журнала 1С. Для этого настроим сбор событий в файле logcfg.xml:
EXCP и EXCPCNTX — фиксируют все исключительные ситуации и аварийные завершения с указанием контекста кода.CALL — позволяют замерить точную длительность серверных вызовов и выделить самые медленные методы.VRS — протоколируют входящие обращения к веб-сервисам и точкам публикации.APPCRASH выяснить, какой именно бинарный модуль упал: httpd.exe, библиотека адаптера wsapache.dll или рабочий процесс rphost.exe.