Patrón de cola de prioridad

Priorice las solicitudes enviadas a los servicios para que una carga de trabajo procese solicitudes de alta prioridad más rápidamente que las de prioridad inferior. Este enfoque usa mensajes enviados a una o varias colas y es útil para las aplicaciones que proporcionan diferentes niveles de servicio o acuerdos de nivel de servicio (SLA) a diferentes tipos de solicitud o clientes.

Contexto y problema

Es posible que las cargas de trabajo necesiten administrar y procesar tareas con distintos niveles de importancia y urgencia. Algunas tareas requieren atención inmediata mientras que otras pueden esperar. Si no se solucionan las tareas de prioridad alta, puede afectar a la experiencia del usuario y a los acuerdos de nivel de servicio de vulneración de seguridad.

Para controlar las tareas de forma eficaz en función de su prioridad, las cargas de trabajo necesitan un mecanismo para procesar y ejecutar tareas en consecuencia. De forma predeterminada, la mayoría de las cargas de trabajo procesan las tareas en el orden en que llegan, mediante una estructura de cola primero en salir (FIFO). Este enfoque no tiene en cuenta la importancia variable de las tareas.

Solución

Las colas de prioridad permiten que las cargas de trabajo procesen tareas en función de su prioridad en lugar de estrictamente por su orden de llegada. La aplicación o productor que envía una solicitud asigna un valor de prioridad al mensaje y los consumidores procesan los mensajes por prioridad. El patrón De cola de prioridad aborda los siguientes requisitos:

  • Controla las tareas de urgencia y importancia variables: Tiene tareas con diferentes niveles de urgencia e importancia y necesita asegurarse de procesar tareas más críticas antes de las menos críticas.

  • Controla diferentes acuerdos de nivel de servicio: Ofrece diferentes acuerdos de nivel de servicio a diferentes clientes y necesita asegurarse de que los clientes de alta prioridad reciban un mejor rendimiento y disponibilidad.

  • Admite diferentes necesidades de administración de cargas de trabajo: Tiene una carga de trabajo que necesita abordar determinadas tareas inmediatamente, mientras que las tareas menos urgentes pueden esperar.

Hay dos métodos principales para implementar el patrón de cola de prioridad:

  • Cola única: A cada mensaje se le asigna un valor de prioridad y todos los mensajes usan la misma cola.

  • Varias colas: A cada mensaje se le asigna un valor de prioridad y los mensajes de prioridad diferentes usan colas independientes.

Cola única

En un único enfoque de cola, la aplicación asigna una prioridad a cada mensaje y envía todos los mensajes a una sola cola. La cola ordena los mensajes por prioridad, lo que garantiza que los consumidores procesen mensajes de mayor prioridad antes que los de menor prioridad.

Diagrama que ilustra un mecanismo de puesta en cola que admite la priorización de mensajes.

Múltiples colas

Varias colas separan los mensajes por prioridad. La aplicación asigna una prioridad a cada mensaje y dirige el mensaje a la cola que corresponde a su prioridad, donde los consumidores procesan los mensajes. Una solución de varias colas puede usar un único grupo de consumidores o varios grupos de consumidores.

Grupo de consumidores único

En una única configuración de grupo, todas las colas comparten el mismo grupo de consumidores. Los consumidores procesan los mensajes de la cola de prioridad más alta primero y procesan los mensajes de las colas de prioridad inferior solo cuando no hay más mensajes de prioridad alta. Como resultado, los grupos de consumidores únicos siempre procesan mensajes de mayor prioridad antes de los de prioridad inferior. Esta configuración puede provocar que los mensajes de prioridad inferior se retrase continuamente y, posiblemente, nunca se procesen.

Diagrama que muestra el uso de un único grupo de consumidores para todas las prioridades.

Use un único grupo de consumidores por los siguientes motivos:

  • Administración sencilla. Use un único grupo de consumidores cuando sea fácil la configuración y el mantenimiento es una prioridad. Un único grupo reduce la complejidad de la configuración y la supervisión.

  • Necesidades de procesamiento unificado. Use un único grupo de consumidores cuando las tareas entrantes sean similares en el tipo .

Varios grupos de consumidores

En un grupo de varios consumidores, cada cola tiene un grupo de consumidores dedicado. Las colas de mayor prioridad usan más consumidores o niveles de rendimiento más altos para procesar mensajes más rápidamente que las colas de prioridad inferior.

Diagrama que muestra el uso de grupos de consumidores independientes para cada prioridad.

Use varios grupos de consumidores por los siguientes motivos:

  • Requisitos estrictos de rendimiento. Use varios grupos de consumidores cuando las diferentes prioridades de tareas tengan requisitos de rendimiento estrictos que deben cumplirse de forma independiente.

  • Necesidades de alta confiabilidad. Use varios grupos de consumidores para aplicaciones cuando la confiabilidad y el aislamiento de errores sean críticos y los problemas de una cola no deben afectar a otras colas.

  • Aplicaciones complejas. Use varios grupos de consumidores para aplicaciones complejas en las que las distintas tareas requieren diferentes características de procesamiento y garantías de rendimiento.

Problemas y consideraciones

Tenga en cuenta los puntos siguientes al decidir cómo implementar este patrón:

Recomendaciones generales

  • Defina claramente las prioridades. Establezca niveles de prioridad distintos y claros que sean relevantes para la solución. Por ejemplo, puede definir mensajes de alta prioridad como aquellos que requieren procesamiento en un plazo de 10 segundos. Identifique los requisitos del consumidor para controlar los elementos de alta prioridad y asigne los recursos necesarios en consecuencia.

  • Ajuste dinámicamente los grupos de consumidores. Escale el tamaño de los grupos de consumidores en función de la longitud de la cola que están atendiendo.

  • Supervisar el estado de la cola. Realice un seguimiento de la profundidad de la cola, la latencia de procesamiento, el recuento de entregas y el rendimiento para poder detectar trabajos pendientes y ralentizaciones antes de que afecten al trabajo.

  • Use colas de mensajes fallidos. Mueva mensajes dudosos a una cola de mensajes fallidos después de un número configurable de intentos de entrega, por lo que un mensaje incorrecto no bloquea la ruta de acceso de prioridad.

  • Priorice los niveles de servicio. Implemente colas de prioridad para suplir las necesidades empresariales que requieran disponibilidad o rendimiento prioritarios. Por ejemplo, los clientes de alta prioridad pueden recibir un nivel de servicio superior para que experimenten un mejor rendimiento y disponibilidad.

  • Considere el procesamiento de prioridad baja. Decida si todos los elementos de prioridad alta deben procesarse antes de cualquier elemento de prioridad inferior. Si es posible, aumente dinámicamente la prioridad de los mensajes antiguos para asegurarse de que los mensajes de prioridad baja se procesen finalmente.

  • Optimice y minimice los costos. Procese tareas importantes inmediatamente con los consumidores disponibles. Programe tareas en segundo plano menos importantes cuando haya menos actividad.

    Si usa una sola cola, optimice los costos mediante el escalado vertical del número de consumidores. Los mensajes de prioridad alta procesan primero, pero posiblemente más lentamente, mientras que los mensajes de prioridad inferior podrían enfrentar retrasos más largos.

  • Proteja los procesadores de los picos de demanda. Si la tasa de llegada de productores puede superar la capacidad de procesamiento del consumidor, combine este patrón con el patrón de nivelación de carga basado en colas. Este enfoque almacena en búfer las ráfagas de tráfico y ayuda a evitar que los recursos de procesamiento de bajada se sobrecarguen.

Recomendaciones de varias colas

  • Controle las velocidades de procesamiento. Para asegurarse de que los mensajes se procesan a las velocidades esperadas, supervise continuamente la velocidad de procesamiento de las colas de alta y baja prioridad.

  • Implemente la preempción y la suspensión. Si usa varias colas con un único grupo de consumidores, implemente un algoritmo que garantice que las colas de prioridad alta siempre se atenderán antes de las colas de prioridad inferior.

  • Fíjese en los costes de las colas. Tenga en cuenta los costos financieros asociados a las colas de comprobación y procesamiento. Algunos servicios de cola cobran tarifas por publicar, recuperar y consultar mensajes. Estas tarifas pueden aumentar con el número de colas.

Cuándo usar este patrón

Use este patrón cuando:

  • Debe cumplir diferentes objetivos de latencia o nivel de servicio para diferentes clases de trabajo, como las solicitudes de cliente premium frente a estándar.

  • El trabajo llega a ráfagas y debe proteger las operaciones críticas mediante el procesamiento de mensajes de alta prioridad en primer lugar mientras se aplaza el trabajo de prioridad inferior.

Este patrón podría no ser adecuado cuando:

  • Todos los elementos de trabajo tienen una importancia empresarial similar y el procesamiento FIFO estricto es más importante que la programación basada en prioridades.

  • Las tareas tienen dependencias de ordenación sólidas en los niveles de prioridad y el reordenamiento del trabajo por prioridad puede provocar resultados incoherentes o requerir una lógica de coordinación compleja.

Diseño de cargas de trabajo

Evalúe cómo usar el patrón De cola de prioridad en el diseño de una carga de trabajo para abordar los objetivos y principios descritos en los pilares de Azure Well-Architected Framework. En la tabla siguiente se proporciona una guía sobre cómo este patrón apoya los objetivos de cada pilar.

Fundamento Cómo apoya este patrón los objetivos de los pilares
Las decisiones de diseño de la fiabilidad ayudan a que la carga de trabajo sea resistente a los errores y a garantizar que se recupere a un estado de pleno funcionamiento después de que se produzca un error. La separación de elementos en función de la prioridad empresarial le permite centrar los esfuerzos de confiabilidad en el trabajo más crítico.

- RE:02 Flujos críticos
Eficiencia del rendimiento ayuda a su carga de trabajo a satisfacer eficientemente las demandas mediante optimizaciones en el escalado, los datos y el código. La separación de elementos en función de la prioridad empresarial le permite centrar los esfuerzos de rendimiento en el trabajo más sujeto al tiempo.

- PE:09 Flujos críticos

Si este patrón introduce concesiones dentro de un pilar, considérelas en relación con los objetivos de los otros pilares.

Ejemplo:

El ejemplo de patrón Priority Queue en GitHub muestra una implementación del patrón De cola de prioridad que usa temas y suscripciones de Azure Service Bus. En el ejemplo se implementa una cuenta de almacenamiento segura, un recurso de Application Insights para la supervisión y un espacio de nombres Service Bus para habilitar la comunicación entre las funciones de remitente y consumidor.

La implementación incluye tres aplicaciones de función: un remitente y dos consumidores. Las aplicaciones de consumidor usan recuentos de instancias máximos diferentes para simular la priorización de mensajes. La funcPriorityQueueConsumerHigh función puede escalar horizontalmente a 200 instancias, mientras que la funcPriorityQueueConsumerLow función está limitada a 40 instancias. Todas las aplicaciones de funciones usan el plan de consumo flex y están conectadas a Application Insights para diagnósticos y supervisión.

Las asignaciones de roles conceden acceso seguro a Service Bus y almacenamiento mediante identidades administradas. Todas las aplicaciones de funciones comparten la misma cuenta de almacenamiento y el recurso de Application Insights. Esta configuración centraliza la observabilidad y el registro.

En el diagrama siguiente se muestra la arquitectura de cola de prioridad:

Diagram que muestra cómo implementar una cola de prioridad mediante Service Bus.

En el diagrama anterior:

  1. Aplicación (productor). La PriorityQueueSender aplicación crea mensajes, asigna una propiedad de aplicación personalizada denominada Priority a cada mensaje y establece el Priority valor High en o Low.

  2. Agente de mensajes y tema. El agente de mensajes Service Bus envía mensajes a un único tema de Service Bus denominado messages. Service Bus usa filtros SQL para enrutar cada mensaje a la suscripción de prioridad alta o de prioridad baja, en función de su Priority valor.

  3. Varios grupos de consumidores. Los PriorityQueueConsumerHigh grupos de consumidores y PriorityQueueConsumerLow responden a los mensajes de las suscripciones de prioridad alta o de prioridad baja mediante el uso de desencadenadores de Azure Functions Service Bus.

Rol en el ejemplo servicio Azure en ejemplo Nombre en el ejemplo
Aplicación (productor) aplicación de Azure Functions PriorityQueueSender
Agente de mensajes Azure Service Bus (Autobús de Servicio de Azure) <el espacio de nombres de Service Bus>
Tema de mensaje tema de Azure Service Bus messages
Suscripciones de mensajes suscripciones de Azure Service Bus highPriority
lowPriority
Consumidores aplicación de Azure Functions PriorityQueueConsumerHigh
PriorityQueueConsumerLow

Pasos siguientes

  • Service Bus colas, temas y suscripciones: revise las entidades Service Bus y las diferencias entre colas y temas.
  • Detección de duplicados: obtenga información sobre cómo Service Bus puede rechazar mensajes duplicados cuando un remitente vuelve a intentarlo después de un envío no seguro.
  • Colas de mensajes fallidos: obtenga información sobre cómo Service Bus mueve los mensajes que no se pueden procesar a una cola de mensajes fallidos para su investigación o reprocesamiento.
  • ¿Qué es Azure Queue Storage?: revise los conceptos básicos de Azure Queue Storage para compararlo con Service Bus colas.

Los patrones siguientes pueden resultar útiles al implementar este patrón:

  • Queue-Based patrón de nivelación de carga: use una cola como búfer entre la entrada y el procesamiento de solicitudes. Úselo con el patrón De cola de prioridad cuando necesite protección contra ráfagas y control diferenciado.

  • Patrón de consumidores competidores: implemente varios consumidores que escuchen las mismas tareas de cola y proceso en paralelo para aumentar el rendimiento. Solo un consumidor procesa cada mensaje.

  • Patrón de limitación: implemente la limitación mediante colas para administrar las tasas de solicitud. Use la mensajería de prioridad para priorizar las solicitudes de las aplicaciones críticas o los clientes de alto valor sobre los menos importantes.