Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Permite que varios consumidores simultáneos procesen los mensajes recibidos en el mismo canal de mensajería. Con varios consumidores simultáneos, un sistema puede procesar varios mensajes al mismo tiempo para optimizar el rendimiento, mejorar la escalabilidad y la disponibilidad y equilibrar la carga de trabajo.
Contexto y problema
Una aplicación en la nube suele controlar un gran número de solicitudes. En lugar de procesar cada solicitud de forma sincrónica, la aplicación puede pasar solicitudes a través de un sistema de mensajería a un servicio de consumidor que los controle de forma asincrónica. Esta estrategia ayuda a evitar que el procesamiento de solicitudes bloquee la lógica de negocios de la aplicación.
El número de solicitudes puede variar significativamente con el tiempo. Un aumento repentino de la actividad del usuario o las solicitudes agregadas de varios inquilinos puede crear una carga de trabajo impredecible. En horas punta, es posible que un sistema necesite procesar muchos cientos de solicitudes por segundo. En otras ocasiones, el número podría ser pequeño. Además, el trabajo necesario para controlar estas solicitudes puede variar ampliamente. Si usa una única instancia de servicio de consumidor, las solicitudes pueden sobrecargar esa instancia. O bien, una entrada de mensajes de aplicación puede sobrecargar el sistema de mensajería.
Para controlar esta carga de trabajo fluctuante, el sistema puede ejecutar varias instancias de servicio de consumidor. Sin embargo, el sistema debe coordinar estos consumidores para asegurarse de que cada mensaje se entregue solo a un consumidor. El sistema también debe equilibrar la carga de trabajo entre los consumidores para evitar que una instancia se convierta en un cuello de botella.
Solución
Use una cola de mensajes para implementar el canal de comunicación entre la aplicación y las instancias del servicio de consumidor. La aplicación envía solicitudes como mensajes a la cola y las instancias del servicio consumidor reciben y procesan mensajes de la cola. Este enfoque permite que el mismo grupo de instancias de servicio de consumidor controle los mensajes de cualquier instancia de la aplicación. En el diagrama siguiente se muestra cómo una cola de mensajes distribuye el trabajo a las instancias de servicio.
Nota:
Varios consumidores reciben estos mensajes, pero el patrón de Consumidores competidores difiere del patrón Publisher-Subscriber. En el patrón de Consumidores Competidores, un consumidor recibe cada mensaje para su procesamiento. En el patrón Publisher-Subscriber, todos los consumidores reciben todos los mensajes.
Esta solución tiene las siguientes ventajas:
Proporciona un sistema de nivelación de carga que puede controlar variaciones amplias en el volumen de solicitudes de instancias de aplicaciones. La cola funciona como un búfer entre las instancias de aplicación y las instancias de servicio de consumidor. Este búfer puede minimizar el efecto en la disponibilidad y la capacidad de respuesta de las instancias de aplicación y servicio. Para obtener más información, consulte patrón de nivelación de carga basado en cola. Un mensaje que requiere algún procesamiento de larga duración no impide que otras instancias de servicio de consumidor procesen otros mensajes simultáneamente.
Mejora la confiabilidad. Si un productor se comunica directamente con un consumidor en lugar de usar este patrón y no supervisa al consumidor, se enfrenta a una alta probabilidad de perder mensajes o no procesarlos cuando se produce un error en el consumidor. En este patrón, el sistema no envía mensajes a una instancia de servicio específica. Una instancia de servicio con errores no bloquea un productor y cualquier instancia de servicio de trabajo puede procesar mensajes.
No requiere una coordinación compleja entre consumidores o entre instancias de productor y consumidor. La cola de mensajes garantiza que cada mensaje se entrega al menos una vez.
Se escala. Al aplicar el escalado automático, el sistema puede aumentar o disminuir dinámicamente el número de instancias de servicio de consumidor a medida que fluctúa el volumen de mensajes.
Puede mejorar la resistencia si la cola de mensajes proporciona operaciones de lectura transaccionales. Si una instancia de servicio de consumidor lee y procesa un mensaje como parte de una operación transaccional y produce un error, este patrón puede asegurarse de que el mensaje se devuelve a la cola para que otra instancia de servicio de consumidor pueda procesarlo. Para mitigar el riesgo de errores continuos de mensajes, se recomienda usar colas de mensajes muertos.
Problemas y consideraciones
Tenga en cuenta los siguientes puntos a medida que decida cómo implementar este patrón:
Ordenación de mensajes: El orden en el que las instancias del servicio de consumidor reciben mensajes no está garantizado y no muestra necesariamente el orden en el que se crearon los mensajes. Diseñe el sistema para que procese mensajes idempotentemente. Este diseño ayuda a eliminar las dependencias del orden de procesamiento.
Azure Service Bus puede implementar el orden garantizado primero en entrar, primero en salir de los mensajes y otros patrones mediante sesiones de mensajes.
Requisitos de resistencia del servicio: Si el sistema detecta y reinicia las instancias de servicio con errores, es posible que tenga que implementar las operaciones que esas instancias de servicio realizan como idempotentes para minimizar los efectos cuando recupera y procesa un único mensaje más de una vez.
Detección de mensajes dudosos: Un mensaje con formato incorrecto o una tarea que requiere acceso a los recursos que no están disponibles puede provocar un error en una instancia de servicio. El sistema debe impedir que estos mensajes vuelvan a la cola indefinidamente y, en su lugar, capturen y almacenen sus detalles en otro lugar para su análisis si es necesario. Service Bus puede enviar automáticamente mensajes a una cola de mensajes muertos después de que el recuento de entregas supere el umbral configurado
MaxDeliveryCount.Control de resultados: La instancia de servicio que controla un mensaje está completamente desacoplada de la lógica de la aplicación que genera el mensaje, por lo que es posible que no puedan comunicarse directamente. Si la instancia de servicio genera resultados que deben volver a la lógica de la aplicación, almacene esta información en una ubicación a la que pueden acceder ambos componentes. Para evitar que la lógica de la aplicación recupere datos incompletos, el sistema debe indicar cuándo se completa el procesamiento. Un proceso de trabajo puede devolver los resultados a la lógica de la aplicación a través de una cola de respuesta de mensajes dedicada. La lógica de aplicación debe poder correlacionar estos resultados con el mensaje original.
Escalado del sistema de mensajería: En una solución a gran escala, un gran volumen de mensajes puede sobrecargar una sola cola de mensajes y convertirlo en un cuello de botella del sistema. En esta situación, considere la posibilidad de crear particiones del sistema de mensajería para enviar mensajes de productores específicos a una cola específica o equilibrar la carga para distribuir mensajes entre varias colas de mensajes.
Confiabilidad del sistema de mensajería: Use un sistema de mensajería confiable para garantizar que los mensajes no se pierdan después de que la aplicación los enquete. Esta funcionalidad es esencial para asegurarse de que todos los mensajes se entregan al menos una vez.
Cuándo usar este patrón
Use este patrón en los siguientes supuestos:
La carga de trabajo de la aplicación se divide en tareas que se pueden ejecutar de forma asincrónica.
Las tareas sean independientes y se puedan ejecutar en paralelo.
El volumen de trabajo es muy variable y requiere una solución escalable.
La solución debe proporcionar alta disponibilidad y permanecer resistente cuando se produce un error en el procesamiento de tareas.
Este patrón podría no ser adecuado cuando:
No se puede separar fácilmente la carga de trabajo de la aplicación en tareas discretas o hay un alto grado de dependencia entre las tareas.
Las tareas deben ejecutarse de forma sincrónica y la lógica de la aplicación debe esperar a que se complete cada tarea antes de continuar.
Las tareas deben ejecutarse en una secuencia específica.
Nota:
Algunos sistemas de mensajería admiten sesiones que permiten a un grupo de productores agrupar mensajes y asegurarse de que el mismo consumidor controla todos los mensajes del grupo. Puede usar este mecanismo con mensajes prioritarios cuando se admite para aplicar el orden de mensajes y entregar mensajes en secuencia de un productor a un único consumidor.
Diseño de cargas de trabajo
Evalúe cómo usar el patrón de Consumidores Competidores en el diseño de una carga de trabajo para abordar los objetivos y principios descritos en los pilares del 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 fiabilidad ayudan a que su carga de trabajo sea resiliente a fallos y garantizan que se recupere a un estado de pleno funcionamiento después de que se produzca un fallo. | Este patrón crea redundancia en el procesamiento de colas tratando a los consumidores como réplicas, de modo que un error de instancia no impide que otros consumidores procesen los mensajes de la cola. - RE:05 Redundancia - Trabajos en segundo plano |
| La optimización de costos se centra en mantener y mejorar la rentabilidad de la carga de trabajo en la inversión. | Este patrón puede contribuir a optimizar los costos porque se escala en función de la profundidad de la cola y puede escalar hasta cero cuando la cola está vacía. También puede optimizar los costos porque puede limitar el número máximo de instancias de consumidor simultáneas. - CO:05 Optimización de velocidad - CO:07 Costos de componentes |
| 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. | Este patrón distribuye la carga entre los nodos de consumidor para aumentar el uso y el escalado dinámico en función de la profundidad de la cola minimiza el sobreaprovisionamiento. - PE:05 Escalado y particionamiento - PE:07 Código e infraestructura |
Si este patrón introduce concesiones dentro de un pilar, considérelas en relación con los objetivos de los otros pilares.
Ejemplo
Azure proporciona colas de Service Bus y desencadenadores de cola de Azure Functions que implementan directamente este patrón de diseño en la nube. Functions se integra con Service Bus mediante desencadenadores y enlaces. Esta integración le permite crear funciones que consumen mensajes de cola de editores. Las aplicaciones publican mensajes en una cola, y los consumidores implementados como funciones pueden recuperar y manejar esos mensajes.
Para garantizar la resiliencia, una cola de Service Bus permite al cliente usar el modo PeekLock cuando recupera un mensaje de la cola. Este modo mantiene el mensaje pero lo oculta de otros consumidores. El runtime de Functions recibe un mensaje en modo PeekLock. Si la función se completa correctamente, el tiempo de ejecución llama a Complete en el mensaje. Si la función falla, el tiempo de ejecución podría llamar a Abandon y hacer que el mensaje sea visible de nuevo para que otro consumidor pueda recuperarlo. Si la función se ejecuta más tiempo que el tiempo de espera de PeekLock, el tiempo de ejecución renueva automáticamente el bloqueo siempre que se ejecute la función.
Functions escala automáticamente el número de instancias de consumidor en función de la profundidad de cola y el tráfico. Este escalado permite que la solución controle las ráfagas de trabajo al tiempo que minimiza el costo durante períodos de bajo volumen. Si Functions crea varias instancias, compiten mediante la extracción y el procesamiento de mensajes de forma independiente. Para obtener más información, consulte Colas, temas y suscripciones de Service Bus y desencadenador de Service Bus para Functions.
Para obtener más información sobre cómo usar la biblioteca cliente de Service Bus para .NET para enviar mensajes a una cola de Service Bus, consulte los ejemplos publicados.
Pasos siguientes
Elección de un servicio de mensajería en Azure: obtenga información sobre cómo diferentes servicios de mensajería de Azure, como Service Bus, colas de Azure Storage, Azure Event Hubs y Azure Event Grid admiten patrones de comunicación asincrónica y cómo elegir el modelo de servicio y mensajería adecuado para su escenario.
Procedimientos recomendados de escalado automático: aprenda a diseñar soluciones que escale horizontalmente las instancias de consumidor en función de la carga de trabajo, como la longitud de la cola o el rendimiento de los mensajes, de modo que pueda controlar el costo máximo de carga y control durante períodos de baja actividad.
Recursos relacionados
Patrón de consolidación de recursos computacionales: podría consolidar múltiples instancias de un servicio consumidor en un solo proceso para reducir costos y la sobrecarga de gestión. El patrón de consolidación de recursos de proceso describe las ventajas y desventajas de este enfoque.
Patrón de nivelación de carga basado en cola: una cola de mensajes puede agregar resiliencia al sistema. La resiliencia permite que las instancias de servicio controlen grandes volúmenes de solicitudes de instancias de aplicación. La cola de mensajes funciona como un búfer que nivela la carga. El patrón de redistribución de carga basada en colas describe este escenario con mayor detalle.