O ApsaraMQ for RabbitMQ aplica limites de TPS por instância e fecha canais que ultrapassam os limiares definidos. Este guia aborda prevenção, monitoramento e recuperação de erros.
Funcionamento do throttling
O ApsaraMQ for RabbitMQ impõe limites de TPS em três níveis:
TPS total da instância -- limita o throughput combinado de envio e recebimento de toda a instância.
TPS de SendMessage por nó -- restringe o throughput de envio em cada nó de service de backend no cluster.
TPS por operação de API -- controla operações específicas, como
basicGet,queueDeclareeexchangeDeclare.
Ao exceder qualquer limite, o broker adota o seguinte comportamento:
Retorna
reply-code=530comreply-text=denied for too many requests. Consulte Error code and message para obter detalhes sobre o erro.Fecha o canal que enviou a requisição, mas mantém a conexão aberta. Para recuperar o serviço, reabra o canal conforme descrito em Recover from channel closure.
Prevenção contra throttling
TPS total da instância
Escolha a abordagem adequada ao seu padrão de tráfego:
|
Padrão de tráfego |
Ação |
|
Testes, tráfego de curta duração ou imprevisível |
Utilize uma instância serverless. Em instâncias por assinatura, ative the elastic TPS feature. |
|
Tráfego de produção estável e de alto volume |
Upgrade the TPS specification para um nível superior. |
TPS de SendMessage por nó
O ApsaraMQ for RabbitMQ distribui o tráfego entre vários nós de backend. Se o tráfego se concentrar em um único nó, o limite por nó será acionado mesmo que haja capacidade disponível no nível da instância.
Para distribuir a carga uniformemente entre os nós:
Abra pelo menos 10 conexões por fila. Cada conexão pode ser roteada para um nó diferente e distribuir a carga de trabalho de envio.
Usuários do Spring: defina o CachingConnectionFactory para o modo CONNECTION. Essa configuração cria uma nova conexão por sessão em vez de multiplexar canais em uma única conexão. Consulte Spring integration.
Monitoramento do pico de TPS
Monitore o pico de TPS para detectar quando o tráfego se aproxima do limiar de throttling:
CloudMonitor (recomendado)
Granularidade: nível de minuto (período de 1 minuto).
Escopo: pico de TPS no nível da instância.
Custo: gratuito.
Exibe tendências de TPS dos últimos 14 dias.
Permite configurar regras de alerta para notificar antes da ocorrência de throttling.
Consultar o pico de TPS de uma instância e configurar uma regra de alerta usando o CloudMonitor.
Página Instance Details (recomendado)
Granularidade: pico de TPS no nível de segundo.
Escopo: pico de TPS no nível da instância e por operação de API.
Custo: gratuito.
Identifica picos curtos de tráfego com precisão de segundos.
Permite filtragem por operação de API.
Apenas os primeiros 10 minutos de resultados são exibidos.
Consultar o pico de TPS de uma instância na página Instance Details.
Simple Log Service
Granularidade: pico de TPS no nível de segundo.
Escopo: pico de TPS no nível da instância.
Custo: cobrado pelo Simple Log Service (consulte Itens faturáveis do pagamento por recurso).
Suporta instruções de consulta SLS para análises avançadas.
Requer familiaridade com a sintaxe de consulta SLS. Os resultados podem ser mais difíceis de interpretar do que no CloudMonitor ou na página Instance Details.
Consultar o pico de TPS de uma instância usando o Simple Log Service.
Limiares de throttling
As tabelas a seguir listam os limites de throttling por tipo e especificação de instância.
TPS total da instância
Instâncias serverless
|
Tipo de cluster |
Modelo de faturamento |
Limiar de throttling |
|
Cluster compartilhado |
Pagamento por capacidade provisionada e tráfego elástico / pagamento por requisição de mensagens |
Máximo: 50.000 TPS |
|
Cluster exclusivo |
Pagamento por capacidade provisionada e tráfego elástico |
2x o pico de TPS incluído na especificação básica |
Instâncias por assinatura
|
Edição |
TPS elástico |
Limiar de throttling |
|
Enterprise Edition |
Desativado |
1x o pico de TPS incluído na especificação básica |
|
Enterprise Edition |
Ativado |
2x o pico de TPS incluído na especificação básica (máximo: 50.000 TPS) |
|
Enterprise Platinum Edition |
Desativado |
1x o pico de TPS incluído na especificação básica |
|
Enterprise Platinum Edition |
Ativado |
2x o pico de TPS incluído na especificação básica (máximo: 50.000 TPS) |
|
Professional Edition |
Desativado |
1x o pico de TPS incluído na especificação básica |
|
Professional Edition |
Ativado |
1,5x o pico de TPS incluído na especificação básica |
TPS de SendMessage por nó
O broker limita o TPS de SendMessage em cada nó de backend da instância.
|
Tipo de instância |
Limiar de throttling |
|
Serverless -- compartilhado (por valor acumulado) |
25.000 TPS |
|
Serverless -- dedicado (reservado + elástico) |
25.000 TPS |
|
Assinatura -- Enterprise Edition |
Nenhum |
|
Assinatura -- Enterprise Platinum Edition (reservado + elástico) |
25.000 TPS |
|
Assinatura -- Professional Edition |
25.000 TPS |
Limites por operação de API
Esses limites aplicam-se por instância. Instâncias serverless com cluster exclusivo não possuem throttling por API.
|
Operação |
Método da API |
Serverless (compartilhado) |
Serverless (exclusivo) |
Assinatura |
|
Recebimento síncrono de mensagens |
|
500 TPS |
Nenhum |
500 TPS |
|
Limpeza de fila |
|
500 TPS |
Nenhum |
500 TPS |
|
Criação de exchange |
|
500 TPS |
Nenhum |
500 TPS |
|
Exclusão de exchange |
|
500 TPS |
Nenhum |
500 TPS |
|
Criação de fila |
|
500 TPS |
Nenhum |
500 TPS |
|
Exclusão de fila |
|
500 TPS |
Nenhum |
500 TPS |
|
Criação de binding |
|
500 TPS |
Nenhum |
500 TPS |
|
Exclusão de binding |
|
500 TPS |
Nenhum |
500 TPS |
|
Restauração de mensagem |
|
500 TPS |
Nenhum |
500 TPS |
|
Reenfileiramento de mensagem |
|
20 TPS |
Nenhum |
20 TPS |
Tratamento de erros de throttling
Código e mensagem de erro
Quando o throttling é acionado, o broker fecha o canal afetado e retorna:
Código de erro:
reply-code=530Mensagem de erro:
reply-text=denied for too many requests
O erro inclui o ID da requisição (ReqId), a fila de destino (dstQueue), a exchange de origem (srcExchange) e a chave de binding (bindingKey).
Recuperação após fechamento de canal
Como apenas o canal é fechado, capture a exceção AlreadyClosedException e recrie-o. O exemplo Java a seguir demonstra a recuperação baseada em tentativas:
private static final int MAX_RETRIES = 5; // Maximum retry attempts
private static final long WAIT_TIME_MS = 2000; // Wait time between retries in milliseconds
private void doAnythingWithReopenChannels(Connection connection, Channel channel) {
try {
// ......
// Any operation to be performed in the current channel.
// For example, sending or consuming messages.
// ......
} catch (AlreadyClosedException e) {
String message = e.getMessage();
if (isChannelClosed(message)) {
// Channel was closed by the broker. Recreate it.
channel = createChannelWithRetry(connection);
// Continue with other operations after recovery.
// ......
} else {
throw e;
}
}
}
private Channel createChannelWithRetry(Connection connection) {
for (int attempt = 1; attempt <= MAX_RETRIES; attempt++) {
try {
return connection.createChannel();
} catch (Exception e) {
System.err.println("Failed to create channel. Attempt " + attempt + " of " + MAX_RETRIES);
// If channel creation fails (possibly still throttled), wait and retry.
if (attempt < MAX_RETRIES) {
try {
Thread.sleep(WAIT_TIME_MS);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt(); // Restore the interrupted state.
}
} else {
throw new RuntimeException("Exceeded maximum retries to create channel", e);
}
}
}
throw new RuntimeException("This line should never be reached");
}
private boolean isChannelClosed(String errorMsg) {
// Check whether the error message contains "channel.close".
// This covers both error code 530 (throttling) and 541 (internal error).
if (errorMsg != null && errorMsg.contains("channel.close")) {
System.out.println("[ChannelClosed] Error details: " + errorMsg);
return true;
}
return false;
}
Pontos principais:
A nova tentativa utiliza uma espera fixa de 2.000 ms. Ajuste esse valor conforme o seu padrão de tráfego.
O método
isChannelClosedverifica a presença dechannel.closena mensagem de erro. Isso abrange tantoreply-code=530(throttling) quanto outros cenários de fechamento de canal.Após a recuperação, retome as operações no novo objeto de canal.