HttpClient DocumentClient, что происходит с разными потоками.Azure Functons - PullRequest
0 голосов
/ 28 июня 2019

Я прочитал в статье о HttpClient / DocumentClient, что лучше всего создать синглтон для приложений и внедрить его в объект, чтобы не допустить исчерпания базовых ресурсов в результате продолжения создания. Как это работает?Если к HttpClient обращаются различные потоки и делают одновременные вызовы, возможно, на разные конечные точки, я не могу понять, как это может работать.

Я с интересом прочитал это

   https://medium.com/@nuno.caneco/c-httpclient-should-not-be-disposed-or-should-it-45d2a8f568bc

.Если у меня есть функция Azure, использующая DocumentClient, вызывающий cosmosDb, как мне использовать DocumentClient?Это должен быть статический экземпляр?

Моя функция Azure настроена следующим образом.Я предполагаю, что новый экземпляр DocmentClient создается с каждым запросом, что при высокой нагрузке может вызвать проблемы с ресурсами.

[FunctionName("MyGetFunc")]
    public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
    [CosmosDB("ct","ops", ConnectionStringSetting ="cosmosConn")] 
    DocumentClient docClient,
    ILogger log)

    //use docClient here...
    {

Ответы [ 4 ]

2 голосов
/ 28 июня 2019

Если вы используете .NET Core, см. Также Использование HttpClientFactory для реализации устойчивых HTTP-запросов .

HttpClient предназначен для создания одного экземпляра и повторного использования в течение всего срока действия приложения.Создание класса HttpClient для каждого запроса приведет к исчерпанию количества розеток, доступных при больших нагрузках.Эта проблема приведет к SocketException ошибкам.Возможные подходы к решению этой проблемы основаны на создании HttpClient объекта как одноэлементного или статического, как описано в этой статье Microsoft об использовании HttpClient .

Но есть вторая проблема сHttpClient, который вы можете иметь, когда используете его как одиночный или статический объект.В этом случае одноэлементный или статический HttpClient не учитывает изменения DNS, как объясняется в этом выпуске на репозитории .NET Core GitHub repo .

Для устранения указанных проблем и управленияиз HttpClient экземпляров проще, в .NET Core 2.1 появился новый HttpClientFactory, который также можно использовать для реализации устойчивых HTTP-вызовов путем интеграции с ним Polly.

2 голосов
/ 28 июня 2019

Для части DocumentClient вашего вопроса смотрите здесь: https://docs.microsoft.com/en-us/sandbox/functions-recipes/cosmos-db?tabs=csharp#customize-a-documentclient-and-reuse-it-between-executions

Они говорят о различных сценариях.Так что да, если у вас много вызовов функций, я бы использовал один статический экземпляр - который также является поточно-ориентированным.

private static DocumentClient client = GetCustomClient();
private static DocumentClient GetCustomClient()
{
    DocumentClient customClient = new DocumentClient(
        new Uri(ConfigurationManager.AppSettings["CosmosDBAccountEndpoint"]), 
        ConfigurationManager.AppSettings["CosmosDBAccountKey"],
        new ConnectionPolicy
        {
            ConnectionMode = ConnectionMode.Direct,
            ConnectionProtocol = Protocol.Tcp,
            // Customize retry options for Throttled requests
            RetryOptions = new RetryOptions()
            {
                MaxRetryAttemptsOnThrottledRequests = 10,
                MaxRetryWaitTimeInSeconds = 30
            }
        });

    // Customize PreferredLocations
    customClient.ConnectionPolicy.PreferredLocations.Add(LocationNames.CentralUS);
    customClient.ConnectionPolicy.PreferredLocations.Add(LocationNames.NorthEurope);

    return customClient;
}

[FunctionName("CosmosDbSample")]
public static async Task<HttpResponseMessage> Run(
2 голосов
/ 28 июня 2019

Если к HttpClient обращаются различные потоки и делают одновременные вызовы, возможно, к различным конечным точкам, я не вижу, как это может работать.

Почему?HttpClient является поточно-ориентированным, что означает, что его можно использовать из нескольких одновременно работающих потоков.

Безопасно ли использовать HttpClient одновременно?

0 голосов
/ 28 июня 2019
[CosmosDB("ct","ops", ConnectionStringSetting ="cosmosConn")] 
    DocumentClient docClient,

То есть используется Связывание Cosmos DB .Привязка не создает несколько экземпляров DocumentClient, она создает один и повторно использует его во всех исполнениях .

Вы можете проверить исходный код здесь: https://github.com/Azure/azure-webjobs-sdk-extensions/blob/dev/src/WebJobs.Extensions.CosmosDB/Bindings/CosmosDBClientBuilder.cs.

Он вызывает GetService и получает экземпляр DocumentClient для этой конкретной строки подключения, если он уже был создан в предыдущем выполнении.

Аналогично поддержанию вашего собственного статического / Lazy DocumentClient (см. https://docs.microsoft.com/en-us/azure/azure-functions/manage-connections#documentclient-code-example-c).

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