Proveedores de almacenamiento de Durable Functions

Durable Functions es un conjunto de desencadenadores y enlaces de Azure Functions con tecnología interna de Durable Task Framework (DTFx). DTFx admite varios proveedores de almacenamiento de back-end, incluido el proveedor de Azure Storage que usa Durable Functions. A partir de la versión 2.5.0 de Durable Functions, los usuarios pueden configurar sus aplicaciones de funciones para que usen proveedores de almacenamiento de DTFx distintos del proveedor de Azure Storage.

Nota

Para muchas aplicaciones de functions, es probable que el proveedor de Azure Storage predeterminado para Durable Functions sea suficiente y sea el más fácil de usar, ya que no requiere ninguna configuración adicional. Sin embargo, hay compensaciones de coste, escalabilidad y administración de datos que pueden favorecer el uso de un proveedor de almacenamiento alternativo.

Se han desarrollado dos proveedores de almacenamiento alternativos para su uso con Durable Functions y Durable Task Framework, concretamente el proveedor de almacenamiento de Netherite y el proveedor de almacenamiento de Microsoft SQL Server (MSSQL). En este artículo se describen los tres proveedores admitidos, se comparan entre sí y se proporciona información básica sobre cómo empezar a usarlos.

Nota

Actualmente no es posible migrar datos de un proveedor de almacenamiento a otro. Si desea usar un nuevo proveedor de almacenamiento, debe crear una aplicación configurada con el nuevo proveedor de almacenamiento.

Azure Storage

Azure Storage es el proveedor de almacenamiento predeterminado para Durable Functions. Usa colas, tablas y blobs para conservar la orquestación y el estado de la entidad. También usa blobs y concesiones de blobs para administrar particiones. En muchos casos, la cuenta de almacenamiento que se usa para almacenar el estado del entorno de ejecución de Durable Functions es la misma que la cuenta de almacenamiento predeterminada que usa Azure Functions (AzureWebJobsStorage). Sin embargo, también es posible configurar Durable Functions con una cuenta de almacenamiento independiente. El proveedor de Azure Storage está integrado en la extensión de Durable Functions y no tiene ninguna otra dependencia.

Entre las principales ventajas del proveedor de Azure Storage se incluyen:

  • No se requiere ninguna configuración: puede usar la cuenta de almacenamiento que se creó automáticamente mediante la experiencia de configuración de la aplicación de funciones.
  • Modelo de facturación sin servidor de menor costo: Azure Storage tiene un modelo de precios basado en el consumo basado completamente en el uso (más información).
  • Mejor compatibilidad con herramientas: Azure Storage ofrece emulación local multiplataforma y se integra con Visual Studio, Visual Studio Code y Azure Functions Core Tools.
  • Opción más consolidad: Azure Storage era el back-end de almacenamiento original y más probado para Durable Functions.
  • Compatibilidad con la versión preliminar para usar la identidad en lugar de secretos para conectarse al proveedor de almacenamiento.

El código fuente de los componentes de DTFx del proveedor de almacenamiento de Azure Storage se puede encontrar en el repositorio de GitHub Azure/durabletask.

Nota

Las cuentas estándar de uso general de Azure Storage son necesarias cuando se usa el proveedor de Azure Storage. No se admite ningún otro tipo de cuenta de almacenamiento. Se recomienda encarecidamente usar cuentas de almacenamiento de uso general v1 heredadas, ya que las cuentas de almacenamiento v2 más recientes pueden ser significativamente más costosas para las cargas de trabajo de Durable Functions. Para obtener más información sobre los tipos de cuentas de Azure Storage, consulte la documentación de información general acerca de la cuenta de Azure Storage.

Netherite

Microsoft Research diseñó y desarrolló el back-end de almacenamiento de Netherite. Usa Azure Event Hubs y la tecnología de base de datos FASTER además de blobs en páginas de Azure. El diseño de Netherite permite un procesamiento de orquestaciones y entidades significativamente más elevado en comparación con otros proveedores. En algunos escenarios de punto de referencia, se ha demostrado que el rendimiento aumenta en más de un orden de magnitud en comparación con el proveedor predeterminado de Azure Storage.

Entre las principales ventajas del proveedor de Netherite se incluyen:

  • Rendimiento significativamente mayor a un costo menor en comparación con otros proveedores de almacenamiento.
  • Admite la optimización del rendimiento de precios, lo que le permite escalar verticalmente el rendimiento según sea necesario.
  • Admite hasta 32 particiones de datos con SKU básicas y estándar de Event Hubs.
  • Más rentable que otros proveedores para cargas de trabajo de alto rendimiento.

Puede obtener más información sobre los detalles técnicos del proveedor de almacenamiento de Netherite, incluida información sobre cómo empezar a usarlo, en la documentación de Netherite. El código fuente del proveedor de almacenamiento de Netherite se puede encontrar en el repositorio de GitHub microsoft/durabletask-netherite. También hay disponible una evaluación más detallada del proveedor de almacenamiento de Netherite en el siguiente documento de investigación: Flujos de trabajo sin servidor con Durable Functions y Netherite.

Nota

El nombre de Netherite tiene origen en el mundo de Minecraft.

Microsoft SQL Server (MSSQL)

El proveedor de almacenamiento de Microsoft SQL Server (MSSQL) conserva todo el estado en una base de datos de Microsoft SQL Server. Es compatible con las implementaciones locales y hospedadas en la nube de SQL Server, lo que incluye Azure SQL Database.

Entre las principales ventajas del proveedor de MSSQL se incluyen:

  • Admite entornos desconectados: no se requiere conectividad de Azure cuando se usa una instalación de SQL Server.
  • Portátil en varios entornos y nubes, incluidos los entornos locales y hospedados en Azure.
  • Coherencia de datos fuerte, habilitación de copias de seguridad y restauración y conmutación por error sin pérdida de datos.
  • Compatibilidad nativa con el cifrado de datos personalizado (una característica de SQL Server).
  • Se integra con las aplicaciones de base de datos existentes a través de procedimientos almacenados integrados.

Puede obtener más información sobre los detalles técnicos del proveedor de almacenamiento de MSSQL, incluida información sobre cómo empezar a usarlo, en la documentación del proveedor de Microsoft SQL. El código fuente del proveedor de almacenamiento de MSSQL se puede encontrar en el repositorio de GitHub microsoft/durabletask-mssql.

Configuración de proveedores de almacenamiento alternativos

La configuración de proveedores de almacenamiento alternativos suele ser un proceso de dos pasos:

  1. Agregue el paquete NuGet adecuado a la aplicación de funciones (este requisito es temporal para las aplicaciones que usan agrupaciones de extensiones).
  2. Actualice el archivo host.json para especificar qué proveedor de almacenamiento desea usar.

Si no hay ningún proveedor de almacenamiento configurado explícitamente en host.json, el proveedor de Azure Storage se habilitará de manera predeterminada.

Configuración del proveedor de Azure Storage

El proveedor de Azure Storage es el proveedor de almacenamiento predeterminado y no requiere ninguna configuración explícita, referencias de paquetes NuGet ni referencias de agrupaciones de extensiones. Puede encontrar el conjunto completo de opciones de configuración de host.jsonaquí, en la ruta de acceso extensions/durableTask/storageProvider.

Conexiones

La propiedad connectionName de host.json es una referencia a la configuración del entorno que especifica cómo se debe conectar la aplicación a Azure Storage. Puede especificar lo siguiente:

Si el valor configurado es tanto una coincidencia exacta de una única configuración como una coincidencia de prefijo de otras configuraciones, se usa la coincidencia exacta. Si no se especifica ningún valor en host.json, el valor predeterminado es "AzureWebJobsStorage".

Conexiones basadas en identidades

Si usa la versión 2.7.0.x o posterior de la extensión y el proveedor de almacenamiento de Azure, en lugar de usar una cadena de conexión con un secreto, puede hacer que la aplicación use una identidad de Microsoft Entra. Para ello, definiría la configuración con un prefijo común que se asigne a la propiedad connectionName en la configuración de desencadenador y enlace.

Para usar una conexión basada en identidades para Durable Functions, configure las siguientes opciones de la aplicación:

Propiedad Plantilla de variable de entorno Descripción Valor de ejemplo
URI de Blob service <CONNECTION_NAME_PREFIX>__blobServiceUri El identificador URI del plano de datos del servicio de blobs de la cuenta de almacenamiento, con el esquema HTTPS. https://<storage_account_name>.blob.core.windows.net
URI de Queue service <CONNECTION_NAME_PREFIX>__queueServiceUri El identificador URI del plano de datos del servicio de cola de la cuenta de almacenamiento, con el esquema HTTPS. https://<storage_account_name>.queue.core.windows.net
URI del servicio de tablas <CONNECTION_NAME_PREFIX>__tableServiceUri El URI del plano de datos de un Table service de la cuenta de almacenamiento, con el esquema HTTPS. https://<nombre_cuenta_almacenamiento>.table.core.windows.net

Se pueden establecer propiedades adicionales para personalizar la conexión. Consulte Propiedades comunes para conexiones basadas en identidades.

Cuando se hospeda en el servicio de Azure Functions, las conexiones basadas en identidades usan una identidad administrada. La identidad asignada por el sistema se usa de manera predeterminada, aunque se puede especificar una identidad asignada por el usuario con las propiedades credential y clientID. Tenga en cuenta que no se admite la configuración de una identidad asignada por el usuario con un identificador de recurso. Cuando se ejecuta en otros contextos, como el de desarrollo local, se usa en su lugar la identidad del desarrollador, aunque se puede personalizar. Consulte Desarrollo local con conexiones basadas en identidades.

Concesión de permiso a la identidad

Cualquier identidad que se utilice debe tener permisos para realizar las acciones previstas. Para la mayoría de los servicios de Azure, esto significa que debe asignar un rol en Azure RBAC mediante roles integrados o personalizados que proporcionen esos permisos.

Importante

Es posible que el servicio de destino muestre algunos permisos que no son necesarios para todos los contextos. Siempre que sea posible, respete el principio de privilegios mínimos y conceda solo los privilegios necesarios a la identidad. Por ejemplo, si la aplicación solo necesita poder leer desde un origen de datos, use un rol que solo tenga permiso de lectura. Sería inadecuado asignar un rol que también permita escribir en ese servicio, ya que sería un permiso excesivo para una operación de lectura. De forma similar, le interesa asegurarse de que la asignación de roles esté limitada solo a los recursos que se deben leer.

Deberá crear una asignación de roles que proporcione acceso a Azure Storage en tiempo de ejecución. Los roles de administración, como Propietario, no son suficientes. Se recomiendan los roles integrados siguientes al usar la extensión Durable Functions con un funcionamiento normal:

Puede que la aplicación precise más permisos en función del código que escriba. Si usa el comportamiento predeterminado o establece connectionName explícitamente en "AzureWebJobsStorage", consulte Conexión al almacenamiento de host con una identidad para otras consideraciones de permisos.

Configuración del proveedor de almacenamiento de Netherite

La habilitación del proveedor de almacenamiento de Netherite requiere un cambio de configuración en host.json. Para los usuarios de C#, también requiere un paso de instalación adicional.

host.json Configuración

En el ejemplo siguiente de host.json se muestra la configuración mínima necesaria para habilitar el proveedor de almacenamiento de Netherite.

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

Para obtener instrucciones de configuración más detalladas, consulte la documentación de introducción a Netherite.

Instalar la extensión Netherite (solo .NET)

Nota:

Si la aplicación usa conjuntos de extensiones debe omitir esta sección, ya que estos conjuntos de extensiones evitan la necesidad de administrar las extensiones manualmente.

Deberá instalar la versión más reciente de la extensión de Netherite en NuGet. Por lo general, esto significa incluir una referencia a la misma en el archivo .csproj y la compilación del proyecto.

El paquete de extensión que se va a instalar depende del trabajo de .NET que use:

Configuración del proveedor de almacenamiento de MSSQL

La habilitación del proveedor de almacenamiento MSSQL requiere un cambio de configuración en host.json. Para los usuarios de C#, también requiere un paso de instalación adicional.

host.json Configuración

En el ejemplo siguiente se muestra la configuración mínima necesaria para habilitar el proveedor de almacenamiento de MSSQL.

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

Para obtener instrucciones de configuración más detalladas, consulte la documentación de introducción a MSSQL.

Instalar la extensión MSSQL de Durable Task (solo .NET)

Nota:

Si la aplicación usa conjuntos de extensiones debe omitir esta sección, ya que estos conjuntos de extensiones evitan la necesidad de administrar las extensiones manualmente.

Tendrá que instalar la versión más reciente de la extensión del proveedor de almacenamiento MSSQL en NuGet. Por lo general, esto significa incluir una referencia a la misma en el archivo .csproj y la compilación del proyecto.

El paquete de extensión que se va a instalar depende del trabajo de .NET que use:

Comparación de proveedores de almacenamiento

Hay muchos contrapartidas entre los distintos proveedores de almacenamiento admitidos. La tabla siguiente se puede usar para ayudarle a comprender estas contrapartidas y decidir qué proveedor de almacenamiento es mejor para sus necesidades.

Proveedor de almacenamiento Azure Storage Netherite MSSQL
Estado de soporte técnico oficial ✅ Disponible con carácter general ✅ Disponible con carácter general ✅ Disponible con carácter general
Dependencias externas Cuenta de Azure Storage (uso general v1) Azure Event Hubs
Cuenta de Azure Storage (de uso general)
SQL Server 2019 o Azure SQL Database
Opciones de emulación y desarrollo local Azurite v3.12+ (multiplataforma) Admite la emulación en memoria de las centrales de tareas (más información) SQL Server Developer Edition (admite contenedores de Windows, Linux y Docker)
Configuración de la central de tareas Explícito Explícito Implícita de manera predeterminada (más información)
Rendimiento máximo Moderada Muy alto Moderada
Escalabilidad horizontal máxima de orquestación o entidad (nodos) 16 32 N/D
Escalabilidad horizontal máxima de actividad (nodos) N/D 32 N/D
Compatibilidad con el escalado de KEDA 2.0
(más información)
❌ No se admite ❌ No se admite ✅ Compatible con Scaler de MSSQL (más información)
Compatibilidad con agrupaciones de extensiones (recomendado para aplicaciones que no son .NET) ✅ Totalmente compatible ✅ Totalmente compatible ✅ Totalmente compatible
¿Se puede configurar el precio y el rendimiento? ❌ No ✅ Sí (TU y CPU de Event Hubs) ✅ Sí (vCPU de SQL)
Compatibilidad con entornos desconectados ❌ Se requiere conectividad de Azure ❌ Se requiere conectividad de Azure ✅ Totalmente compatible
Conexiones basadas en identidades ✅ Totalmente compatible ❌ No se admite ⚠️ Requiere escalado controlado por el entorno de ejecución

Pasos siguientes