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 inicio rápido, usará las herramientas de línea de comandos de Azure Developer para crear un flujo de trabajo sin servidor que organice varias tareas que se ejecutan en paralelo. Creas recursos en Azure, verificas el código localmente y luego lo despliegas en una nueva aplicación de funciones serverless que se ejecuta en un plan Flex Consumption en Azure Functions.
El proyecto usa la CLI para desarrolladores de Azure (azd) para simplificar la implementación del código en Azure. Esta implementación sigue los procedimientos recomendados actuales para implementaciones de Azure Functions seguras y escalables. En este inicio rápido se muestra el patrón distribución ramificada de salida/entrada en Funciones duraderas, una extensión que orquesta flujos de trabajo con estado de ejecución duradera. La muestra utiliza el Durable Task Scheduler, un backend totalmente gestionado para Durable Functions que reemplaza al backend de Azure Storage. En el ejemplo, los títulos del artículo se recuperan en paralelo: la orquestación realiza una distribución ramificada de salida a múltiples actividades que se ejecutan simultáneamente, luego realiza una distribución ramificada de entrada para agregar los resultados.
De forma predeterminada, el plan Flex Consumption sigue un modelo de facturación de pago por uso, lo que implica que completar esta iniciación rápida conllevará un pequeño costo de unos pocos centavos de dólar estadounidense o menos en su cuenta de Azure.
Prerequisites
Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
- SDK de .NET 10
Inicialización del proyecto
Use el azd init comando para crear un proyecto de código local de Durable Functions a partir de una plantilla.
En el terminal local o el símbolo del sistema, ejecute este comando
azd initen una carpeta vacía:azd init --template durable-functions-quickstart-dotnet-azd -e dfquickstart-dotnetEste comando extrae los archivos del proyecto del repositorio template e inicializa el proyecto en una nueva carpeta. La marca
-eestablece un nombre para el entorno actual. Enazd, el entorno mantiene un contexto de implementación único para la aplicación y puede definir más de uno. El nombre del entorno también se usa en el nombre del grupo de recursos que crea en Azure.Cambia al directorio del proyecto y luego navega a la
fanoutfanincarpeta de la app:cd durable-functions-quickstart-dotnet-azd/fanoutfanin
En el terminal local o el símbolo del sistema, ejecute este comando
azd initen una carpeta vacía:azd init --template durable-functions-quickstart-python-azd -e dfquickstart-pythonEste comando extrae los archivos del proyecto del repositorio template e inicializa el proyecto en una nueva carpeta. La marca
-eestablece un nombre para el entorno actual. Enazd, el entorno mantiene un contexto de implementación único para la aplicación y puede definir más de uno. El nombre del entorno también se usa en el nombre del grupo de recursos que crea en Azure.Cambia al directorio del proyecto y luego navega a la
srccarpeta de la app:cd durable-functions-quickstart-python-azd/src
En el terminal local o el símbolo del sistema, ejecute este comando
azd initen una carpeta vacía:azd init --template durable-functions-quickstart-typescript-azd -e dfquickstart-typescriptEste comando extrae los archivos del proyecto del repositorio template e inicializa el proyecto en una nueva carpeta. La marca
-eestablece un nombre para el entorno actual. Enazd, el entorno mantiene un contexto de implementación único para la aplicación y puede definir más de uno. El nombre del entorno también se usa en el nombre del grupo de recursos que crea en Azure.Cambia al directorio del proyecto y luego navega a la
srccarpeta de la app:cd durable-functions-quickstart-typescript-azd/src
En el terminal local o el símbolo del sistema, ejecute este comando
azd initen una carpeta vacía:azd init --template durable-functions-quickstart-java-azd -e dfquickstart-javaEste comando extrae los archivos del proyecto del repositorio template e inicializa el proyecto en una nueva carpeta. La marca
-eestablece un nombre para el entorno actual. Enazd, el entorno mantiene un contexto de implementación único para la aplicación y puede definir más de uno. El nombre del entorno también se usa en el nombre del grupo de recursos que crea en Azure.Cambie al directorio del proyecto:
cd durable-functions-quickstart-java-azd
En el terminal local o el símbolo del sistema, ejecute este comando
azd initen una carpeta vacía:azd init --template durable-functions-quickstart-javascript-azd -e dfquickstart-javascriptEste comando extrae los archivos del proyecto del repositorio template e inicializa el proyecto en una nueva carpeta. La marca
-eestablece un nombre para el entorno actual. Enazd, el entorno mantiene un contexto de implementación único para la aplicación y puede definir más de uno. El nombre del entorno también se usa en el nombre del grupo de recursos que crea en Azure.Cambia al directorio del proyecto y luego navega a la
srccarpeta de la app:cd durable-functions-quickstart-javascript-azd/src
En el terminal local o el símbolo del sistema, ejecute este comando
azd initen una carpeta vacía:azd init --template durable-functions-quickstart-powershell-azd -e dfquickstart-powershellEste comando extrae los archivos del proyecto del repositorio template e inicializa el proyecto en una nueva carpeta. La marca
-eestablece un nombre para el entorno actual. Enazd, el entorno mantiene un contexto de implementación único para la aplicación y puede definir más de uno. El nombre del entorno también se usa en el nombre del grupo de recursos que crea en Azure.Cambia al directorio del proyecto y luego navega a la
srccarpeta de la app:cd durable-functions-quickstart-powershell-azd/src
Aprovisionamiento de los recursos de Azure
Este proyecto utiliza el azd provision comando para crear los recursos necesarios de Azure, incluyendo una nueva aplicación de funciones en un plan de Consumo Flexible, un Planificador de Tareas Durable y un centro de tareas.
Tip
El proyecto incluye un conjunto de archivos Bicep (en la carpeta infra) que azd usa para crear una implementación segura en un plan de consumo Flex que siga los procedimientos recomendados.
Vuelve a la carpeta raíz del proyecto (la carpeta que contiene el
azure.yamlarchivo):cd ..
- Asegúrate de seguir en la carpeta raíz del proyecto (la carpeta que contiene el
azure.yamlarchivo).
Ejecuta este comando para autenticarte con tu cuenta de Azure:
azd auth loginEjecuta este comando desde la carpeta raíz del proyecto para crear
azdlos recursos de Azure necesarios:azd provisionLa carpeta raíz contiene el
azure.yamlarchivo de definición de requerido porazd.Cuando se le solicite, proporcione estos parámetros de implementación necesarios:
Parámetro Description Suscripción a Azure Suscripción en la que se crean los recursos. Si tu cuenta tiene más de un inquilino, primero debes elegir a tu inquilino. Ubicación de Azure Región de Azure en la que se creará el grupo de recursos que contiene los nuevos recursos de Azure. Solo se muestran las regiones que admiten actualmente el plan de consumo flexible. vnetEnabled Si desplegar en una red virtual. Para este inicio rápido, selecciona falso. El
azd provisioncomando utiliza tus respuestas a estos prompts con los archivos de configuración de Bicep para crear y configurar estos recursos de Azure necesarios:- Plan de Consumo flexible y aplicación de funciones
- Azure Storage (obligatorio) y Application Insights (recomendado)
- Programador de tareas y centro de tareas duraderas
- Directivas y roles de acceso para la cuenta
- Conexiones de servicio a servicio mediante identidades administradas (en lugar de cadenas de conexión almacenadas)
Una vez que el comando se complete correctamente, verá vínculos a los recursos que creó.
El aprovisionamiento también ejecuta un script posterior al aprovisionamiento que genera un archivo local.settings.json en la carpeta de la aplicación. Este archivo contiene la configuración de conexión para el endpoint desplegado del Durable Task Scheduler, que necesitas para ejecutar el proyecto localmente.
Iniciar Azurite
Para ejecutar el proyecto localmente, el entorno de ejecución de Functions necesita un emulador de almacenamiento local. La configuración "AzureWebJobsStorage": "UseDevelopmentStorage=true" en el archivo local.settings.json indica al entorno de ejecución que use Azurite para ello.
En una nueva ventana de terminal, ejecuta este comando para iniciar Azurite:
azurite --skipApiVersionCheck --location ~/azurite-data
Mantén Azurite funcionando en esta ventana de terminal mientras pruebas localmente.
Ejecución en el entorno local
En tu terminal original, ve a la
fanoutfanincarpeta de aplicaciones y inicia el host de Funciones:cd fanoutfanin func startCuando el host de Functions se inicia en la carpeta del proyecto local, escribe los puntos de conexión de dirección URL locales de las funciones desencadenadas por HTTP en la salida del terminal.
Note
Dado que la autorización de claves de acceso no se fuerza al ejecutarse localmente, no necesita una clave de acceso para llamar a la función.
En el explorador, realice una solicitud GET al punto de conexión que inicie la orquestación:
http://localhost:7071/api/FetchOrchestration_HttpStart
Esta solicitud inicia una nueva instancia de orquestación. La orquestación realiza una distribución ramificada de salida a varias actividades para recuperar los títulos de los artículos de Microsoft Learn en paralelo. Cuando finalicen las actividades, la orquestación converge de nuevo y devuelve los títulos como una cadena con formato.
En tu terminal original, ve a la
srccarpeta app, crea y activa un entorno virtual, instala dependencias y inicia el host de Funciones:cd srcLa forma en que creas y activas tu entorno virtual (llamado
.venv) depende de tu terminal:python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt func startCuando el host de Functions se inicia en la carpeta del proyecto local, escribe los puntos de conexión de dirección URL locales de las funciones desencadenadas por HTTP en la salida del terminal.
Note
Dado que la autorización de claves de acceso no se fuerza al ejecutarse localmente, no necesita una clave de acceso para llamar a la función.
En el explorador, realice una solicitud GET al punto de conexión de inicio HTTP:
http://localhost:7071/api/orchestrators/fetch_orchestration
Esta solicitud inicia una nueva instancia de orquestación. La orquestación realiza una distribución ramificada de salida a varias actividades para recuperar los títulos de los artículos de Microsoft Learn en paralelo. Cuando finalicen las actividades, la orquestación converge de nuevo y devuelve los títulos como una cadena con formato.
En tu terminal original, ve a la
srccarpeta de la app, instala las dependencias, construye el proyecto y inicia el host de Funciones:cd src npm install npm run build func startCuando el host de Functions se inicia en la carpeta del proyecto local, escribe los puntos de conexión de dirección URL locales de las funciones desencadenadas por HTTP en la salida del terminal.
Note
Dado que la autorización de claves de acceso no se fuerza al ejecutarse localmente, no necesita una clave de acceso para llamar a la función.
En el explorador, realice una solicitud GET al punto de conexión de inicio HTTP:
http://localhost:7071/api/orchestrators/fetchOrchestration
Esta solicitud inicia una nueva instancia de orquestación. La orquestación realiza una distribución ramificada de salida a varias actividades para recuperar los títulos de los artículos de Microsoft Learn en paralelo. Cuando finalicen las actividades, la orquestación converge de nuevo y devuelve los títulos como una cadena con formato.
En tu terminal original, construye el proyecto y luego inicia el host de Funciones desde la carpeta de salida de compilación:
mvn clean package cd target/azure-functions/durable-functions-quickstart func startCuando el host de Functions se inicia en la carpeta del proyecto local, escribe los puntos de conexión de dirección URL locales de las funciones desencadenadas por HTTP en la salida del terminal.
Note
Dado que la autorización de claves de acceso no se fuerza al ejecutarse localmente, no necesita una clave de acceso para llamar a la función.
En el explorador, realice una solicitud GET al punto de conexión que inicie la orquestación:
http://localhost:7071/api/FetchOrchestration_HttpStart
Esta solicitud inicia una nueva instancia de orquestación. La orquestación realiza una distribución ramificada de salida a varias actividades para recuperar los títulos de los artículos de Microsoft Learn en paralelo. Cuando finalicen las actividades, la orquestación converge de nuevo y devuelve los títulos como una cadena con formato.
En tu terminal original, ve a la
srccarpeta de aplicaciones, instala dependencias y inicia el host de Funciones:cd src npm install func startCuando el host de Functions se inicia en la carpeta del proyecto local, escribe los puntos de conexión de dirección URL locales de las funciones desencadenadas por HTTP en la salida del terminal.
Note
Dado que la autorización de claves de acceso no se fuerza al ejecutarse localmente, no necesita una clave de acceso para llamar a la función.
En el explorador, realice una solicitud GET al punto de conexión que inicie la orquestación:
http://localhost:7071/api/FetchOrchestration_HttpStart
Esta solicitud inicia una nueva instancia de orquestación. La orquestación realiza una distribución ramificada de salida a varias actividades para recuperar los títulos de los artículos de Microsoft Learn en paralelo. Cuando finalicen las actividades, la orquestación converge de nuevo y devuelve los títulos como una cadena con formato.
En tu terminal original, ve a la
srccarpeta de aplicaciones y inicia el host de Funciones:cd src func startCuando el host de Functions se inicia en la carpeta del proyecto local, escribe los puntos de conexión de dirección URL locales de las funciones desencadenadas por HTTP en la salida del terminal.
Note
Dado que la autorización de claves de acceso no se fuerza al ejecutarse localmente, no necesita una clave de acceso para llamar a la función.
En el explorador, realice una solicitud GET al punto de conexión que inicie la orquestación:
http://localhost:7071/api/FetchOrchestration_HttpStart
Esta solicitud inicia una nueva instancia de orquestación. La orquestación realiza una distribución ramificada de salida a varias actividades para recuperar los títulos de los artículos de Microsoft Learn en paralelo. Cuando finalicen las actividades, la orquestación converge de nuevo y devuelve los títulos como una cadena con formato.
El punto de conexión HTTP devuelve una respuesta JSON con varias direcciones URL. El
statusQueryGetUriextremo proporciona el estado de orquestación.Copie el valor del
statusQueryGetUriy péguelo en su navegador o herramienta de prueba HTTP para comprobar el estado de la orquestación. Cuando se complete la orquestación, verá los títulos de artículos recuperados en la respuesta.Cuando haya terminado, presione Ctrl+C en la ventana del terminal para detener el proceso de host de
func.
- Ejecute
deactivatepara apagar el entorno virtual.
Revisión del código (opcional)
Puede revisar el código que implementa el patrón de distribución ramificada de entrada y salida:
Se realiza un seguimiento de las actividades de captura de título mediante una lista de tareas dinámicas. La línea await Task.WhenAll(parallelTasks); espera a que se completen todas las actividades llamadas, que se ejecutan simultáneamente. Al terminar, todas las salidas se agregan como una cadena formateada.
[Function(nameof(FetchOrchestration))]
public static async Task<string> RunOrchestrator(
[OrchestrationTrigger] TaskOrchestrationContext context)
{
ILogger logger = context.CreateReplaySafeLogger(nameof(FetchOrchestration));
logger.LogInformation("Fetching data.");
var parallelTasks = new List<Task<string>>();
// List of URLs to fetch titles from
var urls = new List<string>
{
"https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-overview",
"https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/durable-task-scheduler",
"https://learn.microsoft.com/azure/azure-functions/functions-scenarios",
"https://learn.microsoft.com/azure/azure-functions/functions-create-ai-enabled-apps",
};
// Run fetching tasks in parallel
foreach (var url in urls)
{
Task<string> task = context.CallActivityAsync<string>(nameof(FetchTitleAsync), url);
parallelTasks.Add(task);
}
// Wait for all the parallel tasks to complete before continuing
await Task.WhenAll(parallelTasks);
// Return fetched titles as a formatted string
return string.Join("; ", parallelTasks.Select(t => t.Result));
}
Puede revisar el proyecto de plantilla completo here.
Se realiza un seguimiento de las actividades de captura de título mediante una lista de tareas dinámicas. La línea yield context.task_all(tasks) espera a que se completen todas las actividades llamadas, que se ejecutan simultáneamente. Al terminar, todas las salidas se agregan como una cadena formateada.
# List of URLs to fetch titles from
urls = [
"https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-overview",
"https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/durable-task-scheduler",
"https://learn.microsoft.com/azure/azure-functions/functions-scenarios",
"https://learn.microsoft.com/azure/azure-functions/functions-create-ai-enabled-apps",
]
# Run fetching tasks in parallel
tasks = []
for url in urls:
task = context.call_activity("fetch_title", url)
tasks.append(task)
# Wait for all the parallel tasks to complete before continuing
results = yield context.task_all(tasks)
# Return fetched titles as a formatted string
return "; ".join(results)
@myApp.activity_trigger(input_name="url")
async def fetch_title(url: str):
"""Activity function that fetches the title from a URL."""
logger = logging.getLogger("FetchTitle")
logger.info(f"Fetching from url {url}.")
try:
async with ClientSession() as session:
Puede revisar el proyecto de plantilla completo here.
Se realiza un seguimiento de las actividades de captura de título mediante una lista de tareas dinámicas. La línea yield context.df.Task.all(parallelTasks) espera a que se completen todas las actividades llamadas, que se ejecutan simultáneamente. Al terminar, todas las salidas se agregan como una cadena formateada.
const urls = [
"https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-overview",
"https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/durable-task-scheduler",
"https://learn.microsoft.com/azure/azure-functions/functions-scenarios",
"https://learn.microsoft.com/azure/azure-functions/functions-create-ai-enabled-apps",
];
// Run fetching tasks in parallel
const parallelTasks = [];
for (const url of urls) {
const task = context.df.callActivity(fetchTitleActivityName, url);
parallelTasks.push(task);
}
// Wait for all the parallel tasks to complete before continuing
const results: string[] = yield context.df.Task.all(parallelTasks);
// Return fetched titles as a formatted string
return results.join("; ");
};
df.app.orchestration("fetchOrchestration", fetchOrchestration);
const fetchTitleAsync: ActivityHandler = async function (
url: string,
context: InvocationContext
Puede revisar el proyecto de plantilla completo here.
Se realiza un seguimiento de las actividades de captura de título mediante una lista de tareas dinámicas. La línea ctx.allOf(parallelTasks).await() espera a que se completen todas las actividades llamadas, que se ejecutan simultáneamente. Al terminar, todas las salidas se agregan como una cadena formateada.
@FunctionName("FetchOrchestration")
public String runOrchestrator(
@DurableOrchestrationTrigger(name = "taskOrchestrationContext") TaskOrchestrationContext ctx) {
List<String> urls = List.of(
"https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-overview",
"https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/durable-task-scheduler",
"https://learn.microsoft.com/azure/azure-functions/functions-scenarios",
"https://learn.microsoft.com/azure/azure-functions/functions-create-ai-enabled-apps"
);
// Fan out: run fetching tasks in parallel
List<Task<String>> parallelTasks = urls.stream()
.map(url -> ctx.callActivity("FetchTitle", url, String.class))
.collect(Collectors.toList());
// Fan in: wait for all parallel tasks to complete
List<String> results = ctx.allOf(parallelTasks).await();
// Return fetched titles as a formatted string
return String.join("; ", results);
}
Puede revisar el proyecto de plantilla completo here.
Se realiza un seguimiento de las actividades de captura de título mediante una lista de tareas dinámicas. La línea yield context.df.Task.all(parallelTasks) espera a que se completen todas las actividades llamadas, que se ejecutan simultáneamente. Al terminar, todas las salidas se agregan como una cadena formateada.
df.app.orchestration('fetchOrchestration', function* (context) {
context.log("Fetching data.");
const urls = [
"https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-overview",
"https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/durable-task-scheduler",
"https://learn.microsoft.com/azure/azure-functions/functions-scenarios",
"https://learn.microsoft.com/azure/azure-functions/functions-create-ai-enabled-apps",
];
// Fan out: run fetching tasks in parallel
const parallelTasks = urls.map(url => context.df.callActivity(activityName, url));
// Fan in: wait for all parallel tasks to complete
const results = yield context.df.Task.all(parallelTasks);
// Return fetched titles as a formatted string
return results.join("; ");
});
Puede revisar el proyecto de plantilla completo here.
Se realiza un seguimiento de las actividades de captura de título mediante una lista de tareas dinámicas. La línea Wait-ActivityFunction -Task $parallelTasks espera a que se completen todas las actividades llamadas, que se ejecutan simultáneamente. Al terminar, todas las salidas se agregan como una cadena formateada.
param($Context)
$urls = @(
"https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-overview",
"https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/durable-task-scheduler",
"https://learn.microsoft.com/azure/azure-functions/functions-scenarios",
"https://learn.microsoft.com/azure/azure-functions/functions-create-ai-enabled-apps"
)
# Fan out: run fetching tasks in parallel
$parallelTasks = @()
foreach ($url in $urls) {
$parallelTasks += Invoke-DurableActivity -FunctionName 'FetchTitle' -Input $url -NoWait
}
# Fan in: wait for all parallel tasks to complete
$results = Wait-ActivityFunction -Task $parallelTasks
# Return fetched titles as a formatted string
$output = $results -join "; "
$output
Puede revisar el proyecto de plantilla completo here.
Después de verificar tus funciones localmente, es hora de desplegarlas en Azure.
Implementar en Azure
Ejecuta este comando desde la carpeta raíz del proyecto para desplegar tu proyecto de código en la aplicación de funciones en Azure:
azd deploy
El azd deploy comando empaqueta y despliega tu código en la aplicación de funciones creada durante el aprovisionamiento. Una vez completado el comando, la aplicación se inicia y se ejecuta en el paquete desplegado.
Invocación de la función en Azure
Ahora puede invocar el punto de conexión de orquestación en Azure realizando una solicitud HTTP a su dirección URL. Cuando sus funciones se ejecutan en Azure, se aplica la autorización mediante clave de acceso, y es necesario proporcionar una clave de acceso de función con la solicitud.
Puede usar Core Tools para obtener la URL del endpoint del desencadenador HTTP que inicia la orquestación en Azure.
En el terminal local o el símbolo del sistema, ejecute estos comandos para obtener los valores del punto de conexión de dirección URL:
APP_NAME=$(azd env get-value AZURE_FUNCTION_NAME) func azure functionapp list-functions $APP_NAME --show-keysEl comando
azd env get-valueobtiene el nombre de la aplicación de funciones del entorno local. Cuando se usa la--show-keysopción confunc azure functionapp list-functions, el valor de Invoke URL: devuelto para cada punto de conexión incluye las claves de acceso de nivel de función necesarias.Usa un navegador o una herramienta de prueba HTTP para hacer una petición GET al endpoint HTTP start y así iniciar la orquestación en tu app de funciones que se ejecuta en Azure.
Reimplementación del código
Ejecuta azd deploy tantas veces como necesites para desplegar actualizaciones de código en tu app de funciones. Si necesitas actualizar los recursos de Azure, vuelve a ejecutarloazd provision.
Note
El paquete de implementación más reciente siempre sobrescribe los archivos de código implementados.
Las respuestas iniciales a azd mensajes y las variables de entorno generadas por azd se almacenan localmente en el entorno con nombre. Use el azd env get-values comando para revisar todas las variables del entorno que usó al crear recursos de Azure.
Limpieza de recursos
Cuando haya terminado de trabajar con la aplicación de funciones y los recursos relacionados, use este comando para eliminar la aplicación de funciones y sus recursos relacionados de Azure y evitar incurrir en costos adicionales:
azd down --no-prompt
Note
La --no-prompt opción indica azd que elimine el grupo de recursos sin una confirmación de usted.
Este comando no afecta al proyecto de código local.
Contenido relacionado
- Información general sobre Durable Functions
- Durable Task Modelo de programación
- Programador de tareas duraderas
- Escenarios de funciones de Azure
- Plan de consumo flexible
- CLI para desarrolladores de Azure (azd)
- Referencia a Azd