предыстория и цели
Я часто сталкиваюсь с проблемой исключения, когда время ожидания вызова интерфейса истекло.Раньше я пытался изменить настройку времени ожидания кода клиента, кода сервера и прокси-сервера (например, nginx), не определяя причину тайм-аут Иногда проблема может быть решена случайно, но иногда это оставляет риск не лечить симптомы. Цель этой статьи - дать систематические предложения по решению проблемы тайм-аута и попытаться объективно проанализировать различные причины тайм-аута, но есть также субъективные факторы и неполнота. Приветствуются разные точки зрения.
тип тайм-аута
-
тайм-аут клиента
Отправить запрос через XMLHttpRequest
- Настройки тайм-аута:developer.Mozilla.org/en-US/docs/…
- Отправить запрос через axios (вызов XMLHttpRequest)
- Настройки тайм-аута:GitHub.com/ax iOS/ax iOS…
- Феномен клиента: если время ожидания установлено на 1000 мс и исключение не перехвачено, консоль Chrome сообщает о следующей ошибке.Превышение времени ожидания сообщения об ошибке в 1000 мс выдается XMLHttpRequest.
-
Время ожидания серверного шлюза или прокси-сервера (например, nginx) истекло.
- концепция:developer.Mozilla.org/en-US/docs/…
- Феномен клиента: тайм-аут шлюза 504
Решение: правильно настройте время ожидания шлюза или прокси-сервера.
Конфигурация тайм-аута nginx:woohoo.scale scale.com/tips/Nginx/…
-
Время передачи истекло
Концепция: клиент взаимодействует с сервером не только через шлюз сервера (такой как nginx), но и через маршрутизатор оператора, шлюз и др. Настройка тайм-аута приведет к сбою вызова интерфейса из-за тайм-аута канала передачи.
-
Феномен на стороне клиента: при вызове через axios, когда исключение не перехвачено, консоль хрома сообщает о следующей ошибке
XMLHttpRequest выдает сообщение об ошибке Network Error, конкретная причина — ERR_EMPTY_RESPONSE. - Разбивка тайм-аута канала передачи
- физ тайм-аут
- нат концепция:NAT(преобразование сетевых адресов) помогает замедлить исчерпание доступного пространства IP-адресов за счет использования небольшого количества общедоступных IP-адресов для представления большего количества частных IP-адресов.
- тайм-аут nat объяснил:О долгосрочном соединении TCP, NAT Timeout, пакет сердцебиения
-
время ожидания сервера
настройка тайм-аута koa (потому что я больше знаком с фреймом koa, где только первая иллюстрация koa)
- Способ 1, вызовите server.setTimeout:GitHub.com/ Кейн ах / Кейн ах / я ...
- Феномен клиента: консоль Chrome сообщает о следующей ошибке, когда исключение вызывается через axios, и исключение не перехватываетсяИнформация об ошибке такая же, как и время ожидания канала передачи, поэтому этот метод устанавливает время ожидания только на стороне клиента и не может видеть основную причину, а стороне сервера необходимо сотрудничать с журналом для проверки.
- Способ 2, используйте промежуточное ПО koa для возврата408 код состояния, на клиенте хорошо видно, что ошибка интерфейса вызвана таймаутом сервера
- Образец кода:GitHub.com/мы можем закончить или P/…
Практические советы
- клиент
- Настройка тайм-аута: когда сервер установил тайм-аут, по-прежнему необходимо установить тайм-аут клиента (XMLHttpRequest и axios не установлены по умолчанию) и дать пользователю разумный запрос после тайм-аута. Потому что тайм-аут канала передачи будет запущен, когда запрос не достигнет сервера.Время ожидания обычно очень велико.Если клиент не установит время ожидания, он будет находиться в ожидании в течение длительного времени.
- Обработка исключений: помимо обработки бизнес-ошибок и ошибок времени ожидания клиента, клиент также должен фиксировать ошибки, вызванные временем ожидания связи и временем ожидания сервера, и предоставлять пользователям разумные подсказки об ошибках.
- Сервер
- Параметр тайм-аута: его необходимо установить, когда производительность и стабильность чувствительны, чтобы соединение, которое не отвечало в течение длительного времени, можно было закрыть при необходимости, а ресурсы были освобождены для ответа на новые запросы. Более того, чтобы различать тайм-аут ссылки и тайм-аут сервера на стороне клиента, стороне сервера необходимо вернутьКод состояния 408
- Транспортная ссылка: тайм-аут транспортной ссылкиНе могу контролировать, нельзя полностью избежать
- Структура интерфейса. Таким образом, даже если тайм-ауты клиента и сервера не установлены, время ожидания интерфейса истечет, потому что истечет время канала передачи. Поэтому, если интерфейс занимает много времени, необходимо рассмотреть асинхронное решение, и оно должно выполняться более 1 минуты.Асинхронная схема, конкретные схемы включают в себя http-опрос и веб-сокет и т. д. Для выбора схемы и подробностей см.:docs.Microsoft.com/en-US/azure…