Tous les produits
Search
Centre de documentation

ApsaraMQ for RabbitMQ:Best practices for instance throttling

Dernière mise à jour :Aug 27, 2026

ApsaraMQ for RabbitMQ applique des limites de transactions par seconde (TPS) par instance et ferme les canaux qui dépassent les seuils définis. Ce guide aborde la prévention, la surveillance et la récupération après erreur.

Fonctionnement de la limitation de débit

ApsaraMQ for RabbitMQ applique des limites de TPS à trois niveaux :

  • Instance total TPS : plafonne le débit combiné d'envoi et de réception de l'ensemble de l'instance.

  • Single-node SendMessage TPS : limite le débit d'envoi sur chaque nœud de service backend au sein du cluster.

  • Per-API operation TPS : restreint des opérations spécifiques telles que basicGet, queueDeclare et exchangeDeclare.

Lorsqu'une limite est dépassée, le broker adopte le comportement suivant :

  • Le broker renvoie reply-code=530 avec reply-text=denied for too many requests. Les détails de l'erreur sont décrits dans Error code and message.

  • Le broker ferme le canal qui a envoyé la requête, tandis que la connexion reste ouverte. La procédure de récupération en rouvrant le canal est décrite dans Recover from channel closure.

Prévenir la limitation de débit

Instance total TPS

Choisissez l'approche adaptée à votre profil de trafic :

Traffic pattern

Action

Trafic de test, temporaire ou imprévisible

<!--@p {"id":"185fa775923h1"}--br>Utilisez une instance serverless. Pour les instances par abonnement, activez la fonctionnalité elastic TPS.

Trafic de production stable et volumineux

Mettez à niveau la spécification TPS vers un niveau supérieur.

Single-node SendMessage TPS

ApsaraMQ for RabbitMQ répartit le trafic sur plusieurs nœuds backend. Si le trafic se concentre sur un seul nœud, la limite par nœud peut être atteinte même si la limite au niveau de l'instance n'est pas saturée.

Pour distribuer la charge uniformément entre les nœuds :

  • Ouvrez au moins 10 connexions par file d'attente. Chaque connexion peut être routée vers un nœud différent, ce qui permet de répartir la charge d'envoi.

  • Pour les utilisateurs de Spring, configurez CachingConnectionFactory en mode CONNECTION. Cela crée une nouvelle connexion par session au lieu de multiplexer les canaux sur une seule connexion. Spring integration.

Surveiller le pic de TPS

Surveillez le pic de TPS pour détecter lorsque le trafic approche du seuil de limitation de débit :

CloudMonitor (recommandé)

  • Granularité : niveau minute (période d'une minute).

  • Portée : pic de TPS au niveau de l'instance.

  • Coût : gratuit.

  • Affiche les tendances de TPS sur les 14 derniers jours.

  • Prend en charge les règles d'alerte pour notifier avant que la limitation de débit ne se produise.

Interroger le pic de TPS d'une instance et configurer une règle d'alerte avec CloudMonitor.

Page Instance Details (recommandé)

  • Granularité : pic de TPS à la seconde.

  • Portée : pic de TPS au niveau de l'instance et par opération API.

  • Coût : gratuit.

  • Identifie les pics de trafic courts avec une précision à la seconde.

  • Prend en charge le filtrage par opération API.

Seuls les résultats des 10 premières minutes sont affichés.

Interroger le pic de TPS d'une instance sur la page Instance Details.

Simple Log Service

Nécessite une familiarité avec la syntaxe des requêtes SLS. Les résultats peuvent être plus difficiles à interpréter que ceux de CloudMonitor ou de la page Instance Details.

Interroger le pic de TPS d'une instance avec Simple Log Service.

Seuils de limitation de débit

Les tableaux suivants répertorient les limites de limitation de débit par type d'instance et par spécification.

Instance total TPS

Instances serverless

Cluster type

Billing model

Throttling threshold

Shared cluster

Paiement selon la capacité provisionnée et le trafic élastique / paiement selon les requêtes de messagerie

Maximum : 50 000 TPS

Exclusive cluster

Paiement selon la capacité provisionnée et le trafic élastique

2 fois le pic de TPS inclus dans la spécification de base

Instances par abonnement

Edition

Elastic TPS

Throttling threshold

Enterprise Edition

Désactivé

1 fois le pic de TPS inclus dans la spécification de base

Enterprise Edition

Activé

2 fois le pic de TPS inclus dans la spécification de base (maximum : 50 000 TPS)

Enterprise Platinum Edition

Désactivé

1 fois le pic de TPS inclus dans la spécification de base

Enterprise Platinum Edition

Activé

2 fois le pic de TPS inclus dans la spécification de base (maximum : 50 000 TPS)

Professional Edition

Désactivé

1 fois le pic de TPS inclus dans la spécification de base

Professional Edition

Activé

1,5 fois le pic de TPS inclus dans la spécification de base

Single-node SendMessage TPS

Le broker limite le TPS de SendMessage sur chaque nœud backend de l'instance.

Instance type

Throttling threshold

Serverless – shared (par montant cumulé)

25 000 TPS

Serverless – dedicated (réservé + élastique)

25 000 TPS

Par abonnement – Enterprise Edition

Aucune

Par abonnement – Enterprise Platinum Edition (réservé + élastique)

25 000 TPS

Par abonnement – Professional Edition

25 000 TPS

Limites par opération API

Ces limites s'appliquent par instance. Les instances de cluster exclusif serverless ne subissent aucune limitation de débit par API.

Operation

API method

Serverless (shared)

Serverless (exclusive)

Subscription

Réception synchrone de messages

basicGet

500 TPS

Aucune

500 TPS

Vidage de file d'attente

purgeQueue

500 TPS

Aucune

500 TPS

Création d'échange

exchangeDeclare

500 TPS

Aucune

500 TPS

Suppression d'échange

exchangeDelete

500 TPS

Aucune

500 TPS

Création de file d'attente

queueDeclare

500 TPS

Aucune

500 TPS

Suppression de file d'attente

queueDelete

500 TPS

Aucune

500 TPS

Création de liaison

queueBind

500 TPS

Aucune

500 TPS

Suppression de liaison

queueUnbind

500 TPS

Aucune

500 TPS

Restauration de message

basicRecover

500 TPS

Aucune

500 TPS

Remise en file d'attente de message

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

20 TPS

Aucune

20 TPS

Gérer les erreurs de limitation de débit

Code d'erreur et message

Lorsque la limitation de débit est déclenchée, le broker ferme le canal concerné et renvoie :

  • Code d'erreur : reply-code=530

  • Message d'erreur : reply-text=denied for too many requests

Trace de pile Java typique pour une erreur de limitation de débit :

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)

L'erreur inclut l'ID de requête (ReqId), la file d'attente de destination (dstQueue), l'échange source (srcExchange) et la clé de liaison (bindingKey).

Récupération après fermeture de canal

Comme seul le canal est fermé, interceptez AlreadyClosedException et recréez-le. L'exemple Java suivant illustre la récupération basée sur des tentatives :

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;
}

Points clés :

  • La tentative utilise une attente fixe de 2 000 ms. Ajustez cette valeur en fonction de votre profil de trafic.

  • La méthode isChannelClosed vérifie la présence de channel.close dans le message d'erreur, ce qui couvre à la fois reply-code=530 (limitation de débit) et d'autres scénarios de fermeture de canal.

  • Après la récupération, reprenez les opérations sur le nouvel objet de canal.