Управления подключениями в службе "Функции 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.