Управления подключениями в службе "Функции Azure"

Функции в ресурсах общего доступа приложений-функций. Среди этих общих ресурсов есть подключения: HTTP-подключения, подключения к базам данных, а также подключения к таким службам, как служба хранилища Azure. При параллельном выполнении многих функций в плане потребления можно остаться без доступных подключений. В этой статье объясняется, как следует правильно программировать свои функции, чтобы избежать использования большего количества подключений, чем это необходимо.

Примечание

Ограничения подключений, описанные в этой статье, применяются только при выполнении в Плане потребления. Однако описанные здесь методы могут быть полезными при выполнении в любом плане.

Ограничение числа подключений

Количество доступных подключений в плане потребления ограничено частично, поскольку приложение-функция в этом плане выполняется в изолированной среде. Одним из ограничений, которое песочница накладывает на код, является ограничение на количество исходящих подключений, которое в настоящее время составляет 600 активных (всего 1200) подключений на каждый экземпляр. При достижении этого ограничения во время выполнения функций в журналах записывается следующее сообщение: Host thresholds exceeded: Connections. Дополнительные сведения см. в статье Ограничения служб функций.

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

При устранении неполадок убедитесь в том, что вы включили Application Insights для приложения-функции. Application Insights позволяет просматривать метрики для приложений-функций, таких как выполнения. Дополнительные сведения см. в статье Просмотр данных телеметрии в Application Insights.

Статические клиенты

Чтобы избежать большего количества подключений, чем необходимо, повторно используйте экземпляры клиента, а не создавайте новые с каждым вызовом функции. Мы рекомендуем повторно использовать клиентские подключения для любого языка, на котором можно написать функцию. Например, клиенты .NET, такие как HttpClient, DocumentClient и служба хранилища Azure могут управлять соединениями при использовании одного статического клиента.

Ниже приведены некоторые рекомендации по использованию клиента конкретной службы в приложении "Функции Azure":

  • Не создавайте новый клиент при каждом вызове функции.
  • Создайте единый статический клиент, который может использоваться при каждом вызове функции.
  • Рассмотрите возможность создания одного статического клиента в общем вспомогательном классе, если различные функции используют одну службу.

Примеры кода клиента

В этом разделе даются рекомендации по созданию и использованию клиентов из вашего кода функции.

HTTP-запросы;

Ниже приведен пример кода функции C#, который создает статический экземпляр HttpClient.

// Create a single, static HttpClient
private static HttpClient httpClient = new HttpClient();

public static async Task Run(string input)
{
    var response = await httpClient.GetAsync("https://example.com");
    // Rest of function
}

С HttpClient в .NET часто возникает вопрос о необходимости удалять клиент. Как правило, объекты, которые реализуют IDisposable, после использования нужно удалить. Но статический клиент не удаляется, так как вы продолжаете использовать его после завершения функции. Необходимо, чтобы статический клиент существовал в течение срока жизни приложения.

Клиенты Azure Cosmos DB

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

#r "Microsoft.Azure.Cosmos"
using Microsoft.Azure.Cosmos;

private static Lazy<CosmosClient> lazyClient = new Lazy<CosmosClient>(InitializeCosmosClient);
private static CosmosClient cosmosClient => lazyClient.Value;

private static CosmosClient InitializeCosmosClient()
{
    // Perform any initialization here
    var uri = "https://youraccount.documents.azure.com:443";
    var authKey = "authKey";
   
    return new CosmosClient(uri, authKey);
}

public static async Task Run(string input)
{
    Container container = cosmosClient.GetContainer("database", "collection");
    MyItem item = new MyItem{ id = "myId", partitionKey = "myPartitionKey", data = "example" };
    await container.UpsertItemAsync(document);
   
    // Rest of function
}

Кроме того, создайте файл с именем function.proj для триггера и добавьте приведенное ниже содержимое:


<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netcoreapp3.1</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Cosmos" Version="3.23.0" />
    </ItemGroup>
</Project>

Подключения SqlClient

Код функции может использовать поставщика данных .NET Framework для SQL Server (SqlClient) для подключения к реляционной базе данных SQL. Это также основной поставщик для платформ данных, основанных на ADO.NET, таких как Entity Framework. В отличие от соединений HttpClient и DocumentClient ADO.NET осуществляет объединение подключений в пул по умолчанию. Тем не менее, стоит оптимизировать подключения к базе данных, потому что вы по-прежнему можете остаться без подключений. Дополнительные сведения см. в разделе Пулы подключений SQL Server (ADO.NET).

Совет

Некоторые платформы данных, такие как Entity Framework, обычно получают строки подключений из раздела файла конфигурации ConnectionStrings. В этом случае необходимо добавить строки подключений базы данных SQL непосредственно в список функциональных настроек приложения Строки подключения и в файл local.settings.json в локальном проекте. Если вы создаете экземпляр SqlConnection в коде функции, следует сохранить значение строки подключения в Параметрах приложения с другими подключениями.

Дальнейшие действия

Дополнительные сведения о том, почему рекомендуется использовать статические клиенты, см. в статье Антишаблон неправильного создания экземпляров.

Дополнительные советы по повышению производительности службы "Функции Azure" см. в статье Оптимизация производительности и надежности Функций Azure.