Я размещаю asp.net web api
в лазурном веб-приложении. Приложение размещено на двух параллельных экземплярах веб-приложений Azure.
Однако в последнее время наши пиковые запросы увеличились, и мы начали видеть следующую ошибку в наших журналах:
System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full
На нашем веб-сервере мы отправляем множество коротких HTTP-запросов на дополнительные серверы, используя HttpClinet
. Из моего исследования приведенного выше кода ошибки видно, что в базовой ОС исчерпаны «пользовательские» TCP-порты. Сначала я подумал, что это какая-то ошибка в библиотеке HttpClient
.net. Однако мы попробовали экземпляр static
HttpClient
, а также метод using dispose
. Ни один не решить нашу проблему. Помогает только то, что мы вручную перезапускаем веб-приложение каждый час, что, безусловно, не является долгосрочным решением.
Я не могу запустить netstat в веб-приложении Azure, чтобы посмотреть, что происходит с сокетами.
Число запросов, которые мы делаем, составляет примерно 100 000 в день. Это не должно перегружать одну машину, не говоря уже о двух. Так что, должно быть, что-то не так.
Как мы можем решить эту проблему?
У меня есть несколько вопросов:
- Работает ли httpclient на работу, а это тысячи запросов на публикацию http?
- В любом случае можно ли заставить
HttpClient
использовать http2
, когда он будет выполнять несколько запросов в одном сокете tcp.
- Какие еще технологические опции есть? По сути, мы хотим отправить объект json с одного сервера на другой и вернуть объект json в ответ. Будет ли работать что-то вроде
azure service
, где у него будет несколько сокетов, и он будет выдавать много запросов через эти сокеты?