Padrão de Redistribuição de Carga Baseado na FilaQueue-Based Load Leveling pattern

Utilize uma fila que age como uma memória intermédia entre uma tarefa e um serviço que este invoca para cargas pesadas intermitentes que podem levar à falha do serviço ou exceder o tempo limite da tarefa. Este procedimento pode ajudar a minimizar o impacto dos picos de procura em termos de disponibilidade e capacidade de resposta da tarefa e do serviço.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 e problemaContext and problem

Muitas soluções na cloud envolvem a execução de tarefas que invocam serviços.Many solutions in the cloud involve running tasks that invoke services. Neste ambiente, se um serviço estiver sujeito a cargas pesadas intermitentes, este poderá causar problemas de fiabilidade ou desempenho.In this environment, if a service is subjected to intermittent heavy loads, it can cause performance or reliability issues.

Um serviço pode fazer parte da mesma solução que as tarefas que a utilizam ou pode ser um serviço de terceiros a fornecer acesso a recursos frequentemente utilizados, tal como um serviço de armazenamento ou em cache.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. Se o mesmo serviço for utilizado por várias tarefas em execução em simultâneo, poderá ser difícil prever o volume de pedidos do serviço a qualquer 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.

Um serviço pode obter picos de procura que provocam uma sobrecarga do mesmo, o que impede o envio de respostas aos pedidos de uma forma atempada.A service might experience peaks in demand that cause it to overload and be unable to respond to requests in a timely manner. O congestionamento de um serviço com um grande número de pedidos simultâneos também poderá resultar numa falha do serviço se este não conseguir processar a disputa provocada por estes pedidos.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.

SoluçãoSolution

Refatore a solução e introduza uma fila entre a tarefa e o serviço.Refactor the solution and introduce a queue between the task and the service. A tarefa e o serviço são executados de forma assíncrona.The task and the service run asynchronously. A tarefa publica uma mensagem que contém os dados que o serviço necessita para uma fila.The task posts a message containing the data required by the service to a queue. A fila funciona como uma memória intermédia ao armazenar a mensagem até que seja obtida pelo serviço.The queue acts as a buffer, storing the message until it's retrieved by the service. O serviço obtém as mensagens da fila e processa-as.The service retrieves the messages from the queue and processes them. Os pedidos de várias tarefas, que podem ser gerados a uma velocidade altamente variável, podem ser transmitidos ao serviço através da mesma fila de mensagens.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. Esta figura mostra a utilização de uma fila para redistribuir a carga de um serviço.This figure shows using a queue to level the load on a service.

Figura 1 – Utilização de uma fila para redistribuir a carga de um serviço

A fila desacopla as tarefas do serviço e, assim, o serviço pode processar as mensagens ao seu próprio ritmo, independentemente do volume de pedidos de tarefas 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. Além disso, não ser verificará nenhum atraso numa tarefa se o serviço estiver indisponível no momento em que publica uma mensagem para a fila.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 padrão fornece os benefícios seguintes:This pattern provides the following benefits:

  • Pode ajudar a maximizar a disponibilidade, porque os atrasos resultantes nos serviços não têm um impacto imediato e direto na aplicação, a qual pode continuar a publicar mensagens na fila, mesmo quando o serviço está indisponível ou não está no momento a processar mensagens.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.

  • Pode ajudar a maximizar a escalabilidade, uma vez que tanto o número de filas como o número de serviços podem ser diversificados para satisfazer a procura.It can help to maximize scalability because both the number of queues and the number of services can be varied to meet demand.

  • Pode ajudar a controlar os custos, porque o número de instâncias do serviço implementadas apenas tem de ser suficiente para satisfazer a carga média ao invés do pico de carga.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.

    Alguns serviços implementam a limitação quando a procura atinge um limiar que pode levar à falha do sistema.Some services implement throttling when demand reaches a threshold beyond which the system could fail. A limitação pode reduzir as funcionalidades disponíveis.Throttling can reduce the functionality available. Pode implementar a redistribuição de carga com estes serviços para assegurar que este limiar não é alcançado.You can implement load leveling with these services to ensure that this threshold isn't reached.

Problemas e consideraçõesIssues and considerations

Na altura de decidir como implementar este padrão, considere os seguintes pontos:Consider the following points when deciding how to implement this pattern:

  • É necessário implementar a lógica da aplicação que controla a velocidade a que os serviços processam as mensagens para evitar sobrecarregar o 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. Evite transmitir picos de procura para a próxima fase do sistema.Avoid passing spikes in demand to the next stage of the system. Teste o sistema sob carga, para garantir que fornece a redistribuição necessária, e ajuste o número de filas e o número de instâncias de serviço que processam as mensagens para obter esta configuração.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.
  • As filas de mensagens são um mecanismo de comunicação unidirecional.Message queues are a one-way communication mechanism. Se uma tarefa esperar uma resposta de um serviço, poderá ser necessário implementar um mecanismo que o serviço pode utilizar para enviar uma resposta.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 obter mais informações, veja o Asynchronous Messaging Primer (Manual Básico de Mensagens Assíncronas).For more information, see the Asynchronous Messaging Primer.
  • Tenha atenção caso aplique o dimensionamento automático aos serviços que estão à escuta de pedidos na fila.Be careful if you apply autoscaling to services that are listening for requests on the queue. Tal pode resultar numa maior contenção de todos os recursos que estes serviços partilham e reduz a eficácia da utilização da fila para redistribuir a 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.

Quando utilizar este padrãoWhen to use this pattern

Este padrão é prático para qualquer aplicação que utiliza os serviços sujeitos a sobrecargas.This pattern is useful to any application that uses services that are subject to overloading.

Este padrão não será prático se a aplicação esperar uma resposta do serviço com uma latência mínima.This pattern isn't useful if the application expects a response from the service with minimal latency.

ExemploExample

Uma aplicação web escreve dados para um arquivo de dados externos.A web app writes data to an external data store. Se um grande número de instâncias da aplicação web executadas em simultâneo, o arquivo de dados pode não ser capaz de responder a pedidos de forma suficientemente rápida, fazendo com que a pedidos de tempo limite, limitadas ou, caso contrário falhar.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. O diagrama seguinte mostra um arquivo de dados que está a ser sobrecarregado com um grande número de pedidos simultâneos de instâncias de uma aplicação.The following diagram shows a data store being overwhelmed by a large number of concurrent requests from instances of an application.

Figura 2 – um serviço que está a ser sobrecarregado com um grande número de pedidos simultâneos de instâncias de uma aplicação web

Para resolver este problema, pode utilizar uma fila para redistribuir a carga entre instâncias da aplicação e o armazenamento de dados.To resolve this, you can use a queue to level the load between the application instances and the data store. Uma aplicação de funções do Azure lê as mensagens da fila e efetua os pedidos de leitura/gravação ao arquivo de dados.An Azure Functions app reads the messages from the queue and performs the read/write requests to the data store. A lógica do aplicativo na function app pode controlar a taxa a que transmite os pedidos para o arquivo de dados, para impedir que o armazenamento de que está a ser sobrecarregado.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. (Caso contrário, a aplicação de funções apenas novamente apresentará o mesmo problema em back-end.)(Otherwise the function app will just re-introduce the same problem at the back end.)

Figura 3 – utilização de uma fila e uma aplicação de funções para redistribuir a carga

Os padrões e orientações que se seguem também podem ser relevantes ao implementar este padrão:The following patterns and guidance might also be relevant when implementing this pattern:

  • Asynchronous Messaging Primer (Manual Básico de Mensagens Assíncronas).Asynchronous Messaging Primer. As filas de mensagens são inerentemente assíncronas.Message queues are inherently asynchronous. Poderá ser necessário redesenhar a lógica da aplicação numa tarefa se esta for adaptada a partir da comunicação direta com um serviço para utilizar uma fila de mensagens.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. Da mesma forma, poderá ser necessário refatorar um serviço para aceitar pedidos de uma fila de mensagens.Similarly, it might be necessary to refactor a service to accept requests from a message queue. Em alternativa, pode ser possível implementar um serviço de proxy, conforme descrito no exemplo.Alternatively, it might be possible to implement a proxy service, as described in the example.

  • Padrão de Consumidores Concorrentes.Competing Consumers pattern. Pode ser possível executar várias instâncias de um serviço, com cada uma a agir como um consumidor de mensagens da fila de redistribuição de carga.It might be possible to run multiple instances of a service, each acting as a message consumer from the load-leveling queue. Pode utilizar esta abordagem para ajustar a velocidade a que as mensagens são recebidas e transmitidas para um serviço.You can use this approach to adjust the rate at which messages are received and passed to a service.

  • Padrão de Limitação.Throttling pattern. Uma forma simples de implementar a limitação com um serviço passa por utilizar a redistribuição de carga baseada na fila e encaminhar todos os pedidos para um serviço através de uma fila de mensagens.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. O serviço pode processar pedidos a uma velocidade que garante que os recursos necessários pelo serviço não são esgotados e para reduzir a quantidade de contenção que pode ocorrer.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.

  • Escolha entre os serviços de mensagens do Azure.Choose between Azure messaging services. Informações sobre como escolher um mecanismo de mensagens e colocação em fila do Azure.Information about choosing a messaging and queuing mechanism in Azure applications.

  • Melhorar a escalabilidade numa aplicação web do Azure.Improve scalability in an Azure web application. Esta arquitetura de referência inclui o nivelamento de carga baseada na fila como parte da arquitetura.This reference architecture includes queue-based load leveling as part of the architecture.