Ошибка внутреннего сервера прокси-сервера функций Azure 500 из SocketException

Aug 21 2020

У меня есть функция Azure, которая использует прокси и перенаправляет на другую функцию Azure в качестве серверной части. Существует конечная точка / api / ping, которая принимает GET. Когда я отправляю HTTP-GET на команду ping, я иногда получаю внутреннюю ошибку сервера 500, из-за которой произошел сбой, когда я вижу только запрос на прокси-сервере, но не вижу запроса на функции выполнения внутреннего кода.

Я добавил заголовок «Proxy-Trace-Enabled» для «true» в заголовок, чтобы отслеживать результаты. У меня есть результаты в моей папке D: \ home \ LogFiles \ Application \ Proxies \ DetailTrace. Там журнал неудавшегося запроса содержит объект json "Backend" со следующим

{
    "source": "forward-request",
    "timestamp": "2020-08-20T15:42:20.8272145Z",
    "elapsed": "00:00:00.0061051",
    "data": {
      "messages": [
        "Only one usage of each socket address (protocol/network address/port) is normally permitted Only one usage of each socket address (protocol/network address/port) is normally permitted",
        "Only one usage of each socket address (protocol/network address/port) is normally permitted",
        "Only one usage of each socket address (protocol/network address/port) is normally permitted"
      ]
    }
  }

Я считаю, что это Azure Functions 1.0 в DotNet, но он был создан очень давно. Почему мой простой прокси-сервер функций Azure выдает мне внутренние ошибки сервера, которые не перенаправляются на мой внутренний код для выполнения?

Для справки о том, как отслеживать запросы

Ответы

JustinNeff Sep 09 2020 at 00:17

Для планов службы приложений функций Azure существуют пороги TCP-подключения, которые коррелируют с подключениями через сокеты. Документация была в блоге, на который я ссылаюсь. Был подобный вопрос об исчерпании возможностей TCP / порта, в котором используется аналогичная корреляция между проблемами . Хотя сообщаемое исключение отличается, ошибки исчезают в моем тестировании при масштабировании службы приложения, в которой оно включено.

Пример: у меня есть 2 функции Azure: FunctionA и FunctionB. FunctionA является прокси-сервером и не выполняет серверную часть для плана службы приложений P1. FunctionB не является коррелированной функцией, но выполняется в том же плане службы приложений P1.

FunctionA в рамках плана службы приложений P1 выдает ошибки с внутренними ошибками сервера 500 при вызове. Сообщается как сбой в App Insights и отслеживается в журналах серверной части как исключение сокета.

Я воссоздал функцию Azure, FunctionA, в плане службы приложений P3. FunctionA не получила 500 внутренних ошибок сервера. Однако он не требует масштабов плана выплат P3. Поэтому я переместил его обратно на P1. Снова произошли ошибки сервера.

FunctionB находился в том же плане службы приложений, что и FunctionA (P1). Показатели мониторинга Azure составили 4200 SocketOutboundAll в минуту. Я переместил (удалил и воссоздал) FunctionB с P1 на P3. Я сохранил FunctionA на P1. Ошибки SocketOutboundAll были устранены из FunctionA на P1. Функции в плане обслуживания приложений P3 также не сообщают об исключениях.