Patrón Queue-Based Load LevelingQueue-Based Load Leveling pattern

Use una cola que actúa como búfer entre una tarea y un servicio que invoca para equilibrar cargas pesadas intermitentes que pueden provocar errores en el servicio o la interrupción de la tarea. Esto puede ayudarle a minimizar el impacto de picos de demanda sobre la disponibilidad y capacidad de respuesta de la tarea y el servicio.Use a queue that acts as a buffer between a task and a service it invokes in order to smooth intermittent heavy loads that can cause the service to fail or the task to time out. This can help to minimize the impact of peaks in demand on availability and responsiveness for both the task and the service.

Contexto y problemaContext and problem

Muchas soluciones en la nube implican la ejecución de tareas que invocan servicios.Many solutions in the cloud involve running tasks that invoke services. En este entorno, si un servicio está vinculado a cargas pesadas intermitentes, puede provocar problemas de confiabilidad o rendimiento.In this environment, if a service is subjected to intermittent heavy loads, it can cause performance or reliability issues.

Un servicio puede formar parte de la misma solución que las tareas que lo usan, o puede ser un servicio de terceros que proporciona acceso a los recursos que se usan frecuentemente como una memoria caché o un servicio de almacenamiento.A service could be part of the same solution as the tasks that use it, or it could be a third-party service providing access to frequently used resources such as a cache or a storage service. Si el mismo servicio se usa por varias tareas que se ejecutan al mismo tiempo, puede ser difícil predecir el volumen de solicitudes en el servicio en cualquier momento.If the same service is used by a number of tasks running concurrently, it can be difficult to predict the volume of requests to the service at any time.

Un servicio puede experimentar picos de demanda que provoquen que se sobrecargue y que no pueda responder a las solicitudes de una manera oportuna.A service might experience peaks in demand that cause it to overload and be unable to respond to requests in a timely manner. El desbordamiento de un servicio con muchas solicitudes simultáneas también puede provocar errores en el servicio si no puede controlar la contención que provocan estas solicitudes.Flooding a service with a large number of concurrent requests can also result in the service failing if it's unable to handle the contention these requests cause.

SoluciónSolution

Refactorizar la solución e introducir una cola entre la tarea y el servicio.Refactor the solution and introduce a queue between the task and the service. La tarea y el servicio se ejecutan de manera asincrónica.The task and the service run asynchronously. La tarea publica un mensaje que contiene los datos que necesita el servicio para una cola.The task posts a message containing the data required by the service to a queue. La cola actúa como un búfer, almacenando el mensaje hasta que se recupera mediante el servicio.The queue acts as a buffer, storing the message until it's retrieved by the service. El servicio recupera los mensajes de la cola y los procesa.The service retrieves the messages from the queue and processes them. Las solicitudes de varias tareas, que pueden generarse a una frecuencia muy variable, pueden pasarse al servicio mediante la misma cola de mensajes.Requests from a number of tasks, which can be generated at a highly variable rate, can be passed to the service through the same message queue. En esta figura se muestra el uso de una cola para nivelar la carga de un servicio.This figure shows using a queue to level the load on a service.

Figura 1: uso de una cola para nivelar la cargar de un servicio

La cola desvincula las tareas del servicio, y el servicio puede controlar los mensajes a su propio ritmo independientemente del volumen de solicitudes de las tareas simultáneas.The queue decouples the tasks from the service, and the service can handle the messages at its own pace regardless of the volume of requests from concurrent tasks. Además, no existe ningún retraso en una tarea si el servicio no está disponible en el momento en que publica un mensaje en la cola.Additionally, there's no delay to a task if the service isn't available at the time it posts a message to the queue.

Este modelo proporciona las siguientes ventajas:This pattern provides the following benefits:

  • Puede ayudar a maximizar la disponibilidad porque los retrasos que surgen de los servicios no tendrán un impacto directo e inmediato sobre la aplicación, que puede seguir publicando mensajes a la cola incluso cuando el servicio no está disponible o no está procesando mensajes en esos momentos.It can help to maximize availability because delays arising in services won't have an immediate and direct impact on the application, which can continue to post messages to the queue even when the service isn't available or isn't currently processing messages.

  • Puede ayudar a maximizar la escalabilidad porque el número de colas y el número de servicios puede variar para satisfacer la demanda.It can help to maximize scalability because both the number of queues and the number of services can be varied to meet demand.

  • Puede ayudar a controlar los costos porque el número de instancias de servicio que se ha implementado solo tiene que ser adecuado para cumplir la carga media en lugar de la carga máxima.It can help to control costs because the number of service instances deployed only have to be adequate to meet average load rather than the peak load.

    Algunos servicios implementan limitaciones cuando la demanda alcanza un umbral en el que el sistema puede producir errores.Some services implement throttling when demand reaches a threshold beyond which the system could fail. La limitación puede reducir la funcionalidad disponible.Throttling can reduce the functionality available. Puede implementar una redistribución de la carga con estos servicios para garantizar que este umbral no se alcance.You can implement load leveling with these services to ensure that this threshold isn't reached.

Problemas y consideracionesIssues and considerations

