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 Azure Functions, una única instancia de aplicación de funciones permite que varios eventos se procesen simultáneamente. Dado que se ejecutan en la misma instancia de proceso, comparten recursos de memoria, CPU y conexión. En determinados planes de hospedaje, la alta demanda en una instancia específica hace que el host de Functions cree automáticamente nuevas instancias para controlar la mayor carga. En estos planes de escalado dinámico, hay una compensación entre la simultaneidad y los comportamientos de escalado. Para proporcionar más control sobre cómo se ejecuta la aplicación, Functions proporciona una manera de administrar el número de ejecuciones simultáneas.
Functions proporciona dos formas principales de administrar la simultaneidad:
- Simultaneidad fija por instancia: puede configurar límites a nivel de host que son específicos para desencadenadores individuales. Este modelo es el comportamiento de simultaneidad predeterminado para Functions.
- Simultaneidad dinámica: para determinados tipos de desencadenadores, el host de Functions puede determinar automáticamente el mejor nivel de simultaneidad para ese desencadenador en la aplicación de funciones. Debe optar por participar en este modelo de simultaneidad.
En este artículo se describen los comportamientos de simultaneidad de desencadenadores controlados por eventos en Functions y cómo estos comportamientos afectan al escalado en planes dinámicos. También compara los modelos de concurrencia fija por instancia y de concurrencia dinámica.
Escalado frente a simultaneidad
En el caso de las funciones que usan desencadenadores basados en eventos o responden a solicitudes HTTP, puede alcanzar rápidamente los límites de ejecuciones simultáneas durante períodos de alta demanda. Durante estos períodos, debe poder escalar su función de aplicación agregando instancias para evitar una acumulación en el procesamiento de solicitudes entrantes. La forma en que escalamos la aplicación depende del plan de hospedaje:
| Tipo de escala | Planes de hospedaje | Descripción |
|---|---|---|
| Escalado dinámico (controlado por eventos) |
Consumo Consumo flexible Prima |
En un plan de escalado dinámico, 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 controlado por eventos en Azure Functions. |
| Escalado manual | Planes dedicados (App Service) | Al hospedar la aplicación de funciones en un plan dedicado, debe configurar manualmente las instancias durante períodos de mayor carga o configurar un esquema de escalado automático. |
Antes de que se produzca cualquier escalado, la aplicación de funciones intenta controlar los aumentos de carga mediante el control de varias invocaciones del mismo tipo en una sola instancia. Como resultado, estas ejecuciones simultáneas en una instancia determinada afectan directamente a las decisiones de escalado. Por ejemplo, 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.
El equilibrio de escala frente a simultaneidad que intenta lograr en la aplicación depende de dónde puedan producirse cuellos de botella: en el procesamiento (limitaciones de proceso intensivo de CPU) o en un servicio de bajada (limitaciones basadas en E/S).
Simultaneidad fija por instancia
De forma predeterminada, la mayoría de los desencadenadores admiten un modelo fijo de configuración de simultaneidad por instancia mediante el escalado basado en objetivos. En este modelo, cada tipo de desencadenador tiene un límite de simultaneidad por instancia.
Puede invalidar los valores predeterminados de simultaneidad para la mayoría de los desencadenadores estableciendo una simultaneidad específica por instancia para ese tipo de desencadenador. Para muchos desencadenadores, configure las opciones de simultaneidad en el archivohost.json. Por ejemplo, el desencadenador de Azure Service Bus proporciona tanto una configuración MaxConcurrentCalls como una MaxConcurrentSessions en host.json. Esta configuración funciona conjuntamente para controlar el número máximo de mensajes que cada aplicación de función procesa simultáneamente en cada instancia.
En determinados escenarios de escalado basado en destino, como cuando se usa un desencadenador de Apache Kafka o Azure Cosmos DB, la configuración de simultaneidad se encuentra en la declaración de función, no en el archivo host.json . Otros tipos de desencadenadores tienen mecanismos integrados para las invocaciones de equilibrio de carga entre instancias. Por ejemplo, Azure 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 de simultaneidad se aplica a todas las instancias en ejecución. De este modo, puede controlar la simultaneidad máxima para las funciones en cada instancia. Por ejemplo, cuando la función consume mucha CPU o un uso intensivo de recursos, puede optar por limitar la simultaneidad para mantener las instancias en buen estado. En este caso, puede confiar en la escalabilidad para gestionar el aumento de las cargas. Del mismo modo, cuando la función realiza solicitudes a un servicio descendente que está siendo restringido, también debe considerar la limitación de la concurrencia para evitar sobrecargar el servicio descendente.
Simultaneidad del desencadenador HTTP
Solo se aplica al plan de consumo flexible.
La simultaneidad del desencadenante HTTP es un tipo especial de simultaneidad fija por instancia. En la concurrencia del activador HTTP, la concurrencia predeterminada también depende del tamaño de la instancia.
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 los desencadenadores HTTP en una instancia determinada, en función del tamaño de memoria de la instancia configurado:
| Tamaño de instancia (MB) | Simultaneidad predeterminada* |
|---|---|
| 512 | 4 |
| 2 048 | 16 |
| 4 096 | 32 |
*En las aplicaciones de Python, todos los tamaños de instancia usan un nivel de simultaneidad de desencadenador HTTP de uno de forma predeterminada.
Estos valores predeterminados deben funcionar bien para la mayoría de los casos y puede empezar 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 se establece su propia configuración de simultaneidad HTTP. Cuando no establece 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 concurrencia fija óptima por instancia
Las configuraciones de simultaneidad fija por instancia le proporcionan control sobre determinados comportamientos desencadenantes, como la limitación de las funciones. Pero puede ser difícil determinar los valores óptimos para esta configuración. Por lo general, debe llegar a valores aceptables mediante un proceso iterativo de pruebas de carga. Incluso después de 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 día a día. Esta variabilidad puede hacer que la aplicación se ejecute con valores poco óptimos. Por ejemplo, tu aplicación de funciones podría procesar cargas de mensajes exigentes en el último día de la semana, lo que te obliga a reducir la concurrencia. Sin embargo, durante el resto de la semana, las cargas de mensajes pueden ser más ligeras, lo que significa que puede usar un nivel de simultaneidad mayor el resto de la semana.
Idealmente, el sistema debe permitir que las instancias procesen todo el trabajo posible mientras mantengan cada instancia saludable y las latencias bajas. La simultaneidad dinámica está diseñada para ese propósito.
Simultaneidad dinámica
Functions 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 Storage, Azure Queue Storage y Service Bus. Además, debe usar las versiones de extensión enumeradas en Compatibilidad con extensiones, más adelante en este artículo.
Ventajas
La 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 de estado de la instancia: el entorno de ejecución limita la simultaneidad a los niveles que una instancia de aplicación de funciones puede controlar cómodamente. Estos límites protegen la aplicación de sobrecargarse al asumir más trabajo de lo que debería.
- Rendimiento mejorado: se ha mejorado el rendimiento general, ya que las instancias individuales no extraen más trabajo de lo que pueden procesar rápidamente. Como resultado, la carga de trabajo se equilibra de forma más eficaz entre las 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
Puede activar la simultaneidad dinámica en el nivel de host en el archivo host.json . Cuando está activado, 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á desactivada. Al activar la simultaneidad dinámica, la simultaneidad comienza en un nivel de uno para cada función. El nivel de simultaneidad se ajusta hasta un valor óptimo, que determina el host.
Puede activar la simultaneidad dinámica en la aplicación de funciones agregando la siguiente configuración al archivo dehost.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. Las nuevas instancias comienzan desde esos valores en lugar de comenzar desde un nivel de uno y tener que rehacer 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 reduce hasta que el host vuelve a tener un estado correcto. Cuando se desactivan 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. Dado que puede tardar tiempo en determinar el valor óptimo de simultaneidad, use la simultaneidad dinámica solo si un valor poco óptimo es aceptable para la solución inicialmente o después de un período de inactividad.
Los niveles de simultaneidad se administran para cada función individual. En concreto, 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á activada, encontrará decisiones de simultaneidad dinámica en los registros. Por ejemplo, se agregan entradas del registro cuando se activan varias limitaciones y cada vez que se ajusta la simultaneidad hacia arriba o abajo para cada función. Estos registros están escritos bajo la categoría de registros Host.Concurrency en la tabla de trazas traces.
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 Queue Storage tiene su propio bucle de sondeo de mensajes. Cuando se usa una configuración fija por instancia, las opciones de configuración BatchSize y NewBatchThreshold rigen la simultaneidad. Cuando se usa la simultaneidad dinámica, se omiten esos valores de configuración. La simultaneidad dinámica se integra en el bucle de mensajes, por lo que el número de mensajes recuperados por iteración se ajusta dinámicamente. Cuando se activan los reguladores, el host se sobrecarga. El procesamiento de mensajes se pausa hasta que se desactivan las limitaciones. Cuando se desactivan los limitadores, aumenta la simultaneidad. |
| Blob Storage | Versión 5.x (extensión de almacenamiento) | Internamente, el desencadenador de Blob Storage usa la misma infraestructura que usa el desencadenador de Queue Storage. Cuando es necesario procesar blobs nuevos o actualizados, los mensajes se escriben en una cola de control administrada por la plataforma. Esa cola se procesa mediante la misma lógica utilizada para el activador de Queue Storage. Cuando la simultaneidad dinámica está habilitada, la simultaneidad del procesamiento de esa cola de control se administra de forma dinámica. |
| Autobús de servicio | 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 las maneras siguientes:MaxConcurrentCalls gobierna la simultaneidad. Cuando se usa la simultaneidad dinámica, se omite ese valor de configuración y la simultaneidad se ajusta dinámicamente.MaxConcurrentSessions rige la simultaneidad. Cuando se activa la simultaneidad dinámica, se omite el MaxConcurrentSessions valor y se ajusta dinámicamente el número de sesiones que procesa cada instancia.MaxMessageCount configuración. Dado que las invocaciones por lotes son seriales, la simultaneidad de la función desencadenada por lotes siempre es una y la simultaneidad dinámica no se aplica. |
Pasos siguientes
Para obtener más información, consulte los siguientes recursos: