Gerir ligações nas Funções do Azure

As funções numa aplicação de funções partilham recursos. Entre esses recursos partilhados estão ligações: ligações HTTP, ligações de base de dados e ligações a serviços como o Armazenamento do Microsoft Azure. Quando muitas funções estão em execução em simultâneo num plano de Consumo, é possível ficar sem ligações disponíveis. Este artigo explica como codificar as suas funções para evitar utilizar mais ligações do que as necessárias.

Nota

Os limites de ligação descritos neste artigo aplicam-se apenas quando são executados num plano de Consumo. No entanto, as técnicas aqui descritas podem ser benéficas quando executadas em qualquer plano.

Limite de ligações

O número de ligações disponíveis num plano de Consumo é limitado em parte porque uma aplicação de funções neste plano é executada num ambiente de sandbox. Uma das restrições que o sandbox impõe ao seu código é um limite para o número de ligações de saída, que atualmente é de 600 ligações ativas (1200 no total) por instância. Quando atingir este limite, o runtime das funções escreve a seguinte mensagem nos registos: Host thresholds exceeded: Connections. Para obter mais informações, veja Os limites do serviço de Funções.

Este limite é por instância. Quando o controlador de dimensionamento adiciona instâncias da aplicação de funções para processar mais pedidos, cada instância tem um limite de ligação independente. Isto significa que não existe um limite de ligação global e que pode ter muito mais de 600 ligações ativas em todas as instâncias ativas.

Ao resolver problemas, certifique-se de que ativou o Application Insights para a sua aplicação de funções. O Application Insights permite-lhe ver métricas para as suas aplicações de funções, como execuções. Para obter mais informações, veja Ver telemetria no Application Insights.

Clientes estáticos

Para evitar manter mais ligações do que o necessário, reutilize as instâncias de cliente em vez de criar novas com cada invocação de função. Recomendamos que reutilize as ligações de cliente para qualquer idioma em que possa escrever a função. Por exemplo, os clientes .NET, como os clientes HttpClient, DocumentClient e Armazenamento do Azure, podem gerir ligações se utilizar um único cliente estático.

Seguem-se algumas diretrizes a seguir quando estiver a utilizar um cliente específico do serviço numa aplicação Funções do Azure:

  • Não crie um novo cliente com cada invocação de função.
  • Crie um único cliente estático que cada invocação de função pode utilizar.
  • Considere criar um único cliente estático numa classe de programa auxiliar partilhado se diferentes funções utilizarem o mesmo serviço.

Exemplos de código de cliente

Esta secção demonstra as melhores práticas para criar e utilizar clientes a partir do código de função.

Pedidos HTTP

Eis um exemplo de código de função C# que cria uma instância httpClient estática:

// 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
}

Uma pergunta comum sobre HttpClient no .NET é "Devo eliminar o meu cliente?" Em geral, elimina os objetos que são implementados IDisposable quando terminar de os utilizar. No entanto, não elimina um cliente estático porque ainda não o utiliza quando a função termina. Quer que o cliente estático viva durante a sua aplicação.

Clientes do Azure Cosmos DB

O CosmosClient liga-se a uma instância do Azure Cosmos DB. A documentação do Azure Cosmos DB recomenda que utilize um cliente singleton do Azure Cosmos DB para a duração da sua aplicação. O exemplo seguinte mostra um padrão para o fazer numa função:

#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
}

Além disso, crie um ficheiro com o nome "function.proj" para o acionador e adicione o conteúdo abaixo:


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

Ligações SqlClient

O código de função pode utilizar o Fornecedor de Dados .NET Framework para SQL Server (SqlClient) para fazer ligações a uma base de dados relacional SQL. Este é também o fornecedor subjacente para arquiteturas de dados que dependem de ADO.NET, como o Entity Framework. Ao contrário das ligações HttpClient e DocumentClient , ADO.NET implementa o conjunto de ligações por predefinição. No entanto, como ainda pode ficar sem ligações, deve otimizar as ligações à base de dados. Para obter mais informações, veja SQL Server Conjunto de Ligações (ADO.NET).

Dica

Algumas arquiteturas de dados, como o Entity Framework, normalmente obtêm cadeias de ligação a partir da secção ConnectionStrings de um ficheiro de configuração. Neste caso, tem de adicionar explicitamente cadeias de ligação da base de dados SQL à coleção Cadeias de ligação das definições da aplicação de funções e ao ficheiro local.settings.json no projeto local. Se estiver a criar uma instância do SqlConnection no código de função, deve armazenar o valor da cadeia de ligação nas Definições da aplicação com as outras ligações.

Passos seguintes

Para obter mais informações sobre o motivo pelo qual recomendamos clientes estáticos, veja Antipadrão de instanciação incorrido.

Para obter mais sugestões de desempenho Funções do Azure, veja Otimizar o desempenho e a fiabilidade dos Funções do Azure.