Optimización del rendimiento y confiabilidad de Azure FunctionsOptimize the performance and reliability of Azure Functions

En este artículo se proporcionan instrucciones para mejorar el rendimiento y la confiabilidad de sus aplicaciones de función sin servidor.This article provides guidance to improve the performance and reliability of your serverless function apps.

Procedimientos recomendados generalesGeneral best practices

Éstos son los procedimientos recomendados para crear y diseñar las soluciones sin servidor mediante Azure Functions.The following are best practices in how you build and architect your serverless solutions using Azure Functions.

Evitar funciones de ejecución prolongadaAvoid long running functions

Las funciones grandes de ejecución prolongada pueden causar problemas de tiempo de espera inesperados.Large, long-running functions can cause unexpected timeout issues. Una función puede ser grande debido a numerosas dependencias de Node.js.A function can become large due to many Node.js dependencies. La importación de las dependencias también puede provocar mayores tiempos de carga que dan lugar a tiempos de expiración inesperados.Importing dependencies can also cause increased load times that result in unexpected timeouts. Las dependencias se cargan explícita e implícitamente.Dependencies are loaded both explicitly and implicitly. Un módulo único cargado por el código puede cargar sus propios módulos adicionales.A single module loaded by your code may load its own additional modules.

Siempre que sea posible, refactorice funciones grandes en conjuntos más pequeños de funciones que trabajen juntos y devuelvan respuestas rápidas.Whenever possible, refactor large functions into smaller function sets that work together and return responses fast. Por ejemplo, un webhook o una función de desencadenador HTTP podría requerir una respuesta de confirmación en un determinado período de tiempo. Es habitual que los webhooks requieran una respuesta inmediata.For example, a webhook or HTTP trigger function might require an acknowledgment response within a certain time limit; it is common for webhooks to require an immediate response. Puede pasar la carga útil de desencadenador HTTP a una cola para ser procesada por una función de desencadenador de cola.You can pass the HTTP trigger payload into a queue to be processed by a queue trigger function. Este enfoque permite aplazar el trabajo real y devolver una respuesta inmediata.This approach allows you to defer the actual work and return an immediate response.

Comunicación entre funcionesCross function communication

Durable Functions y Azure Logic Apps se han creado para administrar las transiciones de estado y las comunicaciones entre varias funciones.Durable Functions and Azure Logic Apps are built to manage state transitions and communication between multiple functions.

Si no usa Durable Functions ni Logic Apps para integrar varias funciones, se recomienda usar colas de almacenamiento para la comunicación entre estas.If not using Durable Functions or Logic Apps to integrate with multiple functions, it is generally a best practice to use storage queues for cross function communication. La razón principal es que las colas de almacenamiento son más baratas y mucho más fáciles de aprovisionar.The main reason is storage queues are cheaper and much easier to provision.

Los mensajes individuales de una cola de almacenamiento tienen un límite de tamaño de 64 KB.Individual messages in a storage queue are limited in size to 64 KB. Si tiene que pasar mensajes más grandes entre funciones, se podría usar una cola de Azure Service Bus para admitir tamaños de mensaje de hasta 256 KB en el nivel Estándar y hasta 1 MB en el nivel Premium.If you need to pass larger messages between functions, an Azure Service Bus queue could be used to support message sizes up to 256 KB in the Standard tier, and up to 1 MB in the Premium tier.

Temas de Service Bus son útiles si necesita filtrado de mensajes antes del procesamiento.Service Bus topics are useful if you require message filtering before processing.

Los concentradores de eventos son útiles para admitir comunicaciones de gran volumen.Event hubs are useful to support high volume communications.

Escritura de funciones para que no tengan estadoWrite functions to be stateless

Si es posible, las funciones no deben tener estado y ser idempotentes.Functions should be stateless and idempotent if possible. Asociar cualquier información de estado necesaria con los datos.Associate any required state information with your data. Por ejemplo, un pedido para procesar probablemente tendría un miembro state asociado.For example, an order being processed would likely have an associated state member. Una función podría procesar un pedido en función de ese estado mientras que la propia función permanece sin estado.A function could process an order based on that state while the function itself remains stateless.