Tenga en cuenta los puntos siguientes al decidir cómo implementar este patrón:Consider the following points when deciding how to implement this pattern:

  • Es necesario implementar una lógica de aplicación que controle la frecuencia a la que los servicios controlan mensajes para evitar una sobrecarga del recurso de destino.It's necessary to implement application logic that controls the rate at which services handle messages to avoid overwhelming the target resource. Evitar el paso de las puntas de actividad bajo demanda en la siguiente fase del sistema.Avoid passing spikes in demand to the next stage of the system. Probar el sistema bajo carga para garantizar que proporciona el equilibro necesario, y ajustar el número de colas y el número de instancias de servicio que controlan mensajes para conseguirlo.Test the system under load to ensure that it provides the required leveling, and adjust the number of queues and the number of service instances that handle messages to achieve this.
  • Las colas de mensajes son un mecanismo de comunicación unidireccional.Message queues are a one-way communication mechanism. Si una tarea espera una respuesta de un servicio, puede que sea necesario implementar un mecanismo que el servicio pueda usar para enviar una respuesta.If a task expects a reply from a service, it might be necessary to implement a mechanism that the service can use to send a response. Para obtener más información, consulte el Asynchronous Messaging Primer (Manual de mensajería asincrónica).For more information, see the Asynchronous Messaging Primer.
  • Tenga cuidado si aplica el escalado automático en servicios que están escuchando solicitudes en la cola.Be careful if you apply autoscaling to services that are listening for requests on the queue. Esto puede provocar una contención aumentada de cualquier recurso que comparta estos servicios y puede disminuir la eficacia del uso de la cola para equilibrar la carga.This can result in increased contention for any resources that these services share and diminish the effectiveness of using the queue to level the load.

Cuándo usar este patrónWhen to use this pattern

Este modelo es útil en cualquier aplicación que use servicios que estén sujetos a la sobrecarga.This pattern is useful to any application that uses services that are subject to overloading.

Este modelo no es útil si la aplicación espera una respuesta del servicio con una latencia mínima.This pattern isn't useful if the application expects a response from the service with minimal latency.

EjemploExample

Una aplicación web escribe datos en un almacén de datos externo.A web app writes data to an external data store. Si un gran número de instancias de la aplicación web se ejecutan simultáneamente, el almacén de datos podría ser incapaz de responder a las solicitudes lo suficientemente rápido, lo que hará que estas agoten el tiempo de espera, se limiten o generen cualquier otro error.If a large number of instances of the web app run concurrently, the data store might be unable to respond to requests quickly enough, causing requests to time out, be throttled, or otherwise fail. En el siguiente diagrama se muestra un almacén de datos saturado por un gran número de solicitudes simultáneas de instancias de una aplicación.The following diagram shows a data store being overwhelmed by a large number of concurrent requests from instances of an application.

Figura 2: Un servicio saturado por un gran número de solicitudes simultáneas de instancias de una aplicación web

Para resolver esto, puede usar una cola para equilibrar la carga entre las instancias de aplicación y el almacén de datos.To resolve this, you can use a queue to level the load between the application instances and the data store. Una aplicación de Azure Functions lee los mensajes de la cola y realiza las solicitudes de lectura/escritura al almacén de datos.An Azure Functions app reads the messages from the queue and performs the read/write requests to the data store. La lógica de aplicación en la aplicación de función puede controlar la velocidad a la que pasan las solicitudes al almacén de datos, para evitar que este se sature.The application logic in the function app can control the rate at which it passes requests to the data store, to prevent the store from being overwhelmed. (Si no, la aplicación de función volverá a introducir el mismo problema en el back-end).(Otherwise the function app will just re-introduce the same problem at the back end.)

Figura 3: Uso de una cola y una aplicación de función para equilibrar la carga

Los patrones y las directrices siguientes también pueden ser importantes a la hora de implementar este modelo:The following patterns and guidance might also be relevant when implementing this pattern:

  • Manual de mensajería asincrónica.Asynchronous Messaging Primer. Las colas de mensajes son esencialmente asincrónicas.Message queues are inherently asynchronous. Puede que sea necesario volver a diseñar la lógica de aplicación en una tarea si es una adaptación de la comunicación directa con un servicio para usar una cola de mensajes.It might be necessary to redesign the application logic in a task if it's adapted from communicating directly with a service to using a message queue. De manera similar, puede que sea necesario refactorizar un servicio para que acepte solicitudes de una cola de mensajes.Similarly, it might be necessary to refactor a service to accept requests from a message queue. De manera alternativa, puede que sea posible implementar un servicio de proxy, como se describe en el ejemplo.Alternatively, it might be possible to implement a proxy service, as described in the example.

  • Patrón de consumidores de la competencia.Competing Consumers pattern. Puede que sea posible ejecutar varias instancias de un servicio, cada una de ellas actuando como un consumidor de mensajes de la cola de equilibrio de carga.It might be possible to run multiple instances of a service, each acting as a message consumer from the load-leveling queue. Puede usar este enfoque para ajustar la frecuencia a la que se reciben los mensajes y se pasan a un servicio.You can use this approach to adjust the rate at which messages are received and passed to a service.

  • Patrón de limitación.Throttling pattern. Una manera sencilla de implementar la limitación con un servicio es usar el equilibrio de carga basado en colas y enrutar todas las solicitudes a un servicio mediante una cola de mensajes.A simple way to implement throttling with a service is to use queue-based load leveling and route all requests to a service through a message queue. El servicio puede procesar solicitudes a una frecuencia que garantice que los recursos necesarios para el servicio no se agotan, y para reducir la cantidad de contención que pueda producirse.The service can process requests at a rate that ensures that resources required by the service aren't exhausted, and to reduce the amount of contention that could occur.

  • Elegir entre los servicios de mensajería de Azure.Choose between Azure messaging services. Información sobre la elección de un mecanismo de cola y mensajería en las aplicaciones de Azure.Information about choosing a messaging and queuing mechanism in Azure applications.

  • Mejora de la escalabilidad en una aplicación web de Azure.Improve scalability in an Azure web application. Esta arquitectura de referencia incluye nivelación de carga basada en cola como parte de la arquitectura.This reference architecture includes queue-based load leveling as part of the architecture.