#std748¶
Таймауты при работе с внешними ресурсами¶
1.¶
При работе с внешними ресурсами через объекты WSОпределения, WSПрокси, HTTPСоединение, FTPСоединение, ИнтернетПочтовыйПрофиль обязательно задавайте таймаут, то есть предельное время ожидания операции.
Иначе программа может зависнуть, а часть функциональности станет недоступной.
Таймаут защищает от внешних проблем:
- нестабильного интернет-соединения;
- влияния антивирусов и неверных настроек брандмауэра;
- неверной настройки прокси-сервера;
- нестабильной работы веб-сервера под нагрузкой или из-за ошибок скриптов.
Например, если удаленная сторона не отвечает (выключена, на обслуживании, есть временная неисправность), ожидание ответа может быть бесконечным. При интерактивном вызове это выглядит как «зависание» приложения. При вызове из регламентного задания недоступным может стать связанный функционал.
2.¶
Время операции с внешним ресурсом обычно состоит из шести этапов:
DNS Lookup- определение IP по доменному имени;Connect- установка соединения с сервером;Send- отправка данных;Wait- ожидание обработки на стороне сервера;Receive- получение ответа;Cache Read- получение данных от веб-сервера.
Таймаут должен покрывать все этапы. Если операция не успела завершиться в заданный срок, соединение разрывается.
Выбирайте таймаут по ожидаемой длительности операции:
- для быстрых операций (например, проверка доступности сервера) задавайте небольшой таймаут;
- в общем случае не выбирайте таймаут более 3 минут, чтобы не создавать эффект «зависания» при недоступности удаленной стороны;
- для длительных передач больших объемов данных (этапы
Send/Cache Read) задавайте увеличенный таймаут, но не более 12 часов.
3.¶
Чтобы снизить таймауты и повысить отзывчивость, используйте рекомендации ниже.
3.1.¶
Для веб-сервисов с операциями дольше ~20 секунд рекомендуется:
- добавить контрольную операцию
Ping; - предварительно вызывать
Pingс малым таймаутом (например, 7 секунд); - основной прокси получать только после успешного
Ping.
Неправильно
Реализация модуля веб-сервиса PingPong:
Функция Pong(Знач Параметр)
Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Привет, %1'"), Параметр);
КонецФункции
Вызывающая сторона (без БСП):
Правильно
Реализация модуля веб-сервиса PingPong:
Функция Ping()
Возврат Истина; // Проверка связи
КонецФункции
Функция Pong(Знач Параметр)
Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Привет, %1'"), Параметр);
КонецФункции
Вызывающая сторона (без БСП):
Если используется БСП:
- для веб-сервисов применяйте
ОбщегоНазначения.WSПрокси(поддерживает контрольныйPing); - для HTTP(S)/FTP(S) применяйте подсистему «Получение файлов через Интернет».
Пример с БСП:
// Сделать контрольный вызов Ping и ждать не более минуты на дальнейших операциях.
PingPong = ОбщегоНазначения.WSПрокси(АдресВебСервиса, ..., 60, Истина);
// Сервис точно жив, далее работаем с ним.
Результат = PingPong.Pong(НСтр("ru = 'Мяч'"));
3.2.¶
Для невеб-сервисных ресурсов используйте аналоги Ping:
- для REST API - тестовая команда (обычно код 200 означает доступность);
- для FTP/WebDAV - тестовая загрузка (или отправка) файла-пустышки.
3.3.¶
Если веб-сервис объективно долго работает на этапе Wait и ускорить это нельзя, переводите взаимодействие в асинхронный режим:
- запускайте фоновое задание для «тяжелой» операции;
- добавляйте отдельные операции проверки готовности и получения результата.
Неправильно
Реализация модуля веб-сервиса Long:
Вызывающая сторона:
Правильно
Реализация модуля веб-сервиса Long:
Функция StartDoLong()
// запуск фонового задания
ИдентификаторОперации = ...
// возвращаем идентификатор операции для отслеживания ее готовности
Возврат ИдентификаторОперации;
КонецФункции
Функция IsReady(Знач ИдентификаторОперации)
// проверяем, завершено ли фоновое задание
Готовность = ...
Возврат Готовность;
КонецФункции
Функция GetData(Знач ИдентификаторОперации)
Результат = <получаем уже готовый результат по переданному идентификатору>;
Возврат Результат;
КонецФункции
Вызывающая сторона:
Код вызывающей стороны также должен быть асинхронным: через регламентное задание или периодический обработчик ожидания на клиенте.
4.¶
Рекомендуемые значения таймаутов:
| Операция | Таймаут (секунд) |
|---|---|
| Получение описания веб-сервиса | 7 |
| Проверка корректности адреса, работа с менеджером сервиса в модели сервиса, другие быстрые операции | 10-20 |
| Получение сведений по одному контрагенту, обмен сообщениями, отправка SMS, удаленное администрирование ИБ в модели сервиса | 60-120 (1) |
| Передача сообщений обмена через веб-сервис или получение файла до 1 Мб | 120-180 (1) |
| Загрузка файлов более 1 Мб | Если известен размер файла: размер_в_Мб * 128 (2); иначе предельное время загрузки, но не более 43200 (3) |
(1) Вызывать после контрольной операции Ping.
(2) 1 Мб при скорости 64 кбит/с загружается примерно 128 секунд; в ряде сценариев сотовые операторы ограничивают скорость до этого уровня.
(3) 43200 секунд (12 часов) - компромисс: в нештатной ситуации процесс «отвиснет» и вернет управление, а не зависнет бесконечно.
Проверки¶
#bslls:TimeoutsInExternalResources