Provedores de armazenamento do Durable Functions

O Durable Functions é um conjunto de associações e gatilhos do Azure Functions que são ativados internamente pela DTFx (Durable Task Framework). A DTFx dá suporte a vários provedores de armazenamento de back-end, incluindo o provedor do Armazenamento do Azure usado pelo Durable Functions. A partir do Durable Functions v2.5.0, os usuários podem configurar aplicativos de funções para usar provedores de armazenamento da DTFx diferentes do provedor do Armazenamento do Azure.

Observação

Para muitos aplicativos de funções, o provedor de Armazenamento do Microsoft Azure padrão para Durable Functions provavelmente será suficiente e é o mais fácil de usar, pois não requer nenhuma configuração extra. No entanto, existem 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 o Durable Functions e o Durable Task Framework, ou seja, o provedor de armazenamento do Netherite e o provedor de armazenamento do MSSQL (Microsoft SQL Server). Este artigo descreve os três provedores com suporte, compara-os entre si e fornece informações básicas sobre como começar a usá-los.

Observação

Atualmente não é possível migrar dados de um provedor de armazenamento para outro. Se você 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 do Durable Functions. Ele usa filas, tabelas e blobs para persistir a orquestração e o estado da entidade. Usa blobs e concessões de blob para gerenciar partições. Em muitos casos, a conta de armazenamento usada para armazenar o estado de runtime do Durable Functions é igual à conta de armazenamento padrão usada pelo Azure Functions (AzureWebJobsStorage). No entanto, também é possível configurar o Durable Functions com uma conta de armazenamento separada. O provedor do Armazenamento do Azure é integrado à extensão do Durable Functions e não tem nenhuma outra dependência.

Os principais benefícios do provedor do 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 instalação do aplicativo de funções.
  • Modelo de cobrança sem servidor de menor custo: o Armazenamento do Azure tem um modelo de preços baseado em consumo com base inteiramente no uso (mais informações).
  • Melhor suporte de ferramentas: o Armazenamento do Azure oferece emulação local multiplataforma e integra-se ao Visual Studio, ao Visual Studio Code e ao Azure Functions Core Tools.
  • O mais maduro: o Armazenamento do Azure era o back-end de armazenamento original e mais testado do Durable Functions.
  • Visualize o suporte para usar identidade em vez de segredos para se conectar ao provedor de armazenamento.

Encontre o código-fonte dos componentes da DTFx do provedor de armazenamento do Armazenamento do Azure no repositório GitHub Azure/durabletask.

Observação

As contas de uso geral Standard do Armazenamento do Azure são necessárias ao usar o provedor do Armazenamento do Azure. Não há suporte para nenhum outro tipo de conta de armazenamento. Recomendamos expressamente o uso de contas de armazenamento de uso geral herdadas v1, pois as contas de armazenamento v2 mais recentes podem ser significativamente mais caras para cargas de trabalho do Durable Functions. Para obter mais informações sobre os tipos de contas do Armazenamento do Azure, confira a documentação Visão geral da conta de armazenamento.

Netherite

O back-end de armazenamento do Netherite foi projetado e desenvolvido pela Microsoft Research. Ele usa os Hubs de Eventos do Azure e a tecnologia de banco de dados FASTER nos blobs de páginas do Azure. O design do Netherite permite um processamento de taxa de transferência significativamente mais alto de orquestrações e entidades em comparação com outros provedores. Em alguns cenários de parâmetros de comparação, a taxa de transferência mostrou aumentar em mais de uma ordem de magnitude quando comparada ao provedor padrão do Armazenamento do Azure.

Os principais benefícios do provedor de armazenamento do Netherite incluem:

  • Taxa de transferência significativamente mais alta com um custo mais baixo em comparação com outros provedores de armazenamento.
  • Dá suporte à otimização da relação custo/benefício, permitindo a expansão do desempenho, conforme necessário.
  • Dá suporte a até 32 partições de dados com SKUs Básicos e Standard dos Hubs de Eventos.
  • Mais econômico do que outros provedores para cargas de trabalho de alta taxa de transferência.

Saiba mais sobre os detalhes técnicos do provedor de armazenamento do Netherite, incluindo como começar a usá-lo, na documentação do Netherite. Encontre o código-fonte do provedor de armazenamento do Netherite no repositório GitHub microsoft/durabletask-netherite. Uma avaliação mais detalhada do provedor de armazenamento do Netherite está disponível no seguinte documento de pesquisa: Fluxos de trabalho sem servidor com o Durable Functions e o Netherite.

