¿Cómo puedo controlar la concurrencia o escalamiento en mi función?

Diego Fuentes 0 Puntos de reputación
2024-03-11T20:47:52.4333333+00:00

Estoy utilizando una función que recibe mensajes por ServiceBus con la siguiente configuración:

<TargetFramework>net6.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<PackageReference Include="Azure.Messaging.ServiceBus" Version="7.17.1" />
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="5.8.1" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.1.3" />
<PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.22.0" />

En host.json tengo lo siguiente para poder limitar la concurrencia (creo que hay opciones que no importan pero :

  "version": "2.0",
  "extensions": {
    "http": {
      "routePrefix": "api",
      "maxOutstandingRequests": 200,
      "maxConcurrentRequests": 1,
      "dynamicThrottlesEnabled": true
    },
    "queues": {
      "batchSize": 1
    },
    "serviceBus": {
      "clientRetryOptions": {
        "mode": "exponential",
        "tryTimeout": "00:05:00",
        "delay": "00:00:00.80",
        "maxDelay": "00:01:00",
        "maxRetries": 3
      },
      "autoCompleteMessages": false,
      "maxConcurrentCalls": 1,
      "maxConcurrentSessions": 1,
      "maxMessageBatchSize": 1
    }
  },
  "concurrency": {
    "dynamicConcurrencyEnabled": false,
    "maximumFunctionConcurrency": 1,
    "cpuThreshold": 0.8,
    "snapshotPersistenceEnabled": true
  },

Estoy buscando una opción para quitar la concurrencia en el procesamiento de la función. Quiero que procese una operación a la vez. Revisando la documentación, encontré las opciones anteriores y el agregué en la configuración de la función (aplication setting) functionAppScaleLimit=1.

Estos cambios no funcionan y sigo teniendo procesamientos de los mensajes en paralelo. Como se puede ver en la imagen, dado los operation_Id en la tabla trace del ApplicationInsights de la función, ordenados por timestamp, hay dos mensajes que se están procesando en paralelo.
User's image

¿Qué y cómo debo configurar la función para no tener procesamientos en paralelo? Puedo aceptar procesar más de un mensaje por vez, pero en un mismo operation_Id, para que se procese consecutivamente y no simultáneamente.

Azure
Azure
Plataforma e infraestructura de informática en la nube para crear, implementar y administrar aplicaciones y servicios a través de una red mundial de centros de datos administrados por Microsoft.
517 preguntas
ASP.NET
ASP.NET
Conjunto de tecnologías de .NET Framework para la creación de aplicaciones y servicios web XML.
47 preguntas
0 comentarios No hay comentarios
{count} votos

1 respuesta

Ordenar por: Muy útil
  1. Jonathan Pereira Castillo 11,860 Puntos de reputación Proveedor de Microsoft
    2025-01-20T21:59:29.05+00:00

    ¡Hola Diego Fuentes!

    Esperamos que este mensaje te encuentre bien.

    Lamentamos sinceramente la demora en abordar tu tema en este foro.  

    Aquí tienes algunos pasos para controlar la concurrencia en tu función de Azure:

    Configura maxConcurrentCalls:

    • En host.json, asegúrate de que maxConcurrentCalls esté configurado en 1 para ServiceBus.

    Desactiva la concurrencia dinámica:

    • En host.json, establece dynamicConcurrencyEnabled en false.

    Usa functionAppScaleLimit:

    • En la configuración de la aplicación, establece functionAppScaleLimit en 1.

    Verifica la configuración de escalamiento:

    • Asegúrate de que tu plan de hospedaje esté configurado correctamente para evitar el escalamiento automático. Espero que esto te ayude a resolver el problema. ¡Buena suerte!

    Si no recibimos una respuesta tuya en los próximos días, procederemos a cerrar el tema. Sin embargo, queremos asegurarte que siempre estamos disponibles para cualquier asistencia que puedas necesitar.

    Agradecemos tu comprensión y estamos aquí para ayudar en lo que sea necesario.

    Estaré atento a tu respuesta.,

     Jonathan

    ----------*

    Tu opinión es muy importante para nosotros! Si esta respuesta resolvió tu consulta, por favor haz clic en ''. Esto nos ayuda a mejorar continuamente la calidad y relevancia de nuestras soluciones.

    0 comentarios No hay comentarios

Su respuesta

Las respuestas se pueden marcar como respuestas aceptadas por el autor de la pregunta, lo que ayuda a los usuarios a conocer la respuesta que resolvió el problema del autor.