Частое HttpRequestException при общении с Cosmos DB из Web App - PullRequest
0 голосов
/ 08 мая 2018

У нас есть веб-служба ( Служба приложений Azure ), развернутая в Azure, которая взаимодействует с нашей Azure Cosmos DB через стандартный C # SDK для Cosmos DB / Document DB.

Обе - служба приложений и учетная запись / коллекции Cosmos DB - находятся в одной и той же группе ресурсов и в одном и том же месте в Azure.

Для некоторых массовых операций, когда веб-служба выполняет пакет запросов к базе данных Cosmos, мы часто получаем ошибки в веб-службе при обращении к базе данных:

System.AggregateException: One or more errors occurred. --->    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 attempt was made to access a socket in a way forbidden by its access permissions
at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.InternalBind(EndPoint localEP)
at System.Net.Sockets.Socket.BeginConnectEx(EndPoint remoteEP, Boolean flowContext, AsyncCallback callback, Object state)
at System.Net.Sockets.Socket.UnsafeBeginConnect(EndPoint remoteEP, AsyncCallback callback, Object state)
at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
 --- End of inner exception stack trace ---

[...]

at Microsoft.Azure.Documents.Query.ProxyDocumentQueryExecutionContext.<ExecuteNextAsync>d__0.MoveNext()<---

Каждый из наших ApiController экземпляров статически выделяет один класс репозитория, который, в свою очередь, извлекает экземпляр IReliableReadWriteDocumentClient в своем конструкторе и удерживает его в течение всего времени жизни с помощью

  IDocumentDbInitializer dbinit = new DocumentDbInitializer();
  Client = dbinit.GetClient(endpointUrl, myAuthKey, connectionPolicy);

Таким образом, в моем понимании, мы должны использовать только 2 клиента Document DB для наших 2 репозиториев во всем веб-сервисе.

То, что мы уже пробовали:

  • Отрегулируйте запросы на клиенте во время массовой операции до уровня менее 3 / с
  • уменьшить количество клиентов ConnectionPolicy.MaxConnectionLimit со значения по умолчанию (50) до 20
  • увеличить приложения ServicePointManager.DefaultConnectionLimit

Ни одна из этих мер не позволила значительно сократить число исключений, которые мы испытываем.

Есть предложения, как избежать этой ошибки?
Дополнительные функции Cosmos DB SDK для настройки / настройки / адаптации для нашего варианта использования ..?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...