Observação

O nome Netherite é proveniente do mundo do Minecraft.

Microsoft SQL Server (MSSQL)

O provedor de armazenamento do MSSQL (Microsoft SQL Server) persiste todo o estado em um banco de dados do Microsoft SQL Server. Ele é 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 do MSSQL incluem:

  • Dá suporte a 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 hospedado no Azure e local.
  • Consistência de dados forte, permitindo backup/restauração e failover sem perda de dados.
  • Suporte nativo para criptografia de dados personalizada (um recurso do SQL Server).
  • Integra-se aos aplicativos de banco de dados existentes por meio de procedimentos armazenados internos.

Saiba mais sobre os detalhes técnicos do provedor de armazenamento do MSSQL, incluindo como começar a usá-lo, na documentação do provedor do Microsoft SQL. Encontre o código-fonte do provedor de armazenamento do MSSQL no repositório GitHub microsoft/durabletask-mssql.

Como configurar provedores de armazenamento alternativos

A configuração de provedores de armazenamento alternativos geralmente é um processo de duas etapas:

  1. Adicione o pacote NuGet apropriado ao seu aplicativo de funções (esse requisito é temporário para aplicativos que usam pacotes de extensão).
  2. Atualize o arquivo host.json para especificar qual provedor de armazenamento você deseja usar.

Se nenhum provedor de armazenamento estiver configurado explicitamente no host.json, o provedor do Armazenamento do Azure será habilitado por padrão.

Como configurar o provedor do Armazenamento do Azure

O provedor do Armazenamento do Azure é o provedor de armazenamento padrão e não exige nenhuma configuração explícita, referências de pacote NuGet ou referências de pacote de extensão. Encontre o conjunto completo de opções de configuração do host.jsonaqui, no caminho extensions/durableTask/storageProvider.

conexões

A propriedade connectionName no host.json é uma referência à configuração de ambiente que especifica como o aplicativo deve se conectar ao Armazenamento do Microsoft Azure. Ela pode especificar:

Se o valor configurado for uma combinação exata para uma única configuração e um correspondência de prefixo para outras configurações, a correspondente exata será usada. Se nenhum valor for especificado em 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 faça com que o aplicativo use uma identidade do Microsoft Entra. Para fazer isso, defina as configurações em um prefixo comum que mapeia para a propriedade connectionName na configuração de gatilho e de associação.

Para usar uma conexão baseada em identidade para o Durable Functions, defina as seguintes configurações de aplicativo:

Propriedade Modelo de variável de ambiente Descrição Valor de exemplo
URI do serviço Blob <CONNECTION_NAME_PREFIX>__blobServiceUri O URI do plano de dados do serviço de blobs da conta de armazenamento, usando o esquema HTTPS. https://<storage_account_name>.blob.core.windows.net
URI do serviço Fila <CONNECTION_NAME_PREFIX>__queueServiceUri O URI do plano de dados do serviço de filas 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 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

É possível definir propriedades adicionais para personalizar a conexão. Confira Propriedades comuns para conexões baseadas em identidade.

Quando hospedadas no serviço de Azure Functions, as conexões baseadas em identidade usam uma identidade gerenciada. A identidade atribuída pelo sistema é usada por padrão, embora a identidade atribuída pelo usuário possa ser especificada com as propriedades credential e clientID. Observe que não há suporte para configurar uma identidade atribuída pelo usuário com uma ID de recurso. Quando executado em outros contextos, como desenvolvimento local, a identidade do desenvolvedor é usada, embora isso possa ser personalizado. Confira Desenvolvimento local com conexões baseadas em identidade.

Conceder permissão para a 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 será necessário atribuir uma função no Azure RBAC, usando as funções internas ou as personalizadas que fornecem essas permissões.

Importante

Algumas permissões que não são necessárias em todos os contextos podem ser expostas pelo serviço de destino. Sempre que possível, siga o princípio do privilégio mínimo, concedendo à identidade apenas os privilégios necessários. Por exemplo, se o aplicativo precisar apenas ser capaz de ler uma fonte de dados, use uma função que só tenha permissão de leitura. Seria inapropriado atribuir uma função que também permitisse a gravação nesse serviço, pois seria um excesso de permissões para uma operação de leitura. Da mesma forma, seria melhor garantir que a atribuição da função tivesse o escopo apenas sobre os recursos que precisam ser lidos.

Será necessário criar uma atribuição de função que forneça acesso ao armazenamento do Azure em runtime. As funções de gerenciamento como a de 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:

Seu aplicativo pode exigir mais permissões com base no código escrito por você. Se você estiver usando o comportamento padrão ou a configuração explícita connectionName como "AzureWebJobsStorage", confira Conectar-se ao armazenamento de host com uma identidade para outras considerações de permissão.

Como configurar o provedor de armazenamento do Netherite

Habilitar o provedor de armazenamento Netherite requer uma alteração de configuração em seu host.json. Para usuários do C#, ele também requer uma etapa de instalação adicional.

host.json Configuração

O exemplo de host.json a seguir mostra a configuração mínima necessária para habilitar o provedor de armazenamento do Netherite.

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "storageProvider": {
        "type": "Netherite",
        "storageConnectionName": "AzureWebJobsStorage",
        "eventHubsConnectionName": "EventHubsConnection"
      }
    }
  }
}

Para obter instruções de instalação mais detalhadas, confira a documentação de introdução do Netherite.

Instalar a extensão Netherite (somente .NET)

Observação

Se seu aplicativo usa Pacotes de Extensão, você deve ignorar esta seção, pois os Pacotes de Extensão removem a necessidade de gerenciamento manual de extensão.

Você precisará instalar a última versão da Extensão Netherite no NuGet. Isso geralmente significa incluir uma referência a ele no seu arquivo .csproj e criar o projeto.

O pacote de Extensão a ser instalado depende do trabalhador .NET que você está utilizando:

Como configurar o provedor de armazenamento do MSSQL

Habilitar o provedor de armazenamento MSSQL requer uma alteração de configuração em seu host.json. Para usuários do C#, ele também requer uma etapa de instalação adicional.

host.json Configuração

O exemplo a seguir mostra a configuração mínima necessária para habilitar o provedor de armazenamento do MSSQL.

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "storageProvider": {
        "type": "mssql",
        "connectionStringName": "SQLDB_Connection"
      }
    }
  }
}

Para obter instruções de instalação mais detalhadas, confira a documentação de introdução do provedor do MSSQL.

Instalar a extensão MSSQL da Tarefa Durável (somente .NET)

Observação

Se seu aplicativo usa Pacotes de Extensão, você deve ignorar esta seção, pois os Pacotes de Extensão removem a necessidade de gerenciamento manual de extensão.

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 no seu arquivo .csproj e criar o projeto.

O pacote de Extensão a ser instalado depende do trabalhador .NET que você está utilizando:

Comparação entre provedores de armazenamento

Há muitas compensações significativas entre os vários provedores de armazenamento com suporte. A tabela a seguir pode ser usada para ajudar você a entender essas compensações e decidir qual provedor de armazenamento é melhor para suas necessidades.

Provedor de armazenamento Armazenamento do Azure Netherite MSSQL
Status de suporte oficial ✅ GA (em disponibilidade geral) ✅ GA (em disponibilidade geral) ✅ GA (em disponibilidade geral)
Dependências externas Conta do Armazenamento do Azure (uso geral v1) Hubs de Eventos do Azure
Conta do Armazenamento do Azure (uso geral)
SQL Server 2019 ou Banco de Dados SQL do Azure
Opções de emulação e desenvolvimento local Azurite v3.12 e posterior (multiplataforma) Dá suporte à emulação na memória de hubs de tarefas (mais informações) SQL Server Developer Edition (dá suporte a contêineres do Windows, do Linux e do Docker)
Configuração do hub de tarefas Explícita Explícita Implícita por padrão (mais informações)
Taxa de transferência máxima Moderado Muito alta Moderado
Expansão máxima da orquestração/entidade (nós) 16 32 N/D
Expansão máxima da atividade (nós) N/D 32 N/D
Suporte ao dimensionamento do KEDA 2.0
(mais informações)
❌ Sem suporte ❌ Sem suporte ✅ Com suporte por meio do dimensionador do MSSQL (mais informações)
Suporte para pacotes de extensão (recomendado para aplicativos não .NET) ✅ Suporte completo ✅ Suporte completo ✅ Suporte completo
Relação custo/benefício configurável? ❌ Não ✅ Sim (TUs e CUs dos Hubs de Eventos) ✅ Sim (vCPUs do SQL)
Suporte de ambiente desconectado ❌ Conectividade do Azure necessária ❌ Conectividade do Azure necessária ✅ Suporte completo
Conexões baseadas em identidade ✅ Suporte completo ❌ Sem suporte ⚠️Requer escala controlado pelo runtime

Próximas etapas