es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Máxima concurrencia potencial en la función de Azure activada por la cola de Service Bus.

Estamos utilizando una función de Azure que se activa mediante una cola de Service Bus.

El archivo host.json de nuestra función es el siguiente:

{
“version”: “2.0”,
“extensions”: {
“serviceBus”: {
“prefetchCount”: 0,
“autoCompleteMessages”: true,
“maxAutoLockRenewalDuration”: “00:05:00”,
“maxConcurrentCalls”: 16,
“maxConcurrentSessions”: 2000,
“maxMessages”: 1000,
“sessionIdleTimeout”: “00:01:00”,
“enableCrossEntityTransactions”: false
}
},
“logging”: {
“applicationInsights”: {
“samplingExcludedTypes”: “Request”,
“samplingSettings”: {
“isEnabled”: true
}
},
“logLevel”: {
“Function.Delegation.User”: “Information”,
“Function”: “Error”
}
}
}

También tenemos un reintentador exponencial en caso de que los mensajes no se procesen correctamente, con reintentos infinitos, ya que no podemos permitirnos perder ningún dato:

[FunctionName(“Delegation”)]
[ExponentialBackoffRetry(-1, “00:00:01”, “00:01:00”)]
public async Task Run([ServiceBusTrigger(DelegationConstants.PlotQueueName, Connection = “ServiceBusConnectionString”, IsSessionsEnabled = true)] string myQueueItem, MessageReceiver messageReceiver, string lockToken, string messageId, ILogger log)

Nuestro espacio de nombres de Service Bus tiene una sola cola que activa esto. La cola tiene sesiones y particiones habilitadas y actualmente tenemos un tamaño de 1 GB en 16 particiones (16 GB). Nuestra clave de partición es un identificador de dispositivo físico (un IMEI en un dispositivo móvil si está familiarizado), por lo que tiene un rango muy amplio de valores (alrededor de 55k en total en nuestro patrimonio).

Nuestro mensaje de Service Bus se crea con una identificación de sesión de la clave de partición (IMEI):

var serviceBusMessage = new ServiceBusMessage(JsonConvert.SerializeObject(delegationMessage))
{
SessionId = delegationMessage.PartitionKey
};

Cada una de nuestras invocaciones de función tarda unos 200-300 ms:

Las “operaciones por dispositivo” deben procesarse FIFO, de ahí las sesiones. En cualquier momento, podríamos necesitar hasta (y en el futuro posiblemente más de) 1000 mensajes por segundo en muchos dispositivos, cada uno en 200-300 ms.

Hemos alcanzado la máxima optimización del código de nuestra función, por lo que lamentablemente no puedo hacerla más rápida.

Dado toda la información anterior, nuestra cola de Service Bus sigue aumentando, lo que indica que tal vez la configuración de Service Bus + función que tenemos ahora no es suficiente para manejar nuestro rendimiento. ¿Me estoy perdiendo algo aquí o he alcanzado el límite de la concurrencia con esta configuración? Nuestra función se ejecuta en un P1V3 y se sitúa en aproximadamente el 45% de la CPU y el 25% de la memoria.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Según la información proporcionada, hay algunas cosas que podrían estar causando el aumento del tamaño de la cola y posibles problemas de rendimiento:

    1. MaxConcurrentCalls: El MaxConcurrentCalls actual está configurado en 16, pero con una necesidad potencial de hasta 1000 mensajes por segundo, esto puede no ser suficiente. Aumentar este valor podría ayudar a mejorar el rendimiento.
    2. MaxConcurrentSessions: El MaxConcurrentSessions actual está configurado en 2000, lo cual debería ser suficiente para la carga de trabajo proporcionada. Sin embargo, dependiendo del número de sesiones activas en cualquier momento determinado, este valor puede necesitar ajustarse.

    3. Particionamiento: Aunque la clave de partición tiene un amplio rango de valores, todavía sólo se están utilizando 16 particiones, lo cual podría potencialmente causar problemas de rendimiento. Una solución podría ser aumentar el número de particiones para distribuir mejor la carga de trabajo.

    4. Escalado: Una función P1V3 debería ser suficiente para la carga de trabajo proporcionada, pero si el tamaño de la cola sigue aumentando a pesar de los esfuerzos de optimización, puede ser necesario considerar el escalado a un nivel más alto o escalar con más instancias.

    5. Registro y muestreo: La configuración actual de registro puede causar una sobrecarga innecesaria, especialmente con la configuración de muestreo habilitada. Deshabilitar o ajustar esta configuración podría ayudar a mejorar el rendimiento.

    En resumen, puede haber varios factores que contribuyan al aumento del tamaño de la cola y posibles problemas de rendimiento. Ajustar los valores de MaxConcurrentCalls y MaxConcurrentSessions, aumentar el número de particiones y escalar hacia arriba o hacia afuera según sea necesario puede ayudar a abordar estos problemas. Además, revisar y ajustar la configuración de registro también puede ayudar a mejorar el rendimiento.

Comments are closed.