Fornecedores de armazenamento de Durable Functions
Durable Functions é um conjunto de gatilhos e associações do Azure Functions que são alimentados internamente pelo DTFx (Durable Task Framework ). O DTFx dá suporte a vários provedores de armazenamento de back-end, incluindo o provedor de Armazenamento do Azure usado pelo Durable Functions. A partir do Durable Functions v2.5.0, os usuários podem configurar seus aplicativos de função para usar provedores de armazenamento DTFx diferentes do provedor de Armazenamento do Azure.
Nota
Para muitos aplicativos de função, o provedor de Armazenamento do Azure padrão para Funções Duráveis provavelmente será suficiente e é o mais fácil de usar, pois não requer nenhuma configuração extra. No entanto, há compensações de custo, escalabilidade e gerenciamento de dados que podem favorecer o uso de um provedor de armazenamento alternativo.
Dois provedores de armazenamento alternativos foram desenvolvidos para uso com funções duráveis e o Durable Task Framework, ou seja, o provedor de armazenamento Netherite e o provedor de armazenamento Microsoft SQL Server (MSSQL). Este artigo descreve os três provedores suportados, compara-os entre si e fornece informações básicas sobre como começar a usá-los.
Nota
Atualmente, não é possível migrar dados de um provedor de armazenamento para outro. Se quiser usar um novo provedor de armazenamento, crie um novo aplicativo configurado com o novo provedor de armazenamento.
Armazenamento do Azure
O Armazenamento do Azure é o provedor de armazenamento padrão para Funções Duráveis. Ele usa filas, tabelas e blobs para persistir a orquestração e o estado da entidade. Ele também usa blobs e concessões de blob para gerenciar partições. Em muitos casos, a conta de armazenamento usada para armazenar o estado de tempo de execução do Durable Functions é a mesma que a conta de armazenamento padrão usada pelo Azure Functions (AzureWebJobsStorage
). No entanto, também é possível configurar funções duráveis com uma conta de armazenamento separada. O provedor de Armazenamento do Azure é interno na extensão Durable Functions e não tem outras dependências.
Os principais benefícios do provedor de Armazenamento do Azure incluem:
- Nenhuma configuração necessária - você pode usar a conta de armazenamento que foi criada para você pela experiência de configuração do aplicativo de função.
- Modelo de faturação sem servidor de custo mais baixo - o Armazenamento do Azure tem um modelo de preços baseado no consumo baseado inteiramente na utilização (mais informações).
- Melhor suporte a ferramentas - o Armazenamento do Azure oferece emulação local entre plataformas e integra-se com o Visual Studio, o Visual Studio Code e as Ferramentas Principais do Azure Functions.
- Mais maduro - o Armazenamento do Azure era o back-end de armazenamento original e mais testado em batalha para Funções Duráveis.
- Suporte para usar identidade em vez de segredos para se conectar ao provedor de armazenamento.
O código-fonte para os componentes DTFx do provedor de armazenamento do Armazenamento do Azure pode ser encontrado no repositório Azure/durabletask GitHub.
Nota
As contas de Armazenamento do Azure de uso geral padrão são necessárias ao usar o provedor de Armazenamento do Azure. Não há suporte para todos os outros tipos de conta de armazenamento. É altamente recomendável usar contas de armazenamento de uso geral v1 herdadas porque as contas de armazenamento v2 mais recentes podem ser significativamente mais caras para cargas de trabalho de Funções Duráveis. Para obter mais informações sobre os tipos de conta de Armazenamento do Azure, consulte a documentação de visão geral da conta de armazenamento.
Netherite
O back-end de armazenamento Netherite foi projetado e desenvolvido pela Microsoft Research. Ele usa os Hubs de Eventos do Azure e a tecnologia de banco de dados FASTER sobre os Blobs de Página do Azure. O design da Netherite permite um processamento significativamente mais alto de orquestrações e entidades em comparação com outros provedores. Em alguns cenários de referência, a taxa de transferência aumentou em mais de uma ordem de magnitude quando comparada ao provedor de Armazenamento do Azure padrão.
Os principais benefícios do provedor de armazenamento Netherite incluem:
- Throughput significativamente maior a um custo mais baixo em comparação com outros provedores de armazenamento.
- Suporta otimização de preço-desempenho, permitindo que você aumente o desempenho conforme necessário.
- Suporta até 32 partições de dados com SKUs Basic e Standard dos Hubs de Eventos.
- Mais econômico do que outros provedores para cargas de trabalho de alto rendimento.
Você pode saber mais sobre os detalhes técnicos do provedor de armazenamento Netherite, incluindo como começar a usá-lo, na documentação do Netherite. O código-fonte do provedor de armazenamento Netherite pode ser encontrado no repositório GitHub microsoft/durabletask-netherite . Uma avaliação mais aprofundada do provedor de armazenamento Netherite também está disponível no seguinte documento de pesquisa: Serverless Workflows with Durable Functions and Netherite.
Nota
O nome Netherite tem origem no mundo de Minecraft.
Servidor Microsoft SQL (MSSQL)
O provedor de armazenamento do Microsoft SQL Server (MSSQL) persiste todo o estado em um banco de dados do Microsoft SQL Server. É compatível com implantações locais e hospedadas na nuvem do SQL Server, incluindo o Banco de Dados SQL do Azure.
Os principais benefícios do provedor de armazenamento MSSQL incluem:
- Suporta ambientes desconectados - nenhuma conectividade do Azure é necessária ao usar uma instalação do SQL Server.
- Portátil em vários ambientes e nuvens, incluindo hospedados no Azure e no local.
- Forte consistência de dados, permitindo backup/restauração e failover sem perda de dados.
- Suporte nativo para criptografia de dados personalizada (um recurso do SQL Server).
- Integra-se com aplicativos de banco de dados existentes por meio de procedimentos armazenados integrados.
Você pode saber mais sobre os detalhes técnicos do provedor de armazenamento MSSQL, incluindo como começar a usá-lo, na documentação do provedor Microsoft SQL. O código-fonte do provedor de armazenamento MSSQL pode ser encontrado no repositório GitHub microsoft/durabletask-mssql .
Configurando provedores de armazenamento alternativos
A configuração de provedores de armazenamento alternativos geralmente é um processo de duas etapas:
- Adicione o pacote NuGet apropriado ao seu aplicativo de função (esse requisito é temporário para aplicativos que usam pacotes de extensão).
- Atualize o arquivo host.json para especificar qual provedor de armazenamento você deseja usar.
Se nenhum provedor de armazenamento estiver explicitamente configurado no host.json, o provedor de Armazenamento do Azure será habilitado por padrão.
Configurando o provedor de armazenamento do Azure
O provedor de Armazenamento do Azure é o provedor de armazenamento padrão e não requer nenhuma configuração explícita, referências de pacote NuGet ou referências de pacote de extensão. Você pode encontrar o conjunto completo de opções de configuração host.json aqui, sob o extensions/durableTask/storageProvider
caminho.
Ligações
A connectionName
propriedade em host.json é uma referência à configuração do ambiente que especifica como o aplicativo deve se conectar ao Armazenamento do Azure. Pode especificar:
- O nome de uma configuração de aplicativo que contém uma cadeia de conexão. Para obter uma cadeia de conexão, siga as etapas mostradas em Gerenciar chaves de acesso da conta de armazenamento.
- O nome de um prefixo compartilhado para várias configurações de aplicativo, definindo em conjunto uma conexão baseada em identidade.
Se o valor configurado for uma correspondência exata para uma única configuração e uma correspondência de prefixo para outras configurações, a correspondência exata será usada. Se nenhum valor for especificado no host.json, o valor padrão será "AzureWebJobsStorage".
Conexões baseadas em identidade
Se você estiver usando a versão 2.7.0 ou superior da extensão e o provedor de armazenamento do Azure, em vez de usar uma cadeia de conexão com um segredo, poderá fazer com que o aplicativo use uma identidade do Microsoft Entra. Para fazer isso, você definiria as configurações sob um prefixo comum que mapeia para a connectionName
propriedade na configuração de gatilho e vinculação.
Para usar uma conexão baseada em identidade para funções duráveis, defina as seguintes configurações do aplicativo:
Property | Modelo de variável de ambiente | Description | Valor de exemplo |
---|---|---|---|
URI do serviço de Blob | <CONNECTION_NAME_PREFIX>__blobServiceUri |
O URI do plano de dados do serviço de blob da conta de armazenamento, usando o esquema HTTPS. | https://< storage_account_name.blob.core.windows.net> |
URI do serviço de fila | <CONNECTION_NAME_PREFIX>__queueServiceUri |
O URI do plano de dados do serviço de fila da conta de armazenamento, usando o esquema HTTPS. | https://< storage_account_name.queue.core.windows.net> |
URI do serviço de tabela | <CONNECTION_NAME_PREFIX>__tableServiceUri |
O URI do plano de dados de um serviço de tabela da conta de armazenamento, usando o esquema HTTPS. | https://< storage_account_name.table.core.windows.net> |
Propriedades adicionais podem ser definidas para personalizar a conexão. Consulte Propriedades comuns para conexões baseadas em identidade.
Quando hospedadas no serviço Azure Functions, as conexões baseadas em identidade usam uma identidade gerenciada. A identidade atribuída ao sistema é usada por padrão, embora uma identidade atribuída ao usuário possa ser especificada com as credential
propriedades e clientID
. Observe que não há suporte para a configuração de uma identidade atribuída pelo usuário com uma ID de recurso. Quando executado em outros contextos, como desenvolvimento local, sua identidade de desenvolvedor é usada, embora isso possa ser personalizado. Consulte Desenvolvimento local com conexões baseadas em identidade.
Conceder permissão à identidade
Qualquer identidade que esteja sendo usada deve ter permissões para executar as ações pretendidas. Para a maioria dos serviços do Azure, isso significa que você precisa atribuir uma função no RBAC do Azure, usando funções internas ou personalizadas que fornecem essas permissões.
Importante
Algumas permissões podem ser expostas pelo serviço de destino que não são necessárias para todos os contextos. Sempre que possível, aderir ao princípio do menor privilégio, concedendo à identidade apenas os privilégios necessários. Por exemplo, se o aplicativo só precisa ser capaz de ler de uma fonte de dados, use uma função que só tenha permissão para ler. Seria inadequado atribuir uma função que também permita escrever a esse serviço, pois isso seria uma permissão excessiva para uma operação de leitura. Da mesma forma, convém garantir que a atribuição de função tenha escopo apenas sobre os recursos que precisam ser lidos.
Você precisará criar uma atribuição de função que forneça acesso ao armazenamento do Azure em tempo de execução. Funções de gerenciamento como Proprietário não são suficientes. As seguintes funções internas são recomendadas ao usar a extensão Durable Functions em operação normal:
- Contribuidor de Dados de Blobs de Armazenamento
- Contribuidor de dados da fila de armazenamento
- Contribuidor de dados da tabela de armazenamento
Seu aplicativo pode exigir mais permissões com base no código que você escreve. Se você estiver usando o comportamento padrão ou definindo connectionName
explicitamente como "AzureWebJobsStorage", consulte Conectando-se ao armazenamento do host com uma identidade para obter outras considerações sobre permissão.
Configurando o provedor de armazenamento Netherite
Habilitar o provedor de armazenamento Netherite requer uma alteração de configuração no .host.json
Para usuários de C#, ele também requer uma etapa de instalação adicional.
Configuração host.json
O exemplo host.json a seguir mostra a configuração mínima necessária para habilitar o provedor de armazenamento Netherite.
{
"version": "2.0",
"extensions": {
"durableTask": {
"storageProvider": {
"type": "Netherite",
"storageConnectionName": "AzureWebJobsStorage",
"eventHubsConnectionName": "EventHubsConnection"
}
}
}
}
Para obter instruções de configuração mais detalhadas, consulte a documentação de introdução do Netherite.
Instale a extensão Netherite (somente .NET)
Nota
Se o seu aplicativo usa Pacotes de Extensões, você deve ignorar esta seção, pois os Pacotes de Extensão eliminam a necessidade de gerenciamento manual de Extensões.
Você precisará instalar a versão mais recente da extensão Netherite no NuGet. Isso geralmente significa incluir uma referência a ele em seu .csproj
arquivo e construir o projeto.
O pacote de extensão a ser instalado depende do trabalhador .NET que você está usando:
- Para o trabalhador .NET em processo, instale o
Microsoft.Azure.DurableTask.Netherite.AzureFunctions
. - Para o trabalhador .NET isolado, instale o .
Microsoft.Azure.Functions.Worker.Extensions.DurableTask.Netherite
Configurando o provedor de armazenamento MSSQL
Habilitar o provedor de armazenamento MSSQL requer uma alteração de configuração no .host.json
Para usuários de C#, ele também requer uma etapa de instalação adicional.
Configuração host.json
O exemplo a seguir mostra a configuração mínima necessária para habilitar o provedor de armazenamento MSSQL.
{
"version": "2.0",
"extensions": {
"durableTask": {
"storageProvider": {
"type": "mssql",
"connectionStringName": "SQLDB_Connection"
}
}
}
}
Para obter instruções de configuração mais detalhadas, consulte a documentação de introdução do provedor MSSQL.
Instalar a extensão MSSQL da Tarefa Durável (somente .NET)
Nota
Se o seu aplicativo usa Pacotes de Extensões, você deve ignorar esta seção, pois os Pacotes de Extensão eliminam a necessidade de gerenciamento manual de Extensões.
Você precisará instalar a versão mais recente da extensão do provedor de armazenamento MSSQL no NuGet. Isso geralmente significa incluir uma referência a ele em seu .csproj
arquivo e construir o projeto.
O pacote de extensão a ser instalado depende do trabalhador .NET que você está usando:
- Para o trabalhador .NET em processo, instale o
Microsoft.DurableTask.SqlServer.AzureFunctions
. - Para o trabalhador .NET isolado, instale o .
Microsoft.Azure.Functions.Worker.Extensions.DurableTask.SqlServer
Comparando provedores de armazenamento
Há muitas compensações significativas entre os vários provedores de armazenamento suportados. A tabela a seguir pode ser usada para ajudá-lo a entender essas compensações e decidir qual provedor de armazenamento é melhor para suas necessidades.
Provedor de armazenamento | Armazenamento do Azure | Netherite | MSSQL |
---|---|---|---|
Estado oficial do suporte | ✅ Geralmente disponível (GA) | ✅ Geralmente disponível (GA) | ✅ Geralmente disponível (GA) |
Dependências externas | Conta de Armazenamento do Azure (finalidade geral v1) | Hubs de Eventos do Azure Conta de Armazenamento do Azure (finalidade geral) |
SQL Server 2019 ou Banco de Dados SQL do Azure |
Opções de emulação e desenvolvimento local | Azurite v3.12+ (plataforma cruzada) | Suporta emulação na memória de hubs de tarefas (mais informações) | SQL Server Developer Edition (suporta contêineres Windows, Linux e Docker) |
Configuração do hub de tarefas | Explícito | Explícito | Implícito por padrão (mais informações) |
Débito máximo | Moderado | Muito alta | Moderado |
Orquestração máxima/dimensionamento de entidade (nós) | 16 | 32 | N/A |
Expansão máxima da atividade (nós) | N/A | 32 | N/A |
Suporte a Entidades Duráveis | ✅ Totalmente suportado | ✅ Totalmente suportado | ⚠️ Suportado, exceto ao usar .NET Isolated |
Suporte ao dimensionamento KEDA 2.0 (Outras informações) |
❌ Não suportado | ❌ Não suportado | ✅ Suportado usando o escalador MSSQL (mais informações) |
Suporte para pacotes de extensão (recomendado para aplicativos non-.NET) | ✅ Totalmente suportado | ✅ Totalmente suportado | ✅ Totalmente suportado |
Preço-desempenho configurável? | ❌ Não | ✅ Sim (Hubs de Eventos, TUs e CUs) | ✅ Sim (SQL vCPUs) |
Suporte a ambientes desconectados | ❌ Conectividade do Azure necessária | ❌ Conectividade do Azure necessária | ✅ Totalmente suportado |
Conexões baseadas em identidade | ✅ Totalmente suportado | ❌ Não suportado | ⚠️ Requer dimensionamento orientado por tempo de execução |
Plano de consumo Flex | ✅ Totalmente suportado (ver notas) | ❌ Não suportado | ❌ Não suportado |