Las funciones idempotentes se recomiendan especialmente con desencadenadores de temporizador.Idempotent functions are especially recommended with timer triggers. Por ejemplo, si tiene algo que debe ejecutarse una vez al día obligatoriamente, escríbalo para poder ejecutarse en cualquier momento durante el día con los mismos resultados.For example, if you have something that absolutely must run once a day, write it so it can run any time during the day with the same results. La función puede salir cuando no haya ningún trabajo para un día determinado.The function can exit when there is no work for a particular day. Asimismo, si una ejecución anterior no se pudo completar, la siguiente ejecución debe continuar donde se quedó.Also if a previous run failed to complete, the next run should pick up where it left off.

Escritura de funciones defensivasWrite defensive functions

Suponga que la función podría encontrarse con una excepción en cualquier momento.Assume your function could encounter an exception at any time. Diseñe las funciones con la capacidad de continuar a partir de un punto de error anterior durante la siguiente ejecución.Design your functions with the ability to continue from a previous fail point during the next execution. Considere un escenario que requiere las siguientes acciones:Consider a scenario that requires the following actions:

  1. Consulta de 10 000 filas en una base de datos.Query for 10,000 rows in a db.
  2. Cree un mensaje de cola para cada una de esas filas para procesar más abajo la línea.Create a queue message for each of those rows to process further down the line.

Dependiendo de lo complejo que sea el sistema, es posible que haya servicios de bajada implicados con un comportamiento incorrecto, interrupciones de red, límites de cuota alcanzados, etc. Todo esto puede afectar a su función en cualquier momento.Depending on how complex your system is, you may have: involved downstream services behaving badly, networking outages, or quota limits reached, etc. All of these can affect your function at any time. Debe diseñar las funciones para que estén preparadas para ello.You need to design your functions to be prepared for it.

¿Cómo reacciona el código si se produce un error después de insertar 5000 de esos elementos en una cola para su procesamiento?How does your code react if a failure occurs after inserting 5,000 of those items into a queue for processing? Realice un seguimiento de elementos de un conjunto que ha completado.Track items in a set that you’ve completed. En caso contrario, podría insertarlos la próxima vez.Otherwise, you might insert them again next time. Esto puede tener un impacto grave en el flujo de trabajo.This can have a serious impact on your work flow.

Si ya se ha procesado un elemento de la cola, permita que la función sea no operativa.If a queue item was already processed, allow your function to be a no-op.

Aproveche las medidas defensivas ya proporcionadas para los componentes que se usa en la plataforma de Azure Functions.Take advantage of defensive measures already provided for components you use in the Azure Functions platform. Por ejemplo, vea la información sobre el tratamiento de mensajes dudosos en la cola en la documentación de desencadenadores y enlaces de cola de Azure Storage.For example, see Handling poison queue messages in the documentation for Azure Storage Queue triggers and bindings.

Procedimientos recomendados de escalabilidadScalability best practices

Hay una serie de factores que afectan a cómo se escalan las instancias de la aplicación de función.There are a number of factors which impact how instances of your function app scale. Se proporcionan más detalles en la documentación sobre escalado de funciones.The details are provided in the documentation for function scaling. A continuación se indican algunos procedimientos recomendados para garantizar una escalabilidad óptima de una aplicación de función.The following are some best practices to ensure optimal scalability of a function app.

Compartir y administrar conexionesShare and manage connections

Vuelva a usar las conexiones con los recursos externos, siempre que le sea posible.Re-use connections to external resources whenever possible. Consulte Administración de conexiones en Azure Functions.See how to manage connections in Azure Functions.

No mezclar código de prueba y producción en la misma aplicación de funciónDon't mix test and production code in the same function app

Las funciones dentro de una aplicación de función compartan recursos.Functions within a function app share resources. Por ejemplo, la memoria se comparte.For example, memory is shared. Si usa una aplicación de función en producción, no agregue recursos y funciones relacionados con pruebas a ella.If you're using a function app in production, don't add test-related functions and resources to it. Se podría producir una sobrecarga inesperada durante la ejecución de código de producción.It can cause unexpected overhead during production code execution.

Asegúrese de cargar en las aplicaciones de función de producción.Be careful what you load in your production function apps. La memoria se promedia entre cada función de la aplicación.Memory is averaged across each function in the app.

Si tiene un ensamblado compartido al que se hace referencia en varias funciones. NET, colóquelo en una carpeta compartida común.If you have a shared assembly referenced in multiple .NET functions, put it in a common shared folder. Haga referencia al ensamblado con una instrucción similar al ejemplo siguiente si usa scripts de C# (.csx):Reference the assembly with a statement similar to the following example if using C# Scripts (.csx):

