¿Cómo puedo controlar la concurrencia o escalamiento en mi función?
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.
¿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.