Padrão de fila de prioridade

Barramento de Serviço do Azure

O padrão de fila de prioridade permite que uma carga de trabalho processe tarefas de alta prioridade mais rapidamente do que tarefas de prioridade mais baixa. Esse padrão usa mensagens enviadas para uma ou mais filas e é útil em aplicativos que oferecem diferentes garantias de nível de serviço para clientes individuais.

Contexto e problema

As cargas de trabalho geralmente precisam gerenciar e processar tarefas com níveis variados de importância e urgência. Algumas tarefas requerem atenção imediata, enquanto outras podem esperar. A falha em lidar com tarefas de alta prioridade pode afetar a experiência do usuário e violar os SLAs (contratos de nível de serviço).

Para lidar com tarefas de forma eficiente com base em sua prioridade, as cargas de trabalho precisam de um mecanismo para priorizar e executar tarefas de acordo. Normalmente, as cargas de trabalho processam tarefas na ordem em que chegam usando uma estrutura de fila FIFO (primeiro a entrar, primeiro a sair). Essa abordagem não leva em conta a importância variável das tarefas.

Solução

As filas de prioridade permitem que as cargas de trabalho processem tarefas com base em sua prioridade, e não em sua ordem de chegada. O aplicativo que envia uma mensagem para a fila atribui uma prioridade à mensagem e os consumidores processam as mensagens por prioridade. Use o padrão de fila de prioridade quando tiver os seguintes requisitos:

  • Lide com tarefas de urgência e importância variadas. Você tem tarefas com diferentes níveis de urgência e importância e precisa garantir que processe tarefas mais críticas antes das menos críticas.

  • Lide com diferentes acordos de nível de serviço. Você oferece diferentes garantias de nível de serviço aos clientes que precisam e deve garantir que os clientes de alta prioridade recebam melhor desempenho e disponibilidade.

  • Acomode diferentes necessidades de gerenciamento de carga de trabalho. Você tem uma carga de trabalho que precisa resolver determinadas tarefas imediatamente, e tarefas menos urgentes podem esperar.

Há duas abordagens principais para implementar o padrão de fila de prioridade:

  • Fila única: todas as mensagens são enviadas para uma fila e cada mensagem recebe uma prioridade.

  • Várias filas: filas separadas são usadas para cada prioridade de mensagem.

Fila única

Com uma única fila, o aplicativo (produtor) atribui uma prioridade a cada mensagem e envia a mensagem para a fila. A fila ordena as mensagens por prioridade, garantindo que os consumidores processem mensagens de prioridade mais alta antes das de prioridade mais baixa.

Diagrama que ilustra um mecanismo de enfileiramento que dá suporte à priorização de mensagens.
Figura 1. Arquitetura de uma única fila e um único pool de consumidores

Várias filas

Ter várias filas permite que você separe a mensagem por prioridade. O aplicativo atribui uma prioridade a cada mensagem e direciona a mensagem para a fila correspondente. Os consumidores processam as mensagens. Uma solução de várias filas usa um único pool de consumidores ou vários pools de consumidores.

Vários pools de consumidores

Com vários pools de consumidores, cada fila tem recursos de consumidor dedicados a ela. As filas de prioridade mais alta devem usar mais consumidores ou níveis de desempenho mais altos para processar mensagens mais rapidamente do que as filas de prioridade mais baixa.

Use vários pools de consumidores quando tiver:

  • Requisitos de desempenho rigorosos: vários pools de consumidores são necessários quando diferentes prioridades de tarefas têm requisitos de desempenho rígidos que devem ser atendidos de forma independente.
  • Necessidades de alta confiabilidade: vários pools de consumidores são necessários para aplicativos em que a confiabilidade e o isolamento de falhas são críticos. Os problemas em uma fila não devem afetar outras filas.
  • Aplicativos complexos: benéfico para aplicativos complexos com tarefas que exigem diferentes características de processamento e garantias de desempenho para diferentes tarefas.

Diagrama que ilustra o uso de filas de mensagens separadas para cada prioridade.
Figura 2. Arquitetura de várias filas e vários pools de consumidores.

Pool de consumidores únicos

Com um único pool de consumidores, todas as filas compartilham um único pool de consumidores. Os consumidores processam mensagens da fila de prioridade mais alta primeiro e processam apenas mensagens de filas de prioridade mais baixa quando não há mensagens de alta prioridade. Como resultado, o pool de consumidores único sempre processa mensagens de prioridade mais alta antes das de prioridade mais baixa. Essa configuração pode fazer com que mensagens de prioridade mais baixa fiquem continuamente atrasadas e talvez nunca sejam processadas.

Use um único pool de consumidores para:

  • Gerenciamento simples: um único pool de consumidores é adequado para aplicações em que a facilidade de configuração e manutenção é uma prioridade. Ele reduz a complexidade de configuração e monitoramento.
  • Necessidades de processamento unificado: um único pool de consumidores é útil quando a natureza exata das tarefas de entrada é semelhante.

Diagrama que ilustra o uso de filas de mensagens separadas para cada prioridade.
Figura 3. Arquitetura de várias filas e pool de consumidores único.

Recomendações para o padrão de fila de prioridade

Considere as seguintes recomendações ao decidir como implementar o padrão de fila de prioridade:

Recomendações gerais

  • Defina as prioridades com clareza. Estabeleça níveis de prioridade distintos e claros relevantes para sua solução. Por exemplo, uma mensagem de alta prioridade pode exigir processamento em 10 segundos. Identifique os requisitos para lidar com itens de alta prioridade e aloque os recursos necessários de acordo.

  • Ajuste os grupos de consumidores dinamicamente. Dimensione o tamanho dos pools de consumidores com base no comprimento da fila que eles estão atendendo.

  • Priorize os níveis de serviço. Implemente filas prioritárias para atender às necessidades de negócios que exigem disponibilidade ou desempenho priorizados. Por exemplo, diferentes grupos de clientes podem receber níveis variados de serviço para que os clientes de alta prioridade tenham melhor desempenho e disponibilidade.

  • Garanta o processamento de baixa prioridade. Em filas que dão suporte à priorização de mensagens, aumente dinamicamente a prioridade das mensagens antigas, se o sistema permitir, para garantir que as mensagens de baixa prioridade sejam processadas.

  • Considere os custos da fila. Esteja ciente dos custos financeiros e de processamento associados à verificação de filas. Alguns serviços de fila cobram taxas para postar, recuperar e consultar mensagens, que podem aumentar com o número de filas.

Recomendações de várias filas

  • Monitore as velocidades de processamento. Monitore a velocidade do processamento nas filas de prioridade alta e baixa para garantir que as mensagens nessas filas sejam processadas a taxas esperadas.

  • Minimize custos. Processe tarefas críticas imediatamente com os consumidores disponíveis. Agende tarefas em segundo plano menos críticas durante horários menos movimentados.

Recomendações de pool de consumidores único

  • Implemente preempção e suspensão. Decida se todos os itens de alta prioridade devem ser processados antes dos de prioridade mais baixa. Use um algoritmo que garanta que as filas de alta prioridade sejam sempre atendidas antes das filas de prioridade mais baixa ao usar um pool de consumidores único para várias filas.

  • Otimize custos. Otimize os custos operacionais reduzindo o número de consumidores ao usar a abordagem de fila única. As mensagens de alta prioridade são processadas primeiro, embora talvez mais lentamente, enquanto as de baixa prioridade podem enfrentar atrasos maiores.

Design de carga de trabalho

Um arquiteto deve avaliar como o padrão de Fila de Prioridade pode abordar os objetivos e princípios abordados nos pilares do Azure Well-Architected Framework. Por exemplo:

Pilar Como esse padrão apoia os objetivos do pilar
As decisões de design de confiabilidade ajudam sua carga de trabalho a se tornar resiliente ao mau funcionamento e a garantir que ela se recupere para um estado totalmente funcional após a ocorrência de uma falha. A separação de itens com base na prioridade de negócios permite que você concentre os esforços de confiabilidade no trabalho mais crítico.

- RE:02 Fluxos críticos
- RE:07 Trabalhos em segundo plano
A eficiência de desempenho ajuda sua carga de trabalho a atender com eficiência às demandas por meio de otimizações em dimensionamento, dados e código. A separação de itens com base na prioridade de negócios permite que você concentre os esforços de desempenho no trabalho mais urgente.

- PE:09 Fluxos críticos

Tal como acontece com qualquer decisão de design, considere quaisquer compensações em relação aos objetivos dos outros pilares que possam ser introduzidos com este padrão.

Exemplo do padrão de Fila de Prioridade

O exemplo a seguir no GitHub demonstra uma implementação do padrão de Filas de Prioridade usando o Barramento de Serviço do Azure.

Diagrama que mostra como implementar uma fila de prioridade usando o Barramento de Serviço.
Figura 4. Arquitetura do exemplo PriorityQueue no GitHub

Aqui está uma visão geral da arquitetura:

  • Aplicativo (produtor): o exemplo tem um aplicativo (PriorityQueueSender) que cria mensagens e atribui uma propriedade personalizada chamada Priority em cada mensagem. Priority tem um valor de High ou Low.

  • Filas e agente de mensagens: o exemplo usa o Barramento de Serviço do Azure como o agente de mensagens. Ele usa duas filas do Barramento de Serviço do Azure, uma para cada prioridade de mensagem (High e Low). O aplicativo (produtor) envia mensagens para a fila correta com base na mensagem Priority.

  • Vários pools de consumidores: o exemplo usa vários pools de consumidores (PriorityQueueConsumerHigh e PriorityQueueConsumerLow) dedicados a ler mensagens de cada uma das filas.

Papel na arquitetura de exemplo Serviço do Azure no exemplo Nome no exemplo
Aplicativo Aplicativo Azure Functions PriorityQueueSender
Agente da fila de mensagens Barramento de Serviço do Azure <seu namespace do barramento de serviço>
Filas de mensagens Filas do Barramento de Serviço do Azure <seus nomes de fila>
Consumidores Aplicativo Azure Functions PriorityQueueConsumerHigh
PriorityQueueConsumerLow

Os padrões a seguir podem ser úteis ao implementar esse padrão:

  • Padrão de consumidores concorrentes: esse padrão envolve a implementação de vários consumidores que escutam a mesma fila e processam tarefas em paralelo para aumentar a taxa de transferência. Apenas um consumidor processa cada mensagem. O artigo mostra informações detalhadas sobre as vantagens e desvantagens dessa abordagem.

  • Padrão de limitação: esse padrão pode ser implementado usando filas para gerenciar as taxas de solicitação. Ao utilizar mensagens prioritárias, as solicitações de aplicativos críticos ou clientes de alto valor podem ser priorizadas em relação às menos importantes.