#r "..\Shared\MyAssembly.dll". 

En caso contrario, es fácil implementar accidentalmente varias versiones de prueba del mismo binario que se comporten de manera diferente entre funciones.Otherwise, it is easy to accidentally deploy multiple test versions of the same binary that behave differently between functions.

No utilice el registro detallado en el código de producción.Don't use verbose logging in production code. Tiene un impacto negativo en el rendimiento.It has a negative performance impact.

Uso del código asincrónico pero evitar las llamadas de bloqueoUse async code but avoid blocking calls

La programación asincrónica es una práctica recomendada.Asynchronous programming is a recommended best practice. Sin embargo, evite siempre las referencias a la propiedad Result o las llamadas al método Wait en una instancia Task.However, always avoid referencing the Result property or calling Wait method on a Task instance. Este enfoque puede provocar el agotamiento de subprocesos.This approach can lead to thread exhaustion.

Sugerencia

Si planea usar los enlaces HTTP o WebHook, debe evitar el agotamiento de puertos que puede deberse a la creación incorrecta de instancias de HttpClient.If you plan to use the HTTP or WebHook bindings, plan to avoid port exhaustion that can be caused by improper instantiation of HttpClient. Para más información, consulte How to manage connections in Azure Functions (Administración de conexiones en Azure Functions).For more information, see How to manage connections in Azure Functions.

Recepción de mensajes en lotes siempre que sea posibleReceive messages in batch whenever possible

Algunos desencadenadores como Event Hubs permiten la recepción de un lote de mensajes en una única invocación.Some triggers like Event Hub enable receiving a batch of messages on a single invocation. El procesamiento de mensajes por lotes tiene un rendimiento mucho mejor.Batching messages has much better performance. Puede configurar el tamaño de lote máximo en el archivo host.json tal como se detalla en la documentación de referencia sobre host.jsonYou can configure the max batch size in the host.json file as detailed in the host.json reference documentation

Para las funciones de C# puede cambiar el tipo a una matriz fuertemente tipada.For C# functions you can change the type to a strongly-typed array. Por ejemplo, en lugar de EventData sensorEvent la signatura del método podría ser EventData[] sensorEvent.For example, instead of EventData sensorEvent the method signature could be EventData[] sensorEvent. Para otros idiomas debe establecer explícitamente la propiedad de cardinalidad de function.json en many para habilitar el procesamiento por lotes tal y como se muestra aquí.For other languages you'll need to explicitly set the cardinality property in your function.json to many in order to enable batching as shown here.

Configuración de los comportamientos de host para controlar mejor la simultaneidadConfigure host behaviors to better handle concurrency

El archivo host.json de la aplicación de función permite la configuración de comportamientos del sistema de tiempo de ejecución y de desencadenadores del host.The host.json file in the function app allows for configuration of host runtime and trigger behaviors. Además de los comportamientos del procesamiento por lotes, puede administrar la simultaneidad para varios desencadenadores.In addition to batching behaviors, you can manage concurrency for a number of triggers. Frecuentemente, el ajustar los valores de estas opciones puede hacer que cada instancia se escale adecuadamente para satisfacer la demanda de las funciones que se invocan.Often adjusting the values in these options can help each instance scale appropriately for the demands of the invoked functions.

La configuración de los archivos de los hosts se aplica a todas las funciones de la aplicación, a una única instancia de la función.Settings in the hosts file apply across all functions within the app, within a single instance of the function. Por ejemplo, si tuviera una aplicación de función con 2 funciones HTTP y un valor de solicitudes simultáneas establecido en 25, una solicitud a cualquiera de los desencadenadores HTTP contaría las 25 solicitudes simultáneas compartidas.For example, if you had a function app with 2 HTTP functions and concurrent requests set to 25, a request to either HTTP trigger would count towards the shared 25 concurrent requests. Si esa aplicación de función se escala a 10 instancias, las 2 funciones permitirían eficazmente 250 solicitudes simultáneas (10 instancias * 25 solicitudes simultáneas por cada instancia).If that function app scaled to 10 instances, the 2 functions would effectively allow 250 concurrent requests (10 instances * 25 concurrent requests per instance).

Opciones de host para simultaneidad de HTTPHTTP concurrency host options

