Todos os produtos
Search
Central de documentação

ApsaraMQ for RabbitMQ:Best practices for instance throttling

Última atualização: Aug 27, 2026

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, queueDeclare e exchangeDeclare.

Ao exceder qualquer limite, o broker adota o seguinte comportamento:

  • Retorna reply-code=530 com reply-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

basicGet

500 TPS

Nenhum

500 TPS

Limpeza de fila

purgeQueue

500 TPS

Nenhum

500 TPS

Criação de exchange

exchangeDeclare

500 TPS

Nenhum

500 TPS

Exclusão de exchange

exchangeDelete

500 TPS

Nenhum

500 TPS

Criação de fila

queueDeclare

500 TPS

Nenhum

500 TPS

Exclusão de fila

queueDelete

500 TPS

Nenhum

500 TPS

Criação de binding

queueBind

500 TPS

Nenhum

500 TPS

Exclusão de binding

queueUnbind

500 TPS

Nenhum

500 TPS

Restauração de mensagem

basicRecover

500 TPS

Nenhum

500 TPS

Reenfileiramento de mensagem

basicReject(requeue=true) / basicNack(requeue=true)

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=530

  • Mensagem de erro: reply-text=denied for too many requests

Stack trace típico em Java para um erro de throttling:

Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>
(reply-code=530, reply-text=denied for too many requests, ReqId:5FB4C999314635F952FCBFF6, ErrorHelp[dstQueue=XXX_test_queue,
srcExchange=Producer.ExchangeName,bindingKey=XXX_test_bk, http://mrw.so/6rNqO8], class-id=50, method-id=20)
    at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:516)
    at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:346)
    at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:182)
    at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:114)
    at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:672)
    at com.rabbitmq.client.impl.AMQConnection.access$300(AMQConnection.java:48)
    at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:599)
    at java.lang.Thread.run(Thread.java:748)

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 isChannelClosed verifica a presença de channel.close na mensagem de erro. Isso abrange tanto reply-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.