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,queueDeclareetexchangeDeclare.
Lorsqu'une limite est dépassée, le broker adopte le comportement suivant :
Le broker renvoie
reply-code=530avecreply-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
Granularité : pic de TPS à la seconde.
Portée : pic de TPS au niveau de l'instance.
Coût : facturé par Simple Log Service (Éléments facturables du paiement à la fonctionnalité).
Prend en charge les instructions de requête SLS pour une analyse avancée.
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 |
|
500 TPS |
Aucune |
500 TPS |
|
Vidage de file d'attente |
|
500 TPS |
Aucune |
500 TPS |
|
Création d'échange |
|
500 TPS |
Aucune |
500 TPS |
|
Suppression d'échange |
|
500 TPS |
Aucune |
500 TPS |
|
Création de file d'attente |
|
500 TPS |
Aucune |
500 TPS |
|
Suppression de file d'attente |
|
500 TPS |
Aucune |
500 TPS |
|
Création de liaison |
|
500 TPS |
Aucune |
500 TPS |
|
Suppression de liaison |
|
500 TPS |
Aucune |
500 TPS |
|
Restauration de message |
|
500 TPS |
Aucune |
500 TPS |
|
Remise en file d'attente de message |
|
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=530Message d'erreur :
reply-text=denied for too many requests
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
isChannelClosedvérifie la présence dechannel.closedans le message d'erreur, ce qui couvre à la foisreply-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.