O blog da AWS
Criação de sistemas resilientes e multi-tenant com fair queues do Amazon SQS
Por Maximilian Schellhorn e Dirk Fröhne.
Hoje, a AWS apresentou as fair queues do Amazon Simple Queue Service (Amazon SQS), um novo recurso que atenua o impacto de vizinhos barulhentos em sistemas multi-tenant. Com as fair queues, seus aplicativos se tornam mais resilientes e fáceis de operar, reduzindo a sobrecarga operacional e melhorando a qualidade do serviço para seus clientes.
Em arquiteturas distribuídas, as filas de mensagens se tornaram a espinha dorsal do design de sistemas resilientes. Eles atuam como buffers entre os componentes, permitindo que os serviços processem o trabalho de forma assíncrona e em seu próprio ritmo. Quando um pico repentino de tráfego atinge seu aplicativo, as filas evitam falhas em cascata, armazenando o trabalho em buffer e garantindo que os serviços posteriores não fiquem sobrecarregados. Há muito tempo, o Amazon SQS é uma solução ideal para desenvolvedores que criam aplicativos escaláveis porque é uma solução Serverless totalmente gerenciada que pode ser escalada perfeitamente para ingerir milhões de mensagens por segundo.
Nesta postagem, você aprenderá a usar as fair queues do Amazon SQS e a entender seu funcionamento interno por meio de um exemplo prático.
Visão geral
Muitos aplicativos modernos seguem uma arquitetura multi-tenant, em que uma única instância de aplicativo atende a vários tenants. Um tenant é qualquer entidade que compartilha recursos com outras pessoas. Pode ser um cliente, aplicativo de cliente ou tipo de solicitação. Essa abordagem reduz os custos operacionais e simplifica a manutenção por meio da utilização eficiente dos recursos. Um exemplo desses recursos compartilhados são as filas e sua capacidade de consumo associada.
No entanto, os sistemas multi-tenant enfrentam desafios quando um tenant se torna um vizinho barulhento. Esse tenant afeta outras pessoas ao utilizar excessivamente os recursos do seu sistema. Com filas, esse tenant causa um acúmulo ao enviar um grande volume de mensagens ou ao exigir um tempo de processamento mais longo. As filas regulares entregam primeiro as mensagens mais antigas, o que aumenta o tempo de permanência das mensagens para todos os tenants nesses cenários. Isso dificulta a manutenção da qualidade do serviço e força as equipes a provisionar recursos em excesso ou criar soluções personalizadas complexas.
As fair queues do Amazon SQS ajudam a manter o tempo de permanência baixo para outros tenants quando há um vizinho barulhento. Isso acontece de forma transparente, sem exigir alterações na lógica de processamento de mensagens existente. Você define o que constitui um tenant em seu sistema, e o Amazon SQS lida com a complexa orquestração de mitigar o impacto de vizinhos ruidosos.
Como funciona
O Amazon SQS monitora continuamente a distribuição de mensagens recebidas, mas ainda não excluídas (em andamento) pelos consumidores em todos os tenants. Quando o sistema detecta um desequilíbrio:
- Ele identifica o tenant barulhento, aquele que faz com que a fila crie uma lista de pendências.
- Ele ajusta automaticamente a ordem de entrega das mensagens para priorizar as mensagens pertencentes a tenants silenciosos (sem ruído).
- Ele mantém a taxa de transferência geral da fila.
Considere o exemplo a seguir, que consiste em uma fila multi-tenant e quatro tenants diferentes (A, B, C e D).
Na condição de estado estável, a fila não tem lista de pendências e as mensagens em trânsito são distribuídas uniformemente entre os tenants. Todas as mensagens são consumidas imediatamente quando chegam à fila. O tempo de espera das mensagens é baixo para todos os tenants. Observe que nem toda a capacidade do consumidor é totalmente utilizada nesse estado estável. A condição de estado estacionário é ilustrada no diagrama a seguir.

Figura 1: Uma fila multi-tenant em condição estável

Figura 2: Uma fila de vários tenants com um tenant barulhento
Quando um único tenant começa a ocupar uma parte significativa dos recursos do consumidor, as fair queues do Amazon SQS consideram esse tenant como um vizinho barulhento e priorizam o retorno de mensagens pertencentes a outros tenants. Essa priorização ajuda a manter baixos tempos de permanência para tenants silenciosos (B, C, D), enquanto o tempo de espera para as mensagens do tenant A será elevado até que o acúmulo da fila seja consumido, mas sem afetar outros tenants. As fair queues são ilustradas no diagrama a seguir.

Figura 3: Uma fila multi-tenant com fair queues
O Amazon SQS não limita a taxa de consumo por tenant. Os consumidores podem receber mensagens de tenants vizinhos barulhentos quando há capacidade de consumo e a fila não tem outras mensagens para retornar. Assim como as filas padrão do Amazon SQS, as fair queues permitem uma taxa de transferência praticamente ilimitada, e não há limites para o número de tenants que você pode ter em sua fila.
Como usar
A seguir está uma visão geral rápida de como começar a usar as fair queues do Amazon SQS em seus aplicativos. Consulte a documentação do recurso para obter uma explicação detalhada. Essas são as etapas de alto nível que o passo a passo segue:
- Ative as fair queues do Amazon SQS adicionando um identificador de tenant (
MessageGroupID
) às suas mensagens - Configure as métricas do Amazon CloudWatch para monitorar o comportamento das fair queues do Amazon SQS
- Você pode usar o aplicativo de exemplo para observar o comportamento justo das filas do Amazon SQS com volumes de mensagens variados.
Ative as fair queues do Amazon SQS adicionando um identificador de tenant (MessageGroupID) às suas mensagens
Seus produtores de mensagens podem adicionar um identificador de tenant definindo um MessageGroupID em uma mensagem de saída:
// Send message with tenant identifier
SendMessageRequest request = new SendMessageRequest()
.withQueueUrl(queueUrl)
.withMessageBody(messageBody)
.withMessageGroupId("tenant-123"); // Tenant identifier
sqs.sendMessage(request);
O novo recurso de imparcialidade será aplicado automaticamente em todas as filas padrão do Amazon SQS para mensagens com a propriedade messageGroupID. É importante mencionar que isso não exige nenhuma alteração no código do consumidor. Ele não tem impacto na latência da API e não vem com nenhuma limitação de taxa de transferência.
Configure as métricas do Amazon CloudWatch para monitorar o comportamento das fair queues do Amazon SQS
Você pode monitorar fair queues do Amazon SQS com as métricas do Amazon CloudWatch. Os seguintes termos são importantes nesse contexto:
- Grupos ruidosos — Um grupo de mensagens ruidoso representa um tenant vizinho barulhento de uma fila multi-tenant.
- Grupos silenciosos — grupos de mensagens, excluindo grupos ruidosos.
Quando você usa fair queues, o Amazon SQS agora emite as seguintes métricas adicionais:
Número aproximado de grupos ruidosos
Número aproximado de mensagens visíveis em grupos quiets
Número aproximado de mensagens não visíveis em grupos quiet
Número aproximado de mensagens atrasadas em grupos silenciosos
Idade aproximada da mensagem mais antiga em grupos quietados
A nova métrica ApproximateNumberOfNoisyGroups
fornece o número de grupos de mensagens (tenants) que são considerados ruidosos em uma fila razoável. Essa métrica ajuda a identificar o número de possíveis vizinhos ruidosos em ambientes multi-tenant, rastreando grupos de mensagens que consomem recursos desproporcionais. Use essa métrica para definir alarmes que são acionados quando o número de grupos ruidosos excede seu limite aceitável, indicando possíveis problemas de imparcialidade na fila.
O Amazon SQS já fornece várias métricas padrão em nível de fila que oferecem informações aproximadas sobre o estado da fila, o processamento de mensagens e possíveis gargalos. Essas métricas analisam todas as mensagens em uma fila. Com fair queues, há um novo conjunto de quatro métricas equivalentes, mostradas na lista anterior, que permitem a exclusão de mensagens de grupos de vizinhos barulhentos e têm como alvo apenas grupos silenciosos (tenants que não fazem barulho). Portanto, todos eles têm o sufixo InquietGroups
.
Para monitorar o efeito das fair queues do Amazon SQS, você pode comparar métricas que têm o sufixo InquietGroups
com métricas padrão em nível de fila. Durante picos de tráfego para um tenant específico, as métricas gerais do nível da fila podem revelar o aumento dos atrasos ou a idade das mensagens mais antigas. No entanto, analisando os grupos silenciosos isoladamente, você pode identificar que a maioria dos grupos de mensagens ou tenants não ruidosos não são afetados e pode estimar o número total de grupos de mensagens afetados.
O gráfico a seguir mostra como a métrica padrão da lista de pendências da fila (approximateNumberOfMessagesVisible
) aumenta devido a um tenant ruidoso, enquanto a lista de pendências para tenants sem ruído (approximateNumberOfMessagesVisibleInquietGroups
) permanece baixa.

Figura 4: Acúmulo de filas para grupos barulhentos e silenciosos
Embora essas novas métricas forneçam uma boa visão geral do comportamento das fair queues do Amazon SQS, pode ser benéfico entender qual tenant específico está causando a carga. Use o Amazon CloudWatch Contributor Insights para ver métricas sobre os N principais colaboradores, o número total de colaboradores exclusivos e seu uso. Isso é especialmente útil em cenários em que você está lidando com milhares de tenants que, de outra forma, levariam a dados (e custos) de alta cardinalidade ao emitir métricas tradicionais. A captura de tela a seguir mostra um exemplo de um painel do Contributor Insights no console da AWS que visualiza os 10 principais colaboradores com base no MessageGroupID
.

Figura 5: Painel de controle de mensagens recebidas por grupo de mensagens do Container Insights
O Contributor Insights cria essas métricas com base nos dados da saída do log do seu aplicativo. Deixe seu código registrar o número de mensagens que estão sendo processadas e o MessageGroupID
correspondente em seu aplicativo. Você pode encontrar um exemplo completo no aplicativo de amostra na próxima seção.
Exemplo de aplicação
Para facilitar ainda mais o início, preparamos um exemplo que você pode usar para observar o comportamento das fair queues do Amazon SQS com volumes de mensagens variados. Você pode encontrar o repositório do código-fonte, a infraestrutura como código (IaC) e as instruções para executar a amostra no repositório sqs-fair-queues no GitHub.
O exemplo inclui um gerador de carga para simular o tráfego de vários tenants e fornece um painel do Amazon CloudWatch que exibe as métricas mais importantes para visualizar o comportamento da fair queue. A captura de tela a seguir mostra um exemplo do painel.

Figura 6: Painel do CloudWatch FairQueues
Conclusão
As fair queues do Amazon SQS mitigam automaticamente o impacto de vizinhos ruidosos em filas multi-tenants. Mesmo quando um tenant gera grandes volumes de mensagens ou exige tempos de processamento mais longos (ou seja, se torna um vizinho barulhento), o recurso mantém tempos de permanência de mensagens consistentes para outros tenants. Quando você adiciona um identificador de tenant às suas mensagens, as fair queues do Amazon SQS detectam e mitigam automaticamente o impacto de vizinhos ruidosos, fornecendo acesso justo à fila para outros tenants.
Recomendamos revisar o Amazon SQS Developer Guide para começar e explorar os aplicativos de amostra para testar o comportamento com diferentes volumes de mensagens.
Este conteúdo foi traduzido da postagem original do blog, que pode ser encontrada aqui.