У нас есть веб-служба ( Служба приложений 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 для настройки / настройки / адаптации для нашего варианта использования ..?