{
    "http": {
        "routePrefix": "api",
        "maxOutstandingRequests": 200,
        "maxConcurrentRequests": 100,
        "dynamicThrottlesEnabled": true
    }
}
PropiedadProperty Valor predeterminadoDefault DESCRIPCIÓNDescription
routePrefixroutePrefix apiapi Prefijo de ruta que se aplica a todas las rutas.The route prefix that applies to all routes. Use una cadena vacía para quitar el prefijo predeterminado.Use an empty string to remove the default prefix.
maxOutstandingRequestsmaxOutstandingRequests 200*200* Número máximo de solicitudes pendientes que se mantienen en un momento dado.The maximum number of outstanding requests that are held at any given time. Este límite incluye las solicitudes que están en cola pero no han empezado a ejecutarse, así como todas las ejecuciones en curso.This limit includes requests that are queued but have not started executing, as well as any in progress executions. Se rechazan todas las solicitudes entrantes que superen este límite con una respuesta 429 "Too Busy" (demasiado ocupado).Any incoming requests over this limit are rejected with a 429 "Too Busy" response. Esto permite que los llamadores empleen estrategias de reintento basadas en tiempo y también le ayuda a controlar las latencias de solicitud máximas.That allows callers to employ time-based retry strategies, and also helps you to control maximum request latencies. Únicamente se controlan los movimientos de la cola que se producen dentro de la ruta de ejecución del host del script.This only controls queuing that occurs within the script host execution path. Otras colas, como la cola de solicitudes de ASP.NET, siguen en efecto y no se ven alteradas por esta opción de configuración.Other queues such as the ASP.NET request queue will still be in effect and unaffected by this setting. *El valor predeterminado para la versión 1.x es ilimitado (-1).*The default for version 1.x is unbounded (-1). El valor predeterminado para la versión 2.x en un plan de consumo es 200.The default for version 2.x in a consumption plan is 200. El valor predeterminado para la versión 2.x en un plan dedicado es ilimitado (-1).The default for version 2.x in a dedicated plan is unbounded (-1).
maxConcurrentRequestsmaxConcurrentRequests 100*100* Número máximo de funciones HTTP que se ejecutarán en paralelo.The maximum number of http functions that will be executed in parallel. Esto permite controlar la simultaneidad, que a su vez puede ayudar a administrar el uso de recursos.This allows you to control concurrency, which can help manage resource utilization. Por ejemplo, podría tener una función HTTP que utiliza una gran cantidad de recursos del sistema (memoria/cpu/sockets) y causa problemas cuando la simultaneidad es demasiado alta.For example, you might have an http function that uses a lot of system resources (memory/cpu/sockets) such that it causes issues when concurrency is too high. O bien podría tener una función que realiza solicitudes de salida a un servicio de terceros y puede que haya que limitar la velocidad de dichas llamadas.Or you might have a function that makes outbound requests to a third party service, and those calls need to be rate limited. En estos casos puede ayudar aplicar una limitación.In these cases, applying a throttle here can help. *El valor predeterminado para la versión 1.x es ilimitado (-1).*The default for version 1.x is unbounded (-1). El valor predeterminado para la versión 2.x en un plan de consumo es 100.The default for version 2.x in a consumption plan is 100. El valor predeterminado para la versión 2.x en un plan dedicado es ilimitado (-1).The default for version 2.x in a dedicated plan is unbounded (-1).
dynamicThrottlesEnableddynamicThrottlesEnabled true*true* Cuando se habilita, esta configuración hace que la canalización de procesamiento de la solicitud compruebe periódicamente contadores de rendimiento del sistema como conexiones, subprocesos, procesos, memoria o cpu y, si cualquiera de esos contadores superan un umbral alto integrado (80 %), las solicitudes se rechazarán con una respuesta 429 "Ocupado" hasta que los contadores vuelvan a niveles normales.When enabled, this setting causes the request processing pipeline to periodically check system performance counters like connections/threads/processes/memory/cpu/etc. and if any of those counters are over a built-in high threshold (80%), requests will be rejected with a 429 "Too Busy" response until the counter(s) return to normal levels. *El valor predeterminado para la versión 1.x es false.*The default for version 1.x is false. El valor predeterminado para la versión 2.x en un plan de consumo es true.The default for version 2.x in a consumption plan is true. El valor predeterminado para la versión 2.x en un plan dedicado es false.The default for version 2.x in a dedicated plan is false.

Se pueden encontrar otras opciones de configuración de host en el documento de configuración de host.Other host configuration options can be found in the host configuration document.

Pasos siguientesNext steps

Para obtener más información, consulte los siguientes recursos:For more information, see the following resources: