Compartir por


Simultaneidad en Azure Functions

En este artículo se describen los comportamientos de simultaneidad de los desencadenadores controlados por eventos en Azure Functions. También compara los modelos de simultaneidad estática y dinámica.

Importante

El Plan Flex Consumption está actualmente en versión preliminar.

En Functions, puede tener varios procesos en ejecución de una función determinada que se ejecuten simultáneamente en una sola instancia de proceso. Por ejemplo, considere un caso en el que tiene tres funciones diferentes en la aplicación de funciones que se escala horizontalmente a varias instancias para controlar una mayor carga. En este escenario, cada función se ejecuta en respuesta a invocaciones individuales en las tres instancias y una instancia determinada puede controlar varias invocaciones del mismo tipo. Tenga en cuenta que las ejecuciones de función en una sola instancia comparten la misma memoria, CPU y recursos de conexión. Dado que varias ejecuciones de función se pueden ejecutar simultáneamente en cada instancia, cada función debe tener una manera de administrar el número de ejecuciones simultáneas.

Cuando la aplicación se hospeda en un plan de escalado dinámico (Consumo, Consumo flexible o Premium), el host escala o reduce verticalmente el número de instancias de la aplicación de funciones en función del número de eventos entrantes. Para más información, consulte Escalado impulsado por eventos. Al hospedar las funciones en un plan dedicado (App Service), debe configurar manualmente las instancias o configurar un esquema de escalabilidad automática.

Estas decisiones de escalado también se ven afectadas directamente por la simultaneidad de ejecuciones en una instancia determinada. Cuando una aplicación de un plan de escalado dinámico alcanza un límite de simultaneidad, es posible que tenga que escalar para mantenerse al día con la demanda entrante.

Functions proporciona dos formas principales de administrar la simultaneidad:

Simultaneidad estática

De forma predeterminada, la mayoría de los desencadenadores admiten un modelo de configuración estática de nivel de host. En este modelo, cada tipo de desencadenador tiene un límite de simultaneidad por instancia. Sin embargo, para la mayoría de los desencadenadores también puede solicitar una simultaneidad específica por instancia para ese tipo de desencadenador. Por ejemplo, el desencadenador de Service Bus proporciona tanto un valor MaxConcurrentCalls como MaxConcurrentSessions en el archivo host.json. Estos valores controlan conjuntamente el número máximo de mensajes que cada función procesa simultáneamente en cada instancia. Otros tipos de desencadenador tienen mecanismos integrados para invocar el equilibrio de carga entre instancias. Por ejemplo, Event Hubs y Azure Cosmos DB usan un esquema basado en particiones.

En el caso de los tipos de desencadenador que admiten la configuración de simultaneidad, la configuración que elija se aplicará a todas las instancias en ejecución. Esto le permite controlar la simultaneidad máxima para las funciones en cada instancia. Por ejemplo, cuando la función consume muchos recursos o CPU, puede limitar la simultaneidad para mantener las instancias en buen estado y confiar en el escalado para controlar las cargas aumentadas. Del mismo modo, cuando la función realiza solicitudes a un servicio de bajada que se está limitando, también debe considerar la posibilidad de limitar la simultaneidad para evitar sobrecargar el servicio de bajada.

Simultaneidad del desencadenador HTTP

Solo se aplica al plan de consumo flexible (versión preliminar)

El plan de consumo flexible escala todas las funciones de desencadenador HTTP juntas como un grupo. Para obtener más información, consulte Escalado por función. En la tabla siguiente se indica la configuración de simultaneidad predeterminada para desencadenadores HTTP en una instancia determinada, en función del tamaño de memoria de instancia configurado.

Tamaño de instancia (MB) Simultaneidad predeterminada*
2048 16
4096 32

*En el caso de las aplicaciones de Python, la simultaneidad del desencadenador HTTP predeterminada para todos los tamaños de instancia es 1.

Estos valores predeterminados deben funcionar bien para la mayoría de los casos y empieza con ellos. Tenga en cuenta que, en un número determinado de solicitudes HTTP, aumentar el valor de simultaneidad HTTP reduce el número de instancias necesarias para controlar las solicitudes HTTP. Del mismo modo, reducir el valor de simultaneidad HTTP requiere más instancias para controlar la misma carga.

Si necesita ajustar la simultaneidad HTTP, puede hacerlo mediante la CLI de Azure. Para obtener más información, consulte Establecimiento de límites de simultaneidad HTTP.

Los valores de simultaneidad predeterminados de la tabla anterior solo se aplican cuando no ha establecido su propia configuración de simultaneidad HTTP. Si no ha establecido explícitamente una configuración de simultaneidad HTTP, la simultaneidad predeterminada aumenta como se muestra en la tabla al cambiar el tamaño de la instancia. Después de establecer específicamente un valor de simultaneidad HTTP, ese valor se mantiene a pesar de los cambios en el tamaño de la instancia.

Determinación de la simultaneidad estática óptima

Aunque las configuraciones de simultaneidad estática le permiten controlar determinados comportamientos de desencadenador, como la limitación de las funciones, puede ser difícil determinar los valores óptimos para estos valores. Por lo general, debe llegar a valores aceptables mediante un proceso iterativo de pruebas de carga. Incluso tras determinar un conjunto de valores que funcionan para un perfil de carga determinado, el número de eventos que llegan desde los servicios conectados puede cambiar de un día a otro. Esta variabilidad significa que la aplicación puede ejecutarse a menudo con valores que no son los óptimos. Por ejemplo, la aplicación de funciones puede procesar cargas de mensajes especialmente exigentes en el último día de la semana, lo que requiere que se limite la simultaneidad. Sin embargo, durante el resto de la semana, las cargas de mensajes son más simples, lo que significa que puede usar un nivel de simultaneidad mayor el resto de la semana.

Lo ideal es que el sistema permita que las instancias procesen todo el trabajo que puedan a la vez que mantiene correctas y con latencias bajas todas las instancias, que es para lo que está diseñada la simultaneidad dinámica.

Simultaneidad dinámica

Functions ahora proporciona un modelo de simultaneidad dinámica que simplifica la configuración de la simultaneidad para todas las aplicaciones de funciones que se ejecutan en el mismo plan.

Nota

Actualmente, la simultaneidad dinámica solo se admite para los desencadenadores de Azure Blob, Azure Queue y Service Bus y requiere que use las versiones enumeradas en la sección de compatibilidad con extensiones que se encuentra a continuación.

Ventajas

El uso de simultaneidad dinámica proporciona las siguientes ventajas:

  • Configuración simplificada: ya no tiene que determinar manualmente la configuración de simultaneidad por desencadenador. El sistema aprende los valores óptimos para la carga de trabajo a lo largo del tiempo.
  • Ajustes dinámicos: la simultaneidad se ajusta hacia arriba o abajo dinámicamente en tiempo real, lo que permite que el sistema se adapte a los patrones de carga cambiantes a lo largo del tiempo.
  • Protección del estado de instancia: el runtime limita la simultaneidad a los niveles que una instancia de aplicación de funciones puede controlar cómodamente. Así se protege a la aplicación frente a la sobrecarga al realizar más trabajo del que debería.
  • Rendimiento mejorado: se mejora el rendimiento general porque las instancias individuales no toman más trabajo del que pueden procesar rápidamente. Esto permite equilibrar la carga de trabajo de forma más eficaz entre instancias. En el caso de las funciones que pueden controlar cargas mayores, se puede obtener un mayor rendimiento aumentando la simultaneidad con los valores por encima de la configuración predeterminada.

Configuración de simultaneidad dinámica

La simultaneidad dinámica se puede habilitar en el nivel de host en el archivo host.json. Cuando se habilita, los niveles de simultaneidad de las extensiones de enlace que admiten esta característica se ajustan automáticamente según sea necesario. En estos casos, la configuración de simultaneidad dinámica invalida las opciones de simultaneidad configuradas manualmente.

De forma predeterminada, la simultaneidad dinámica está deshabilitada. Con la simultaneidad dinámica habilitada, la simultaneidad comienza en 1 para cada función y se ajusta hasta un valor óptimo, determinado por el host.

Puede habilitar la simultaneidad dinámica en la aplicación de funciones agregando la siguiente configuración en el archivo host.json:

    { 
        "version": "2.0", 
        "concurrency": { 
            "dynamicConcurrencyEnabled": true, 
            "snapshotPersistenceEnabled": true 
        } 
    } 

Cuando SnapshotPersistenceEnabled es true, que es el valor predeterminado, los valores de simultaneidad aprendidos se conservan periódicamente en el almacenamiento para que las nuevas instancias empiecen a partir de esos valores en lugar de empezar a partir de 1 y tener que volver a hacer el aprendizaje.

Administrador de la simultaneidad

Cuando se habilita la simultaneidad dinámica, hay un proceso de administrador de simultaneidad que se ejecuta en segundo plano. Este administrador supervisa constantemente las métricas de estado de la instancia, como el uso de CPU y subprocesos, y los cambios se limitan según sea necesario. Cuando se habilitan una o varias limitaciones, la simultaneidad de la función se ajusta hasta que el host vuelve a tener un estado correcto. Cuando se deshabilitan las limitaciones, la simultaneidad puede aumentar. Se usan varias heurísticas para ajustar o reducir la simultaneidad de forma inteligente según sea necesario en función de estas limitaciones. Con el tiempo, la simultaneidad de cada función se estabiliza en un nivel determinado.

Los niveles de simultaneidad se administran para cada función individual. Por lo tanto, el sistema equilibra entre las funciones que consumen muchos recursos que requieren un bajo nivel de simultaneidad y funciones más ligeras que pueden controlar una mayor simultaneidad. El equilibrio de simultaneidad de cada función ayuda a mantener el estado general de la instancia de la aplicación de funciones.

Cuando la simultaneidad dinámica está habilitada, verá decisiones de simultaneidad dinámica en los registros. Por ejemplo, verá registros cuando se habiliten varias limitaciones y cada vez que se ajuste la simultaneidad hacia arriba o hacia abajo para cada función. Estos registros se escriben en la categoría de registro Host.Concurrency de la tabla de seguimientos.

Compatibilidad con extensiones

La simultaneidad dinámica se habilita para una aplicación de funciones en el nivel de host y las extensiones que admiten simultaneidad dinámica se ejecutan en ese modo. La simultaneidad dinámica requiere la colaboración entre el host y las extensiones de desencadenador individuales. Solo las versiones enumeradas de las siguientes extensiones admiten la simultaneidad dinámica.

Extensión Versión Descripción
Queue Storage versión 5.x (extensión de almacenamiento) El desencadenador de Azure Queue Storage tiene su propio bucle de sondeo de mensajes. Cuando se usa la configuración estática, las opciones de configuración BatchSize/NewBatchThreshold controlan la simultaneidad. Cuando se usa la simultaneidad dinámica, se ignoran esos valores de configuración. La simultaneidad dinámica se integra en el bucle de mensajes, por lo que el número de mensajes capturados por iteración se ajusta de forma dinámica. Cuando se habilitan los reguladores de carga de trabajo (el host está sobrecargado), el procesamiento de mensajes se pausará hasta que se deshabiliten los reguladores. Cuando se deshabilitan los reguladores de carga de trabajo, la simultaneidad aumentará.
Blob Storage versión 5.x (extensión de almacenamiento) Internamente, el desencadenador de Azure Blob Storage usa la misma infraestructura que el desencadenador de Azure Queue. Cuando es necesario procesar blobs nuevos o actualizados, los mensajes se escriben en una cola de control administrada por la plataforma, y esa cola se procesa con la misma lógica que se usa para QueueTrigger. Cuando la simultaneidad dinámica está habilitada, la simultaneidad para el procesamiento de esa cola de control se administrará dinámicamente.
Service Bus versión 5.x El desencadenador de Service Bus admite actualmente tres modelos de ejecución. La simultaneidad dinámica afecta a estos modelos de ejecución de la siguiente manera:

Procesamiento de cola o tema de distribución única: cada invocación de la función procesa un único mensaje. Cuando se usa la configuración estática, la opción de configuración MaxConcurrentCalls controla la simultaneidad. Cuando se usa la simultaneidad dinámica, ese valor de configuración se omite y la simultaneidad se ajusta dinámicamente.
Procesamiento de cola o tema de distribución única basada en sesión: cada invocación de la función procesa un único mensaje. En función del número de sesiones activas para el tema o la cola, cada instancia concede una o varias sesiones. Los mensajes de cada sesión se procesan en serie, para garantizar el orden en una sesión. Cuando no se usa la simultaneidad dinámica, la simultaneidad se rige por la configuración de MaxConcurrentSessions. Con la simultaneidad dinámica habilitada, MaxConcurrentSessions se omite y el número de sesiones que procesa cada instancia se ajusta dinámicamente.
Procesamiento por lotes: cada invocación de la función procesa un lote de mensajes, regido por el valor MaxMessageCount. Dado que las invocaciones por lotes son en serie, la simultaneidad de la función desencadenada por lotes siempre es uno y no se aplica la simultaneidad dinámica.

Pasos siguientes

Para obtener más información, consulte los siguientes recursos: