En este capítulo, abordaremos las siguientes recetas:
- Cargar datos de empleados en Blob Storage
- Crear un desencadenador de blob
- Crear el orquestador durable y activarlo para cada importación de Excel
- Leer datos de Excel mediante funciones de actividad
- Escalar automáticamente el rendimiento de Cosmos DB
- Insertar masivamente datos en Cosmos DB
Introducción
En este capítulo, vamos a desarrollar un miniproyecto con un caso de uso muy común que resuelve el problema empresarial de compartir datos entre distintas aplicaciones mediante Excel. Utilizaremos Durable Functions, una extensión de Azure Functions que permite crear flujos de trabajo mediante la escritura de una cantidad mínima de líneas de código.
A continuación, se indican las dos características principales de Durable Functions que utilizaremos en las recetas de este capítulo:
- Orquestador: es la función responsable de gestionar todos los desencadenadores de actividad. Se puede tratar como un administrador de flujos de trabajo con varios pasos. El orquestador se encarga de iniciar el desencadenador de actividad, pasar información de entrada al desencadenador de actividad, obtener la información de salida, mantener el estado y pasar la información de salida de un desencadenador de actividad a otro si es necesario.
- Desencadenador de actividad: cada desencadenador de actividad se puede considerar un paso del flujo de trabajo que realiza una función.
Puedes obtener más información sobre Durable Functions en https:// docs.microsoft.com/en-us/azure/azure-functions/ durable-functions-overview.
Problema empresarial
En general, las organizaciones utilizan distintas aplicaciones hospedadas en múltiples plataformas de diferentes centros de datos (en el cloud u on-premises). A menudo, es necesario que los datos de una aplicación se envíen a otro sistema. Normalmente, las hojas de cálculo de Excel (y en algunos casos, los archivos JSON o XML) se utilizan para exportar datos desde una aplicación e importarlos en otra.
La exportación de un archivo de Excel de una aplicación a otra puede parecer sencilla. No obstante, cuando varias aplicaciones deben enviar datos a otras aplicaciones de forma semanal o mensual, el trabajo se complica y hay muchas posibilidades de que se produzcan errores manuales. Por lo tanto, la solución obvia es automatizar el proceso en la medida de lo posible.
En este capítulo, aprenderemos a desarrollar una solución duradera basada en una arquitectura sin servidor mediante Durable Functions. Si ya has leído el capítulo 7, Desarrollo de aplicaciones fiables sin servidor mediante Durable Functions, tendrás un conocimiento básico de qué son las Durable Functions y cómo funcionan. En el capítulo 7, Desarrollo de aplicaciones fiables sin servidor mediante Durable Functions, hemos implementado la solución desde el portal. Sin embargo, en este capítulo, vamos a implementar un miniproyecto con Visual Studio 2017 (preferiblemente 15.5 o superior).
Antes de empezar a desarrollar el proyecto, debemos comprender la nueva forma de implementar la solución sin servidor.
Una forma duradera y sin servidor de
implementar una importación de Excel
En este diagrama se muestran todos los pasos necesarios para crear la solución mediante la arquitectura sin servidor:

- Las aplicaciones o clientes externos cargan un archivo de Excel en Blob Storage.
- El desencadenador de blob se activa cuando el archivo de Excel se carga correctamente.
- El orquestador durable se inicia desde el desencadenador de blob.
- El orquestador invoca Leer Excel: desencadenador de actividad para leer el contenido de Excel de Blob Storage.
- El orquestador invoca Escalar RU: desencadenador de actividad para ampliar el rendimiento de la colección de Cosmos DB para que se adapte a la carga.
- El orquestador invoca Importar datos: desencadenador de actividad para preparar la colección para la importación masiva de datos.
- Por último, Importar datos: desencadenador de actividad carga los datos de la colección en la colección de Cosmos DB mediante los enlaces de salida de Cosmos DB
Cargar datos de empleados en Blob Storage
En esta receta, vamos a desarrollar una aplicación de consola para cargar la hoja de Excel en Blob Storage.
Preparación
Establece los siguientes requisitos previos:
- Instala Visual Studio 2017 (versión 15.5 o posterior).
- Crea una cuenta de almacenamiento y un contenedor de blobs denominado Excelimports.
- Crea un archivo de Excel con datos de los empleados, tal como se muestra en la siguiente captura de pantalla:

Cómo hacerlo…
Sigue estos pasos:
- Crea una nueva aplicación de consola denominada ExcelImport.Client mediante Visual Studio, tal como se muestra en la siguiente captura de pantalla:

- Cuando el proyecto se haya creado, ejecuta los siguientes comandos en el administrador de paquetes NuGet:
Install-Package Microsoft.Azure.Storage.Blob
Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.FileExtensions
Install-Package Microsoft.Extensions.Configuration.Json
- Añade los siguientes espacios de nombres en la parte superior del archivo Program.cs:
using Microsoft.Extensions.Configuration; using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Blob; using System; using System.IO; using System.Threading.Tasks;
- El siguiente paso es desarrollar el código en una función denominada UploadBlob que carga el archivo de Excel en el contenedor de blobs que hemos creado. Para simplificar la tarea, el siguiente código cargará el archivo de Excel desde una ubicación codificada de forma rígida. Sin embargo, en una aplicación típica en tiempo real, este archivo lo cargaría el usuario final mediante una interfaz web. Copia el siguiente código y pégalo en el archivo Program.cs de la aplicación ExcelImport.Client:
private static async Task UploadBlob()
{
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(“appsettings.json”, optional: true, reloadOnChange:
true); IConfigurationRoot configuration = builder.Build();
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.
Parse(configuration.GetConnectionString(“StorageConnection”));
CloudBlobClient cloudBlobClient = cloudStorageAccount.
CreateCloudBlobClient();
CloudBlobContainer ExcelBlobContainer = cloudBlobClient.GetContain erReference(“Excelimports”);
await ExcelBlobContainer.CreateIfNotExistsAsync();
CloudBlockBlob cloudBlockBlob = ExcelBlobContainer.GetBlockBlobRef erence(“EmployeeInformation” + Guid.NewGuid().ToString()); await cloudBlockBlob.UploadFromFileAsync(@”C:\Users\ vmadmin\source\repos\POC\ImportExcelPOC\ImportExcelPOC\
EmployeeInformation.xlsx”);
}
- Ahora, copia el siguiente código en la función Principal. Este fragmento de código invoca la función UploadBlob, que es responsable de cargar el blob a nivel interno:
{
UploadBlob().Wait();
}
catch (Exception ex)
{
Console.WriteLine(“An Error has occurred with the message” + ex.Message); }
- El siguiente paso es crear un archivo de configuración denominado appsettings.json, que contiene la cadena de conexión de la cuenta de almacenamiento, tal como se muestra en la siguiente captura de pantalla:

- Abre las propiedades del archivo appsettings.json y cambia la opción Copiar en el directorio de salida por Copiar si es posterior para que el programa pueda leer las propiedades tal como se muestra en la siguiente captura de pantalla:

- Compila la aplicación e iníciala. Si has configurado todo, deberías ver algo parecido a lo que se muestra en la siguiente captura de pantalla:

- Vayamos a la cuenta de almacenamiento y al contenedor de blobs denominado Excelimports, donde verás el archivo Excel que hemos cargado, tal como se muestra en la siguiente captura de pantalla:

Eso es todo. Hemos desarrollado una aplicación que carga el blob.
Cómo funciona…
En esta receta, hemos creado una aplicación de consola que utiliza ensamblados de almacenamiento para cargar un blob (en nuestro caso, un archivo de Excel) en el contenedor de blobs designado. Ten en cuenta que, cada vez que se ejecute la aplicación, se creará un nuevo archivo en el contenedor de blobs. Con el fin de cargar los archivos de Excel con nombres únicos, vamos a anexar un GUID.
Y eso no es todo…
Anota las convenciones de nomenclatura que se deben seguir al crear el contenedor de blobs:
En el momento de la escritura, el portal mostrará el siguiente mensaje de error si no respetas las reglas de nomenclatura: Este nombre solo puede contener letras minúsculas, números y guiones y debe empezar por una letra o un número. Cada guion debe estar precedido y seguido de un carácter distinto del guion. Además, el nombre debe tener entre 3 y 63 caracteres.
Crear un desencadenador de blob
En esta receta, vamos a crear una aplicación de función con el runtime de Azure
Functions V2, así como a descubrir cómo crear un desencadenador de blob mediante Visual Studio. También vamos a ver cómo se activa el desencadenador de blob cuando el archivo de Excel se carga correctamente en el contenedor de blobs.
Preparación
Establece los siguientes requisitos previos:
- Añade un nuevo proyecto denominado ExcelImport.DurableFunctions a la solución existente. Para ello, elige la plantilla de Azure Functions, tal como se muestra en la siguiente captura de pantalla:

- El siguiente paso es seleccionar el runtime de Azure Functions, así como el desencadenador. Selecciona Azure Functions v2 (.NET Core), elige desencadenador de blob y proporciona la siguiente información:
° Cuenta de almacenamiento (AzureWebJobsStorage): el nombre de la cuenta de almacenamiento en la que reside el contenedor de blobs
° Configuración de cadena de conexión: el nombre de clave de la cadena de conexión que hace referencia a la cuenta de almacenamiento
° Ruta: el nombre del contenedor de blobs en el que se cargan los archivos de Excel

- Cuando crees el proyecto, la estructura debe tener un aspecto similar a la siguiente captura de pantalla:

- Vamos a añadir una cadena de conexión denominada StorageConnection (recuerda que la hemos utilizado en el archivo de configuración de la cadena de conexión en uno de los pasos anteriores) a local.settings.json, tal como se muestra en la siguiente captura de pantalla:

- Abre el archivo Function1.cs y cámbiale el nombre por
ExcelImportBlobTrigger. Asimismo, sustituye Function1 (el nombre de la función) por ExcelImportBlobTrigger (línea 10), tal como se muestra en la siguiente captura de pantalla:

- Configura ExcelImport.DurableFunctions como proyecto predeterminado, tal como se muestra en la siguiente captura de pantalla:

- Define un punto de interrupción en ExcelImportBlobTrigger y ejecuta la aplicación. Para ello, pulsa la tecla F5. Si todo está configurado correctamente, en la consola debería aparecer lo siguiente:

- Vamos a cargar un nuevo archivo mediante la ejecución de la aplicación ExcelImport.Client. Inmediatamente después de cargar el archivo, se iniciará el desencadenador de blob, tal como se muestra en la siguiente captura de pantalla. Los puntos de interrupción se deben alcanzar junto con lo siguiente:

Ya hemos creado el desencadenador de blob que se inicia cuando se añade un nuevo blob al contenedor de blobs.
Cómo hacerlo…
En esta receta, hemos creado una nueva aplicación de función basada en el runtime de Azure Functions V2, que se basa en el marco de .NET Core y se puede ejecutar en todas las plataformas compatibles con .NET Core (como Windows y Linux OSes). También hemos creado un desencadenador de blob y lo hemos configurado para que se ejecute cuando se añade un nuevo blob mediante la configuración de la cadena de conexión. Además, hemos creado un archivo de configuración local.setting.json para almacenar los valores de configuración que se utilizan en el desarrollo local.
Tras crear el desencadenador de blob, hemos ejecutado la aplicación ExcelImport. Client para cargar un archivo y validar que se ejecuta el desencadenador de blob.
Y eso no es todo…
Todas las configuraciones se obtendrán del archivo local.settings.json al ejecutar las funciones en el entorno local. Sin embargo, cuando implementes las funciones en Azure, la referencia a los elementos de configuración (como la cadena de conexión y la configuración de la aplicación) se obtendrá de la configuración de la aplicación de la aplicación de función. Asegúrate de crear todos los elementos de configuración de la aplicación de función después de implementar las funciones.
Crear el orquestador durable y activarlo para cada importación de Excel
Esta receta es una de las más importantes e interesantes. Vamos a aprender a crear el orquestador durable encargado de gestionar las funciones de actividad que creemos para las distintas tareas individuales necesarias para completar el proyecto ExcelImport.
Cómo hacerlo…
Sigue estos pasos:
- Crea una nueva función. Para ello, haz clic en ExcelImport.
DurableFunctions y en Agregar, y selecciona Nueva función de Azure, tal como se muestra en la siguiente captura de pantalla:

- En la ventana emergente Agregar nuevo elemento, selecciona Función de Azure, escribe el nombre ExcelImport_Orchestrator y haz clic en Agregar, tal como se muestra en la siguiente captura de pantalla:

- En la ventana emergente Nueva función de Azure, selecciona la plantilla de orquestación de Durable Functions y haz clic en el botón Aceptar, que crea lo siguiente:
° HttpStart: se trata de la función de inicio de Durable Functions (un desencadenador de HTTP), que funciona como un cliente que invoca el orquestador durable. Sin embargo, en nuestro proyecto, no utilizaremos este desencadenador de HTTP. En su lugar, usaremos su lógica interna en nuestro desencadenador de blob ExcelImportBlobTrigger para invocar el orquestador durable.
° RunOrchestrator: se trata del orquestador durable que puede invocar y gestionar las funciones de actividad.
° SayHello: se trata de una función de actividad sencilla, de las que vamos a crear unas cuantas. Elimina el siguiente método:

- En el desencadenador de blob ExcelImportBlobTrigger, vamos a aplicar los siguientes cambios al código para invocar el orquestador.
° Configura la función para que sea asíncrona.
° Añade los enlaces de salida del cliente de orquestación.
° Llama a StartNewAsync mediante DurableOrchestrationClient.
- El código de la función ExcelImportBlobTrigger debe tener el siguiente aspecto tras aplicar los cambios:
using System.IO; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Host; using Microsoft.Extensions.Logging; namespace ExcelImport.DurableFunctions
{
public static class ExcelImportBlobTrigger
{
[FunctionName(“ExcelImportBlobTrigger”)] public static async void Run(
[BlobTrigger(“Excelimports/{name}”, Connection =
“StorageConnection”)]Stream myBlob, string name,
[OrchestrationClient]DurableOrchestrationClient starter,
ILogger log)
{
string instanceId = await starter.StartNewAsync(“ExcelImport_
Orchestrator”, name);
log.LogInformation($”C# Blob trigger function Processed blob\n
Name:{name} \n Size: {myBlob.Length} Bytes”);
}
}
}
- Define un punto de interrupción en la función de orquestador ExcelImport_ Orchestrator y ejecuta la aplicación mediante la tecla F5.
- Vamos a cargar un archivo nuevo (mientras se ejecuta ExcelImport.
DurableFunctions) mediante la ejecución de la función ExcelImport.
Client. También puedes cargar el archivo de Excel directamente desde Azure Portal. Tras cargar el archivo y transcurridos unos momentos, se debería alcanzar el punto de interrupción de la función ExcelImport_ Orchestrator, tal como se muestra en la siguiente captura de pantalla:

Hemos aprendido a invocar la función de orquestación duradera desde el desencadenador de blob.
Cómo funciona…
Hemos comenzado la receta mediante la creación de la función de orquestación y hemos aplicado cambios al desencadenador de blob ExcelImportBlobTrigger mediante la adición de enlaces de salida OrchestratonClient para invocar la función de orquestador durable.
Cuando se crea una nueva función de orquestación, esta crea funciones de actividad. En las próximas recetas, las eliminaremos y crearemos nuevas funciones de actividad según nuestros requisitos.
Y eso no es todo…
En esta receta, hemos utilizado DurableOrchestrationClient, que sabe cómo iniciar y finalizar las orquestaciones duraderas.
A continuación, se indican algunas de las operaciones importantes que se admiten:
- Iniciar una instancia mediante el método StartNewAsync
- Finalizar una instancia mediante el método TerminateAsync
- Consultar el estado de la instancia en ejecución mediante el método GetStatusAsync
- También puede generar un evento en la instancia para actualizar los eventos externos mediante el método RaiseEventAsync
Puedes ver más información sobre esto en https://docs.
microsoft.com/en-us/azure/azure-functions/durablefunctions-instance-management#sending-events-toinstances.
Leer datos de Excel mediante funciones de actividad
En esta receta, recuperaremos todos los datos de hojas de Excel específicas mediante la escritura de una función de actividad.
Vamos a aplicar unos cambios al código de la función de orquestación mediante la escritura de una nueva función de actividad que pueda leer los datos de una hoja de Excel que se cargue en el contenedor de blobs.
Preparación
En esta receta, crearemos el desencadenador de actividad denominado función ReadExcel_AT que lee los datos del blob almacenado en la cuenta de almacenamiento. Este desencadenador de actividad realiza los siguientes trabajos:
Se conecta al blob mediante una función, ReadBlob, de una clase denominada StorageManager.
- Lee los datos del Excel mediante un componente denominado EPPlus. Puedes obtener más información sobre este tema en https://github.com/ JanKallman/EPPlus.
- Devuelve los datos del archivo de Excel en forma de colección de objetos de empleados.
A continuación, instala los siguientes paquetes NuGet en el proyecto ExcelImport.
DurableFunctions:
Install-Package WindowsAzure.Storage
Install-Package EPPlus
Cómo hacerlo…
Si nos planteamos que Durable Functions es un flujo de trabajo, la función de desencadenador de actividad se puede considerar un paso del flujo de trabajo que obtiene información de entrada opcional, realiza una funcionalidad y produce información de salida opcional. Es uno de los conceptos fundamentales de Durable Functions de Azure.
Puedes obtener más información sobre el desencadenador de actividad
en https://docs.microsoft.com/en-us/azure/azurefunctions/durable-functions-types-features-overview.
Antes de empezar a crear la función de desencadenador de actividad, vamos a crear las funciones de dependencia.
Leer datos de Blob Storage
Sigue estos pasos:
1. Crea una clase denominada StorageManager y pégala en el siguiente código. Este código se conecta a la cuenta de almacenamiento especificada, lee los datos de los blobs y devuelve un objeto stream a la función de autor de la llamada:
class StorageManager
{
public async Task<Stream> ReadBlob(string BlobName)
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(“local.settings.json”, optional: true, reloadOnChange: true); IConfigurationRoot configuration = builder.Build();
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.
Parse(configuration.GetConnectionString(“StorageConnection”));
CloudBlobClient cloudBlobClient = cloudStorageAccount.
CreateCloudBlobClient();
CloudBlobContainer ExcelBlobContainer = cloudBlobClient.
GetContainerReference(“Excel”);
CloudBlockBlob cloudBlockBlob = ExcelBlobContainer.GetBlockBlobRe ference(BlobName);
return await cloudBlockBlob.OpenReadAsync();
}
}
- Pega las siguientes referencias de espacio de nombres en la clase StorageManager:
using Microsoft.Extensions.Configuration; using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Blob; using System.IO; using System.Threading.Tasks;
- Por último, añade una cadena de conexión (si no lo has hecho ya) de la cuenta de almacenamiento al archivo local.settings.json, tal como se muestra aquí:

Leer datos de Excel desde la secuencia
Sigue estos pasos:
1. Crea una clase denominada EPPLusExcelManager y pégala en el siguiente código. Esta clase tiene un método denominado ReadExcelData, que utiliza una biblioteca llamada EPPlus para leer los datos del archivo de Excel (extensión.xlsx). Lee todas las filas, crea un objeto Employee para cada fila y devuelve una colección de empleados. Vamos a crear la clase Employee en un momento:
class EPPLusExcelManager
{
public List<Employee> ReadExcelData(Stream stream)
{
List<Employee> employees = new List<Employee>();
//FileInfo existingFile = new FileInfo(“EmployeeInformation.
xlsx”);
using (ExcelPackage package = new ExcelPackage(stream))
{
ExcelWorksheet ExcelWorksheet = package.Workbook.Worksheets[0]; for (int EmployeeIndex = 2; EmployeeIndex < ExcelWorksheet.
Dimension.Rows + 1; EmployeeIndex++)
{
employees.Add(new Employee()
{
EmpId = Convert.ToString(ExcelWorksheet.Cells[EmployeeIndex,
1].Value),
Name = Convert.ToString(ExcelWorksheet.Cells[EmployeeIndex,
2].Value),
Email = Convert.ToString(ExcelWorksheet.Cells[EmployeeIndex,
3].Value),
PhoneNumber = Convert.ToString(ExcelWorksheet.
Cells[EmployeeIndex, 4].Value)
});
} }
return employees;
}
}
2. Vamos a crear otra clase denominada Employee y a copiar el siguiente código:
public class Employee
{
public string EmpId { get; set; } public string Name { get; set; } public string Email { get; set; } public string PhoneNumber { get; set; } }
Si compilas la aplicación ahora, no debería producirse ningún error. Ya hemos terminado el desarrollo de las dependencias para nuestra primera función de desencadenador de actividad. Ahora vamos a empezar a crear el desencadenador de actividad.
Crear la función de actividad
Sigue estos pasos:
1. Crea una función de actividad denominada ReadExcel_AT que se conecte al blob mediante la clase StorageManager que hemos desarrollado en la sección anterior y que después lea los datos mediante la clase EPPLusExcelManager. Copia el siguiente código en la clase ExcelImport_Orchestrator:
[FunctionName(“ReadExcel_AT”)]
public static async Task<List<Employee>> ReadExcel_AT(
[ActivityTrigger] string name,
ILogger log)
{
log.LogInformation(“Orchestration started”);
StorageManager storageManager = new StorageManager();
Stream stream = null; ;
log.LogInformation(“Reading the Blob Started”); stream = await storageManager.ReadBlob(name); log.LogInformation(“Reading the Blob has Completed”);
EPPLusExcelManager ePPLusExcelManager = new EPPLusExcelManager(); log.LogInformation(“Reading the Excel Data Started”);
List<Employee> employees = ePPLusExcelManager.
ReadExcelData(stream);
log.LogInformation(“Reading the Blob has Completed”); return employees; }
- Si no existe, añade System.IO a la lista de espacios de nombres y compila la aplicación.
- Vamos a invocar esta función de actividad desde el orquestador. Ve a la función de orquestador ExcelImport_Orchestrator y sustitúyela por el siguiente código. La función de orquestación invoca la función de actividad. Para ello, pasa el nombre del Excel que se carga para que la función de actividad lea los datos del archivo de Excel:
[FunctionName(“ExcelImport_Orchestrator”)] public static async Task<List<string>> RunOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
var outputs = new List<string>();
string ExcelFileName = context.GetInput<string>();
List<Employee> employees = await context.CallActivityAsync<List<E mployee>>(“ReadExcel_AT”, ExcelFileName); return outputs;
}
- Vamos a ejecutar la aplicación y después cargaremos un archivo de Excel. Si todo está configurado correctamente, deberías ver algo parecido a lo que se muestra en la función de desencadenador de actividad ReadExcel_AT, donde aparece el número de registros de empleados que se leen desde la hoja de Excel:

Y eso no es todo…
La función de orquestador recibe la información de entrada mediante el método GetInput() de la clase DurableOrchestratorContext. Esta información de entrada la pasa el desencadenador de blob mediante el método de función StartNewAsync de la clase DurableOrchestrationClient.
Escalar automáticamente el rendimiento de Cosmos DB
En la receta anterior, hemos leído los datos de Excel y los hemos puesto en una colección de empleados. El siguiente paso es insertar la colección en una colección de Cosmos DB. Sin embargo, antes de insertar los datos en la colección de Cosmos DB, debemos entender que en situaciones reales, el número de registros que tendríamos que importar sería enorme. Por ello, podrías enfrentarte a problemas de rendimiento si la capacidad de la colección de Cosmos DB no es suficiente.
El rendimiento de la colección de Cosmos DB se mide mediante el número de unidades de solicitud (RU) asignadas a la colección. Puedes obtener más información sobre este tema en https://docs. microsoft.com/en-us/azure/cosmos-db/request-units.
Además, con el fin de reducir los costes de cada servicio, se recomienda que la capacidad sea inferior y se amplíe conforme sea necesario. La API de Cosmos DB nos permite controlar el número de RU en función de nuestras necesidades. Como necesitamos hacer una importación masiva, aumentaremos las RU antes de empezar a importar los datos. Una vez finalizado el proceso de importación, podemos reducir las RU al mínimo.
Preparación
Establece los siguientes requisitos previos:
- Crea una cuenta de Cosmos DB con las instrucciones indicadas en el artículo de https://docs.microsoft.com/en-us/azure/cosmos-db/create-sqlapi-dotnet.
- Crea una base de datos de Cosmos DB y una colección con almacenamiento fijo y establece las unidades de solicitud en 400 por segundo, tal como se muestra en la siguiente captura de pantalla:

Para simplificar la tarea, he establecido Fija (10 GB) como Capacidad de almacenamiento. Sin embargo, en cargas de producción, en función de los modelos de datos, es posible que debas establecer una capacidad de almacenamiento Ilimitada.
- Ejecuta el siguiente comando en el administrador de paquetes NuGet para instalar las dependencias de Cosmos DB:
Install-Package Microsoft.Azure.WebJobs.Extensions.CosmosDB
Cómo hacerlo…
Sigue estos pasos:
1. Crea un nuevo desencadenador de actividad denominado ScaleRU_AT en el archivo ExcelImport_Orchestrator.cs. La función debe tener un aspecto similar. Acepta que el número de RU se pueda aumentar, junto con el enlace de Cosmos DB con el que hemos sustituido el rendimiento:
[FunctionName(“ScaleRU_AT”)]
public static async Task<string> ScaleRU_AT(
[ActivityTrigger] int RequestUnits,
[CosmosDB(ConnectionStringSetting = “CosmosDBConnectionString”)]
DocumentClient client
)
{
DocumentCollection EmployeeCollection = await client.ReadDocumen tCollectionAsync(UriFactory.CreateDocumentCollectionUri(“cookbook db”, “EmployeeCollection”));
Offer offer = client.CreateOfferQuery().Where(o => o.ResourceLink
== EmployeeCollection.SelfLink).AsEnumerable().Single();
Offer replaced = await client.ReplaceOfferAsync(new
OfferV2(offer, RequestUnits));
return $”The RUs are scaled to 500 RUs!”; }
- Añade los siguientes espacios de nombres al archivo ExcelImport_ Orchestrator.cs:
using System.Linq; using Microsoft.Azure.Documents; using Microsoft.Azure.Documents.Client;
- Crea una nueva cadena de conexión para Cosmos DB, tal como se muestra en la siguiente captura de pantalla. Puedes copiar la conexión desde la hoja Claves de la cuenta de Cosmos DB:

- En la función ExcelImport_Orchestrator, añade la siguiente línea para invocar ScaleRU_AT. En este ejemplo, he utilizado 500 como valor de RU. En función de tus necesidades, puedes elegir un valor diferente: await context.CallActivityAsync<string>(“ScaleRU_AT”, 500);
- Carga un archivo de Excel para activar la orquestación, que invoca internamente el nuevo desencadenador de actividad, ScaleRU_AT. Si todo ha ido bien, la nueva capacidad de la colección de Cosmos DB debe ser 500. Vayamos a la pestaña Explorador de datos de Cosmos DB, a la sección de escala y configuración, donde verás 500 como nuevo rendimiento de la colección, tal como se muestra a continuación:

Y eso no es todo…
La capacidad de la colección de Cosmos DB se representa en forma de recurso denominado oferta. En esta receta, hemos recuperado la oferta existente y la hemos sustituido por una nueva. Puedes ver más información sobre el tema en https:// docs.microsoft.com/en-us/rest/api/cosmos-db/offers.
Insertar masivamente datos en Cosmos DB
Ya hemos aumentado el tamaño de la colección. Ahora vamos a insertar los datos en la colección de Cosmos DB. Para que esta receta sea fácil y directa, aprenderemos una de las formas más sencillas de insertar datos en Cosmos DB.
Cómo hacerlo…
Sigue estos pasos:
1. Crea un nuevo desencadenador de actividad denominado ImportData_ AT, que utiliza la colección de empleados como información de entrada y guarda los datos en la colección. Pega el siguiente código en el nuevo desencadenador de actividad:
[FunctionName(“ImportData_AT”)]
public static async Task<string> ImportData_AT(
[ActivityTrigger] List<Employee> employees,
[CosmosDB(ConnectionStringSetting = “CosmosDBConnectionString”)]
DocumentClient client,
ILogger log)
{
foreach (Employee employee in employees)
{
await client.CreateDocumentAsync(UriFactory.CreateDocumentCollect ionUri(“cookbookdb”, “EmployeeCollection”), employee); log.LogInformation($”Successfully inserted {employee.Name}.”);
}
return $”Data has been imported to Cosmos DB Collection
Successfully!”;
}
2. Vamos a añadir la siguiente línea a la función de orquestación que invoca el desencadenador de actividad ImportData_AT:
await context.CallActivityAsync<string>(“ImportData_AT”,
employees);
Vamos a ejecutar la aplicación y a cargar un archivo de Excel para probar la funcionalidad. Si todo ha ido bien, deberías ver los registros creados en la colección de Cosmos DB, tal como se muestra a continuación:

Y eso no es todo…
El equipo de Cosmos DB ha publicado una biblioteca denominada Cosmos DB Bulk Executor. Puedes ver más información sobre el tema en https://docs.microsoft. com/en-us/azure/cosmos-db/bulk-executor-overview.
En esta receta, he codificado de forma rígida el nombre de la colección y la base de datos para simplificar la tarea. Tendrás que configurarlos en el archivo de configuración de la aplicación.