Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se describe cómo configurar varios desencadenadores de Azure Functions para que Azure Cosmos DB funcione en paralelo y reaccionar de forma independiente a los cambios.
Requisitos de arquitectura basada en eventos
Al compilar arquitecturas sin servidor con Azure Functions, se recomienda crear conjuntos de funciones pequeños que funcionen juntos en lugar de funciones de larga duración de gran tamaño.
A medida que crea flujos sin servidor basados en eventos mediante el desencadenador de Azure Functions para Azure Cosmos DB, se enfrentará a la situación en la que quiere hacer varias cosas cada vez que haya un nuevo evento en un contenedor específico de Azure Cosmos DB. Si las acciones que desea desencadenar son independientes entre sí, la solución ideal sería crear un desencadenador de Azure Functions para Azure Cosmos DB por cada acción que quiera realizar, todos ellos escuchando los cambios en el mismo contenedor de Azure Cosmos DB.
Optimización de contenedores para varios desencadenadores
Dados los requisitos del desencadenador de Azure Functions para Azure Cosmos DB, necesitamos un segundo contenedor para almacenar el estado, también denominado contenedor de concesiones. ¿Esto significa que necesita un contenedor de concesiones independiente para cada función de Azure?
Aquí tiene dos opciones:
- Crear un contenedor de concesiones por función: este enfoque puede traducirse en costos adicionales, a menos que use una base de datos de rendimiento compartido. Recuerde que el rendimiento mínimo a nivel de contenedor es de 400 unidades de solicitud y, en el caso del contenedor de arrendamientos, se utiliza únicamente para hacer un seguimiento del progreso y mantener el estado.
- Tener un contenedor de concesión y compartirlo para todas las funciones: esta segunda opción hace un mejor uso de las unidades de solicitud aprovisionadas en el contenedor, ya que permite que varias funciones de Azure compartan y usen el mismo rendimiento aprovisionado.
El objetivo de este artículo es guiarle para realizar la segunda opción.
Configuración de un contenedor de arrendamientos compartidos
Para configurar el contenedor de concesiones compartidas, la única configuración adicional que debe realizar en los desencadenadores es agregar el LeaseContainerPrefixatributo si usa C# o leaseContainerPrefixatributo si usa JavaScript. El valor del atributo debe ser un descriptor lógico de la función específica de ese desencadenador.
Por ejemplo, si tiene tres desencadenadores: uno que envía correos electrónicos, uno que realiza una agregación para crear una vista materializada y otro que envía los cambios a otro almacenamiento, para su análisis posterior, podría asignar el LeaseContainerPrefix de "correos electrónicos" al primero, "materializado" al segundo y "análisis" al tercero.
La parte importante es que los tres desencadenadores pueden usar la misma configuración de contenedor de concesiones (cuenta, base de datos y nombre de contenedor).
Un ejemplo de código muy sencillo que usa el LeaseContainerPrefix atributo en C#, tendría este aspecto:
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
[FunctionName("SendEmails")]
public static void SendEmails([CosmosDBTrigger(
databaseName: "ToDoItems",
containerName: "Items",
Connection = "CosmosDBConnection",
LeaseContainerName = "leases",
LeaseContainerPrefix = "emails")]IReadOnlyList<MyItem> items,
ILogger log)
{
...
}
[FunctionName("MaterializedViews")]
public static void MaterializedViews([CosmosDBTrigger(
databaseName: "ToDoItems",
containerName: "Items",
Connection = "CosmosDBConnection",
LeaseContainerName = "leases",
LeaseContainerPrefix = "materialized")]IReadOnlyList<MyItem> items,
ILogger log)
{
...
}
Y para JavaScript, puede aplicar la configuración en el function.json archivo, con el leaseContainerPrefix atributo :
{
"type": "cosmosDBTrigger",
"name": "documents",
"direction": "in",
"leaseContainerName": "leases",
"connection": "CosmosDBConnection",
"databaseName": "ToDoItems",
"containerName": "Items",
"leaseContainerPrefix": "emails"
},
{
"type": "cosmosDBTrigger",
"name": "documents",
"direction": "in",
"leaseContainerName": "leases",
"connection": "CosmosDBConnection",
"databaseName": "ToDoItems",
"containerName": "Items",
"leaseContainerPrefix": "materialized"
}
Nota:
Monitorea siempre las unidades de solicitud aprovisionadas en el contenedor de arrendamientos compartidos. Cada desencadenador que lo comparte aumentará el consumo promedio de rendimiento, por lo que es posible que tenga que aumentar el rendimiento aprovisionado a medida que aumenta el número de Azure Functions que lo usan.
Pasos siguientes
- Consulte la configuración completa del desencadenador de Azure Functions para Azure Cosmos DB.
- Compruebe la lista extendida de ejemplos de todos los idiomas.
- Visite las recetas sin servidor con el repositorio de GitHub de Azure Cosmos DB y Azure Functions para obtener más ejemplos.