Editar

Compartir a través de


Patrón de cola de prioridad

Azure Service Bus

El patrón de cola de prioridad permite que una carga de trabajo procese tareas de alta prioridad más rápidamente que las tareas de prioridad inferior. Este patrón utiliza mensajes enviados a una o varias colas y es útil en aplicaciones que ofrecen diferentes garantías de nivel de servicio a clientes concretos.

Contexto y problema

Para las cargas de trabajo se suele necesitar 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 atienden las tareas de prioridad alta, esto puede afectar a la experiencia del usuario y a los acuerdos de nivel de servicio (SLA).

Para controlar las tareas de forma eficaz en función de su prioridad, las cargas de trabajo necesitan un mecanismo para priorizar y ejecutar tareas en consecuencia. Normalmente, las cargas de trabajo procesan las tareas en el orden en que llegan, mediante una estructura de cola de "el primero en entrar es el primero en salir" (FIFO). Este método 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 su orden de llegada. La aplicación que envía un mensaje a la cola asigna una prioridad al mensaje y los consumidores procesan los mensajes por prioridad. Use el patrón de cola de prioridad cuando tenga los siguientes requisitos:

  • Controle las tareas de urgencia e importancia variables. Tiene tareas con diferentes niveles de urgencia e importancia y es necesario procesar tareas más primarias antes que las menos primarias.

  • Controle diferentes acuerdos de nivel de servicio. Ofrece diferentes garantías de nivel de servicio a los clientes y necesita asegurarse de que los clientes de alta prioridad reciben un mejor rendimiento y disponibilidad.

  • Adáptese a diferentes necesidades de administración de cargas de trabajo. Tiene una carga de trabajo que necesita atender determinadas tareas de inmediato y las tareas menos urgentes pueden esperar.

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

  • Cola única: todos los mensajes se envían a una cola y cada mensaje asigna una prioridad.

  • Varias colas: se usan colas independientes para cada prioridad de mensaje.

Cola única

Con una sola cola, la aplicación (productor) asigna una prioridad a cada mensaje y envía el mensaje a la 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 cola que admite la asignación de prioridad a los mensajes.
Figura 1. Arquitectura de cola única y un único grupo de consumidores

Varias colas

Varias colas permiten separar el mensaje por prioridad. La aplicación asigna una prioridad a cada mensaje y dirige el mensaje a la cola correspondiente a su prioridad. Los consumidores procesan los mensajes. La solución de varias colas usa un único grupo de consumidores o varios grupos de consumidores.

Varios grupos de consumidores

Con varios grupos de consumidores, cada cola tiene recursos de consumidor dedicados. Las colas de mayor prioridad deben usar más consumidores o niveles de rendimiento más altos para procesar mensajes de forma más rápida que las colas de prioridad más baja.

Use varios grupos de consumidores cuando tenga:

  • Requisitos de rendimiento exigentes: se necesitan varios grupos de consumidores cuando las diferentes prioridades de las tareas tienen requisitos de rendimiento estrictos que deben cumplirse por separado.
  • Necesidades de alta fiabilidad: se necesitan varios grupos de consumidores para las aplicaciones en las que la fiabilidad y el aislamiento de errores son esenciales. Los problemas de una cola no deben afectar a otras colas.
  • Aplicaciones complejas: tiene ventajas en aplicaciones complejas con tareas que requieren diferentes características de procesamiento y garantías de rendimiento para diferentes tareas.

Diagrama que muestra el uso de colas de mensajes independientes para cada prioridad.
Ilustración 2. Arquitectura de varias colas y varios grupos de consumidores.

Grupo de consumidores único

Con un único grupo de consumidores, todas las colas comparten un solo grupo de consumidores. Los consumidores procesan primero los mensajes de la cola de prioridad más alta y solo procesan los mensajes de las colas de prioridad inferior cuando no hay ningún mensaje de prioridad alta. Con ello, el único grupo de consumidores siempre procesa los mensajes de prioridad más altos antes de los de menor prioridad. Esta configuración podría dar lugar a que los mensajes de prioridad más baja se retrasen siempre y, posiblemente, nunca se procesen.

Use un único grupo de consumidores en los casos siguientes:

  • Administración sencilla: un único grupo de consumidores es adecuado para la aplicación en la que la prioridad es que su instalación y mantenimiento deban ser fáciles. Reduce la complejidad de la configuración y supervisión.
  • Necesidades de procesamiento unificadas: un único grupo de consumidores es útil cuando la naturaleza exacta de las tareas entrantes es similar.

