Editar

Partilhar via


Padrão de Fila de Prioridade

Azure Service Bus

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 diferentes níveis 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 contratos de nível de serviço (SLAs).

Para lidar com tarefas de forma eficiente com base em sua prioridade, as cargas de trabalho precisam de um mecanismo para priorizar e executar as tarefas de acordo. Normalmente, as cargas de trabalho processam tarefas na ordem em que chegam, usando uma estrutura de fila FIFO (first-in, first-out). 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:

  • Lidar com tarefas de urgência e importância variáveis. Você tem tarefas com diferentes níveis de urgência e importância e precisa garantir que processa tarefas mais críticas antes de tarefas menos críticas.

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

  • Acomodar-se a diferentes necessidades de gerenciamento de carga de trabalho. Você tem uma carga de trabalho que precisa resolver certas 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 mensagens por prioridade, garantindo que os consumidores processem mensagens de prioridade mais alta antes de mensagens de prioridade mais baixa.

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

Várias filas

Várias filas permitem separar mensagens por prioridade. O aplicativo atribui uma prioridade a cada mensagem e direciona a mensagem para a fila correspondente à sua prioridade. Os consumidores processam as mensagens. Uma solução de fila múltipla usa um único grupo de consumidores ou vários grupos de consumidores.

Vários grupos de consumidores

Com vários grupos de consumidores, cada fila tem recursos de consumo dedicados a ela. As filas de prioridade mais alta devem usar mais consumidores ou camadas de desempenho mais altas para processar mensagens mais rapidamente do que as filas de prioridade mais baixa.

Use vários grupos de consumidores quando tiver:

  • Requisitos de desempenho rigorosos: vários grupos de consumidores são necessários quando diferentes prioridades de tarefas têm requisitos de desempenho rigorosos que devem ser atendidos de forma independente.
  • Necessidades de alta confiabilidade: vários grupos de consumidores são necessários para aplicativos em que a confiabilidade e o isolamento de falhas são críticos. Problemas em uma fila não devem afetar outras filas.
  • Aplicações complexas: Benéficas para aplicações complexas 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 grupos de consumidores.

Agrupamento único de consumidores

Com um único grupo de consumidores, todas as filas compartilham um único grupo de consumidores. Os consumidores processam primeiro as mensagens da fila de prioridade mais alta e só processam as mensagens das filas de prioridade mais baixa quando não há mensagens de alta prioridade. Como resultado, o grupo único de consumidores sempre processa mensagens de prioridade mais alta antes de mensagens de prioridade mais baixa. Essa configuração pode levar a mensagens de prioridade mais baixa sendo continuamente atrasadas e, potencialmente, nunca processadas.

Use um único grupo de consumidores para:

  • Gestão simples: Um único grupo de consumidores é adequado para aplicações onde 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 grupo de consumidores é útil quando a natureza exata das tarefas recebidas é semelhante.

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

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

  • Definir prioridades com clareza. Estabeleça níveis de prioridade distintos e claros relevantes para a sua solução. Por exemplo, uma mensagem de alta prioridade pode exigir processamento em 10 segundos. Identificar os requisitos para lidar com itens de alta prioridade e alocar 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 diferentes níveis de serviço para que os clientes de alta prioridade experimentem melhor desempenho e disponibilidade.

  • Garanta um processamento de baixa prioridade. Em filas que suportam priorização de mensagens, aumente dinamicamente a prioridade de mensagens antigas se o sistema permitir que as mensagens de baixa prioridade eventualmente sejam processadas.

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

Recomendações de várias filas

  • Monitore as velocidades de processamento. Para garantir que as mensagens sejam processadas nas taxas esperadas, monitore continuamente a velocidade de processamento de filas de alta e baixa prioridade.

  • Minimize os 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 relativas ao agrupamento único de consumidores

  • Implementar preempção e suspensão. Decida se todos os itens de alta prioridade devem ser processados antes de qualquer item 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 único pool de consumidores 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 possivelmente mais lentamente, enquanto as mensagens de prioridade mais baixa podem enfrentar atrasos maiores.

Design da carga de trabalho

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

Pilar Como esse padrão suporta os objetivos do pilar
As decisões de projeto 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. Separar os 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 às demandas de forma eficiente por meio de otimizações em escala, dados e código. Separar os itens com base na prioridade do negócio permite que você concentre os esforços de desempenho no trabalho mais sensível ao tempo.

- PE:09 Fluxos críticos

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

Exemplo do padrão de fila de prioridade

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

Diagrama que mostra como implementar uma fila de prioridade usando o Service Bus.
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.

  • Agente de mensagens e filas: 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
Aplicação Aplicação de Funções do Azure PriorityQueueSender
Agente de fila de mensagens Azure Service Bus <Seu namespace do Service Bus>
Filas de mensagens Filas do Azure Service Bus <seus nomes de fila>
Consumidores Aplicação de Funções do Azure PriorityQueueConsumerHigh
PriorityQueueConsumerLow

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

  • Padrão de consumidores concorrentes: esse padrão envolve a implementação de vários consumidores que ouvem a mesma fila e processam tarefas em paralelo para aumentar a taxa de transferência. Apenas um consumidor processa cada mensagem. O artigo fornece informações detalhadas sobre as vantagens e desvantagens desta 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.