System Design/04 - Cloud Design Patterns/Messaging2 min
Priority Queue
- Que problema isso resolve?
- Quando usar / quando NÃO usar?
- Qual o principal trade-off?
- Como isso falha em produção?
Conceito
Processar mensagens por importância, não por ordem de chegada — para que trabalho urgente não espere atrás de trabalho volumoso.
Duas implementações
| Abordagem | Como funciona |
|---|---|
| Filas separadas | Uma fila por prioridade; consumidores leem a alta primeiro |
| Fila única com atributo | O broker ordena por prioridade dentro da fila |
Filas separadas são mais comuns porque a maioria dos brokers gerenciados não implementa prioridade nativa — e porque permitem dimensionar consumidores independentemente por faixa.
O problema da inanição
Se os consumidores sempre esvaziam a fila alta antes de olhar a baixa, e a fila alta nunca esvazia, a baixa nunca é processada.
As correções:
| Técnica | Como |
|---|---|
| Consumidores dedicados | 8 workers na alta, 2 na baixa — a baixa sempre progride |
| Round-robin ponderado | Ler 4 da alta para cada 1 da baixa |
| Envelhecimento | Mensagem antiga sobe de prioridade com o tempo |
Trade-offs
Prioridade resolve um problema real e cria dois.
O primeiro é a inflação de prioridade: se quem define a prioridade é quem produz a mensagem, tudo vira urgente. Sem um critério objetivo e um teto para a fatia de alta prioridade, o mecanismo se anula.
O segundo é a complexidade operacional: mais filas para monitorar, mais dimensionamento, e métricas que precisam ser separadas por faixa — uma latência agregada saudável pode esconder uma fila baixa completamente parada.
Há também um caminho mais simples que frequentemente resolve o mesmo problema: separar por tipo de trabalho em vez de por prioridade. Uma fila para operações interativas e outra para lotes, cada uma com seus workers, elimina a interferência sem exigir política de prioridade — e é essencialmente um Bulkhead.
Duas ou três faixas costumam ser suficientes. Sistemas com dez níveis de prioridade acabam usando dois na prática.
Exemplo prático
Uma plataforma com clientes em planos diferentes:
fila-premium → 8 workers
fila-padrao → 4 workers
fila-lote → 2 workers
Cada faixa tem capacidade garantida. Um cliente premium não espera atrás de uma importação de 100 mil registros; e a fila de lote, mesmo com prioridade baixa, sempre progride, porque tem workers próprios.
Essa é a diferença entre prioridade por consumidores dedicados e prioridade estrita: a primeira garante um mínimo a todos, a segunda pode deixar o trabalho de baixa prioridade parado indefinidamente.
Relacionado
Parte de Messaging · roadmap.sh/system-design