Diagrama que muestra el uso de colas de mensajes independientes para cada prioridad.
Figura 3. Arquitectura de varias colas y grupos único de consumidores.

Recomendaciones para el patrón de cola de prioridad

Tenga en cuenta las siguientes recomendaciones cuando decida cómo implementar el patrón de cola de prioridad:

Recomendaciones generales

  • Defina claramente las prioridades. Establezca niveles de prioridad distintos y claros que tengan que ver con la solución. Por ejemplo, un mensaje de alta prioridad podría necesitar procesos en períodos de 10 segundos. Identifique los requisitos para controlar los elementos de alta prioridad y asigne los recursos necesarios como corresponda.

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

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

  • Realice procesamientos de prioridad baja. En las colas que admitan la priorización de mensajes, aumente de forma dinámica la prioridad de los mensajes antiguos si el sistema permite que los mensajes de prioridad baja se procesen finalmente.

  • Fíjese en los costes de las colas. Tenga en cuenta los costes económicos y de procesamiento asociados a la colas de verificación. Algunos servicios de cola cobran tarifas por publicar, recuperar y consultar mensajes, lo que puede aumentar con el número de colas.

Recomendaciones para varias colas

  • Controle las velocidades de procesamiento. Para garantizar que los mensajes de esas colas se procesan a la velocidad esperada, regule la velocidad de procesamiento en colas de alta y baja prioridad.

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

Recomendaciones para grupos únicos de consumidores

  • Implemente el adelanto y la suspensión. Decida si se deben procesar todos los elementos de prioridad alta antes que los elementos de menor prioridad. Use un algoritmo que garantice que las colas de prioridad alta siempre se atenderán antes que las colas de prioridad inferior al usar un grupo único de consumidores para varias colas.

  • Optimización de costes. Optimice los costes operativos mediante bajando el número de consumidores al usar el método de cola única. Los mensajes con prioridad alta se procesan primero, aunque posiblemente más lentos, mientras que los mensajes de menor prioridad pueden tardar más.

Diseño de cargas de trabajo

Un arquitecto debe evaluar cómo el patrón de cola de prioridad carga de trabajo puede cumplir los objetivos y principios descritos en los pilares del Marco de buena arquitectura de Azure. Por ejemplo:

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
- RE:07 Trabajos en segundo plano
La eficiencia del rendimiento ayuda a que la carga de trabajo satisfaga eficazmente 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

Al igual que con cualquier decisión de diseño, hay que tener en cuenta las ventajas y desventajas con respecto a los objetivos de los otros pilares que podrían introducirse con este patrón.

Ejemplo de patrón de cola de prioridad

En el ejemplo siguiente de GitHub se muestra una implementación del patrón de cola de prioridad mediante Azure Service Bus.

Diagrama que refleja cómo implementar una cola de prioridad mediante un bus de servicio.
Figura 4. Arquitectura de ejemplo de PriorityQueue en GitHub

Aquí tiene información general de la arquitectura:

  • Aplicación (productor): el ejemplo tiene una aplicación (PriorityQueueSender) que crea mensajes y asigna una propiedad personalizada denominada Priority en cada mensaje. Priority tiene un valor de High o Low.

  • Agente de mensajes y colas: en el ejemplo se usa Azure Service Bus como agente de mensajes. Usa dos colas de Azure Service Bus, una para cada prioridad de mensaje (High y Low). La aplicación (productor) envía mensajes a la cola correcta en función del mensaje Priority.

  • Varios grupos de consumidores: en el ejemplo se usan varios grupos de consumidores (PriorityQueueConsumerHigh y PriorityQueueConsumerLow) destinados a leer mensajes de cada una de las colas.

Rol en la arquitectura de ejemplo Servicio de Azure en el ejemplo Nombre en el ejemplo
Application Aplicación Azure Functions PriorityQueueSender
Agente de colas de mensajes Azure Service Bus <espacio de nombres del bus de servicio>
Colas de mensajes Colas de Azure Service Bus <nombres de colas>
Consumidores Aplicación Azure Functions PriorityQueueConsumerHigh
PriorityQueueConsumerLow

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

  • Patrón de consumidores competidores: este patrón implica la implementación de varios consumidores que escuchan las mismas tareas de cola y procesos en paralelo para aumentar el rendimiento. Solo un consumidor procesa cada mensaje. En el artículo se da información detallada sobre las ventajas y desventajas de este método.

  • Patrón de limitación: este patrón se puede implementar mediante colas para administrar las tasas de solicitud. Al usar la mensajería prioritaria, las solicitudes de aplicaciones importantes o clientes de alto valor se pueden priorizar sobre las menos importantes.