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 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:
- Agregue el paquete NuGet adecuado a la aplicación de funciones (este requisito es temporal para las aplicaciones que usan agrupaciones de extensiones).
- 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:
- El nombre de una configuración de la aplicación que contiene una cadena de conexión. Para obtener una cadena de conexión, siga los pasos mostrados en Administración de las claves de acceso de la cuenta de almacenamiento.
- El nombre de un prefijo compartido para varias configuraciones de la aplicación que juntas definen una conexión basada en identidad.
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:
- Colaborador de datos de blobs de almacenamiento
- Colaborador de datos de la cola de Storage
- Colaborador de datos de tabla de Storage
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:
- Para el trabajo de .NET en proceso, instale
Microsoft.Azure.DurableTask.Netherite.AzureFunctions
. - Para el trabajo aislado de .NET, instale
Microsoft.Azure.Functions.Worker.Extensions.DurableTask.Netherite
.
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:
- Para el trabajo de .NET en proceso, instale
Microsoft.DurableTask.SqlServer.AzureFunctions
. - Para el trabajo aislado de .NET, instale
Microsoft.Azure.Functions.Worker.Extensions.DurableTask.SqlServer
.
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 entidades duraderas | ✅ Totalmente compatible | ✅ Totalmente compatible | ️⚠ Compatible, excepto cuando se usa .NET aislado |
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 |
Plan de consumo flexible | ✅ Totalmente compatible (ver notas) | ❌ No se admite | ❌ No se admite |