El pasado 10 de noviembre del 2020 fue liberado el .Net 5. Sin embargo, un elemento que quedó fuera de este lanzamiento fueron las Azure Functions. No fue sino hasta el 10 de marzo del 2021 que fue liberada una versión de las Azure Functions que soporta el .Net 5.


Este es un post de una serie de posts relacionado a la ejecución de Azure Functions con .Net 5:
– Azure Functions con .Net 5 – Ejecución en proceso aislado
Azure Functions con .Net 5 – Inyección de dependencias


Con este release nos encontramos con un cambio en el modelo de ejecución. Y es aquí donde encontramos con que las Azure Functions ahora son ejecutadas en un proceso aislado.

Pero de qué viene el tema de ejecución en proceso aislado?

Desde sus inicios la aplicaciones de funciones de .Net y .Net Core se han ejecutado en el mismo proceso del host, trayendo consigo ventajas únicas como tener un conjunto de enlaces e inyecciones al SDK. Pero por otro lado, la ejecución de funciones para otros lenguajes es ejecutada en un modelo “out-of-process” (fuera del proceso) que permite ejecutar la funcionalidad en un proceso separado. Esto es, bajo la ejecución de un proceso que a su vez es el encargado de la ejecución de las funciones.

Es así como el equipo de desarrollo y soporte de las Azure Functions decide adoptar este modelo para el soporte en .Net 5. Teniendo así que si deseamos trabajar en esta versión, nos encontraremos con una nueva forma de trabajar.


El primer cambio que vamos a notar es que cuando creamos un nuevo proyecto, digamos en Visual Studio, nos encontraremos con la presencia de la clase Program.cs. La cual es el punto de entrada de la ejecución de las funciones, es decir, el proceso encargado de la ejecución.

Program.cs

Anteriormente, como lo comenta Facu (Facundo La Rocca) en su blog acá, en las Azure Functions para .Net Core 3.1, podíamos crear una clase que heredara de FunctionsStartup para que está fuera ejecutada al iniciar la ejecución.


Otro cambio con el que nos vamos a encontrar es con que los paquetes Nuget base que vamos a usar serán:

Microsoft.Azure.Functions.Worker
Microsoft.Azure.Functions.Worker.Sdk

y los paquetes de extensión de enlace serán:

Microsoft.Azure.Functions.Worker.Extensions.*

En donde * representa el o los paquetes de los trigger que estaremos utilizando en nuestras funciones. Por ejemplo:

Microsoft.Azure.Functions.Worker.Extensions.Http
Microsoft.Azure.Functions.Worker.Extensions.Timer

Por acá una tabla con los cambio o diferencias con Azure Functions para .Net 3.1

Característica/comportamientoEn proceso (.NET Core 3.1)Fuera de proceso (.NET 5.0)
Versiones de .NETLTS (.NET Core 3.1)Actual (.NET 5.0)
Paquetes baseMicrosoft.NET.Sdk.FunctionsMicrosoft.Azure.Functions.Worker
Microsoft.Azure.Functions.Worker.Sdk
Paquetes de extensión de enlaceMicrosoft.Azure.WebJobs.Extensions.*En Microsoft.Azure.Functions.Worker.Extensions.*
RegistroILogger se pasa a la funciónILogger obtenido de FunctionContext
Tokens de cancelaciónCompatibleNo compatible
Enlaces de salidaParámetros de salidaValores devueltos
Tipos de enlaces de salidaIAsyncCollector, DocumentClient, BrokeredMessage y otros tipos específicos del clienteTipos simples, tipos serializables de JSON y matrices.
Varios enlaces de salidaCompatibleCompatible
Desencadenador HTTPHttpRequest/ObjectResultHttpRequestData/HttpResponseData
Funciones duraderasCompatibleNo compatible
Enlaces imperativosCompatibleNo compatible
Artefacto function.jsonGeneradoNo se han generado
Configuraciónhost.jsonhost.json e inicialización personalizada
Inserción de dependenciasCompatibleCompatible
Software intermedioNo compatibleCompatible
Tiempo de arranque en fríoHabitualMás tiempo, debido al inicio Just-in-Time.
Ejecute en Linux en lugar de en Windows para reducir los posibles retrasos.
ReadyToRunCompatibleTBD
https://docs.microsoft.com/es-mx/azure/azure-functions/dotnet-isolated-process-guide#differences-with-net-class-library-functions

En algunos próximos posts, estaré hablando de como hacer la inyección de dependencias en este nuevo modelo de Azure Functions, y de que nos espera para nuevas versiones con la llegada de .Net 6. Estén atentos a esta información.