Сеть, таймауты и повторы
Что модуль делает, когда сервис отвечает плохо или не отвечает вовсе.
Таймауты
Соединение — 10 секунд. Чтение ответа: до 170 секунд для перевода и 8 секунд для запроса баланса.
170 секунд — это потолок, а не фиксированное значение. Каждой порции даётся остаток общего бюджета вызова, но не меньше 20 секунд.
Иерархия бюджетов
| Уровень | Предел |
|---|---|
| Повторы внутри вызова | 60 с в интерактиве, 175 с в фоне |
| Серверный скрипт эндпоинта | 180 с |
| Браузер | около 200 с |
Порядок здесь не случайный: рвать соединение должен клиент, а не сервер посреди записи. Если бы серверный предел был меньше клиентского, обрыв приходился бы на момент, когда часть перевода уже записана, а часть нет.
Повторы
Повторяются статусы 0, 408, 429, 500, 502, 503, 504.
Пауза растёт экспоненциально: 500 миллисекунд, потом вдвое, и так до 8000
миллисекунд, с разбросом в двадцать процентов. Разброс нужен, чтобы десяток параллельных
прогонов не пошёл на повтор одновременно. Для 429 учитывается заголовок с
указанием, когда можно повторить.
Два профиля:
| Профиль | Когда | Попыток | Бюджет |
|---|---|---|---|
| Интерактив | карточка элемента, редактор на сайте, список | 2 | 90 с |
| Фон | массовый прогон, словарь | 4 | 150 с |
Разница понятна: человек у экрана ждать не будет, фоновому заданию спешить некуда.
Каждый повтор пишется в журнал событий.
Почему 500 и 504 стали повторяемыми
Раньше не повторялись, и по уважительной причине: сервер мог выполнить перевод, списать деньги и потерять ответ. Повтор означал бы второе списание за ту же работу.
Теперь у запроса есть ключ, вычисленный из его содержимого. Повтор с тем же телом получает готовый ответ из кеша сервиса — не переводя заново и не списывая повторно. Поэтому оба статуса добавлены в список повторяемых.
Размер порции
Ограничения приходят с сервиса вместе с балансом и запоминаются в настройках. У Яндекса пачка 15 текстов, у Gemini — 120.
Модуль срезает их своим потолком: 40 текстов и 20 000 знаков. Цель — чтобы порция уходила одним запросом. Несколько запросов делят общий бюджет вызова, и при его исчерпании шаг повторяется целиком: уже переведённое достаётся из кеша сервиса бесплатно, но время на обращения тратится впустую.
Потолок поднимается настройками, см. Настройки модуля.
Что видно при сетевом сбое
Сообщение называет, что связи нет, но не называет адрес сервиса и подробности транспорта. Вместе они отвечали бы на вопрос «доступен ли такой-то хост с этого сервера», а ответ на него — не то, что стоит отдавать по запросу.
Подробности идут в журнал событий Битрикса, тип TRANSLATE_SAAS_NETWORK, и
в самом сообщении сказано, где их смотреть. Для разбора этого достаточно:
в журнале видно и адрес, и код, и какой запрос его вызвал.
Если связь рвётся на тяжёлом HTML
Модуль сам уменьшает пачку вдвое и повторяет тот же шаг. Уменьшать её руками обычно не требуется.