Tiempo de retraso entre el aumento de la actividad cuando se usa el patrón de encadenamiento de funciones de Azure

 C Programming >> Programación C >  >> Tags >> Azure
Tiempo de retraso entre el aumento de la actividad cuando se usa el patrón de encadenamiento de funciones de Azure

La solución para el tiempo de retraso entre el aumento de la actividad cuando se usa el patrón de encadenamiento de funciones de Azure
se proporciona a continuación:

Tengo 3000 actividades ejecutándose en una línea como el siguiente código

El problema es que para las primeras cien actividades, se ejecuta rápido.

Para las próximas cien actividades, comienza a retrasarse antes de comenzar una nueva actividad (retraso de 1 segundo entre dos actividades)

Para las últimas cien actividades, el tiempo de retraso es de casi 15 segundos.

Parece que la función duradera de Azure no admite el encadenamiento que tiene una gran cantidad de actividad. En su lugar, deberíamos pasar a utilizar un patrón de abanico. Pero eso no se ajusta a mis necesidades.

        [FunctionName("Trigger")]
        public static async Task<HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequestMessage req,
            [DurableClient] IDurableOrchestrationClient starter,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");
            string instanceId = await starter.StartNewAsync("Orchestrator", null);
            log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
            return starter.CreateCheckStatusResponse(req, instanceId);
        }

        [FunctionName("Orchestrator")]
        public static async Task<List<string>> RunOrchestrator(
            [OrchestrationTrigger] IDurableOrchestrationContext context,
            ILogger log)
        {
            log.LogInformation($"XXX start Orc");
            var outputs = new List<string>();
            //var tasks = new List<Task<string>>();

            // Run activity in a line
            for (int i = 0; i < 3000; i++)
                outputs.Add(await context.CallActivityAsync<string>("Activity", $"Sinh{i + 1}"));

            //outputs.AddRange(await Task.WhenAll(tasks));
            log.LogInformation($"XXX stop Orc");
            return outputs;
        }

        [FunctionName("Activity")]
        public static string SayHello([ActivityTrigger] string name, ILogger log)
        {
            log.LogInformation($"XXX Saying hello to {name}.");
            return $"Hello {name}!";
        }

Cualquier sugerencia es muy apreciada

Espero que puedas dramáticamente aumente la velocidad de su orquestación configurando extendedSessionsEnabled a true en host.json. Algunos documentos aquí:https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-perf-and-scale#extended-sessions

Un poco más de información:las orquestaciones se descargan de la memoria cada vez que await una tarea en particular por primera vez. Eso significa que su orquestación se descarga y recarga 3000 veces. Cada vez que se vuelve a cargar en la memoria, debe volver a leer su historial de ejecución desde Azure Storage y luego reproducir el código orquestador para volver a su posición anterior. Cada reproducción será más costosa porque tiene que iterar a través de más código y cargar más filas de historial en la memoria.

Las sesiones extendidas eliminan todo el comportamiento de reproducción anterior al evitar que la orquestación descargue su estado. Esto significa que nunca necesita reproducir ni recargar todo el historial de orquestación en cada nuevo await . Definitivamente lo recomiendo tanto para grandes fan-in/fan-outs como para secuencias grandes como en tu ejemplo.

Utilice varios procesos de trabajo:

De forma predeterminada, cualquier instancia de host de Functions utiliza un único proceso de trabajo. Para mejorar el rendimiento, use el FUNCTIONS_WORKER_PROCESS_COUNT para aumentar la cantidad de procesos de trabajo por host (hasta 10).

Consulte más aquí

Retraso de la orquestación:

Las instancias de orquestaciones se inician poniendo un ExecutionStarted mensaje en una de las colas de control del centro de tareas. En determinadas condiciones, puede observar retrasos de varios segundos entre el momento en que se programa la ejecución de una orquestación y el momento en que comienza a ejecutarse. Durante el tiempo de intervalo, la instancia de orquestación permanece en el Pending estado. Hay dos posibles causas de este retraso:

Colas de control atrasadas:
La cola de control de la instancia contiene una gran cantidad de mensajes, puede pasar un tiempo antes de que ExecutionStarted el tiempo de ejecución recibe y procesa el mensaje. Los retrasos en los mensajes pueden ocurrir cuando las orquestaciones procesan muchos eventos al mismo tiempo. Los eventos que van a la cola de control incluyen eventos de inicio de orquestación, finalización de actividades, temporizadores duraderos, terminación y eventos externos. Si este retraso ocurre en circunstancias normales, considere crear un nuevo centro de tareas con una mayor cantidad de particiones. La configuración de más particiones hará que el tiempo de ejecución cree más colas de control para la distribución de la carga. Cada partición corresponde a 1:1 con una cola de control, con un máximo de 16 particiones.

POR defecto, el número de particiones es cuatro . Si se necesitan más particiones, debe actualizar la configuración del centro de tareas en host.json con un nuevo recuento de particiones. El host detectará este cambio después de que se haya reiniciado.

Retirar los retrasos en los sondeos:
Otra causa común de demoras en la orquestación se describe aquí, el comportamiento de sondeo de retroceso para las colas de control. Sin embargo, este retraso solo se espera cuando una aplicación se escala horizontalmente a dos o más instancias. Si solo hay una instancia de la aplicación o si la instancia de la aplicación que inicia la orquestación también es la misma instancia que está sondeando la cola de control de destino, entonces no habrá un retraso en el sondeo de la cola. Los retrasos en el sondeo pueden reducirse actualizando host.json configuración, como se describió anteriormente.

Consulte los retrasos en la orquestación