Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Meilleures pratiques en matière d'optimisation des performances et d'efficacité dans Amazon MQ pour RabbitMQ
Vous pouvez optimiser les performances de votre Amazon MQ pour les courtiers RabbitMQ en maximisant le débit, en minimisant la latence et en garantissant une utilisation efficace des ressources. Suivez les meilleures pratiques suivantes pour optimiser les performances de votre application.
Étape 1 : maintenez la taille des messages en dessous de 1 Mo
Nous recommandons de conserver les messages à moins de 1 mégaoctet (Mo) pour des performances et une fiabilité optimales.
RabbitMQ 3.13 prend en charge des tailles de message allant jusqu'à 128 Mo par défaut, mais les messages volumineux peuvent déclencher des alarmes de mémoire imprévisibles qui bloquent la publication et peuvent créer une pression mémoire élevée lors de la réplication des messages sur les nœuds. Les messages surdimensionnés peuvent également affecter les processus de redémarrage et de restauration des courtiers, ce qui augmente les risques pour la continuité du service et peut entraîner une dégradation des performances.
Stockez et récupérez des charges utiles importantes à l'aide du modèle de vérification des sinistres
Pour gérer les messages volumineux, vous pouvez implémenter le modèle de vérification des réclamations en stockant la charge utile du message dans un stockage externe et en envoyant uniquement l'identifiant de référence de la charge utile via RabbitMQ. Le consommateur utilise l'identifiant de référence de charge utile pour récupérer et traiter le message volumineux.
Le schéma suivant montre comment utiliser Amazon MQ pour RabbitMQ et Amazon S3 pour implémenter le modèle de vérification des réclamations.

L'exemple suivant illustre ce modèle à l'aide d'Amazon MQ, du AWS SDK pour Java 2.x et d'Amazon S3 :
-
Définissez d'abord une classe de message qui contiendra l'identifiant de référence Amazon S3.
class Message { // Other data fields of the message... public String s3Key; public String s3Bucket; }
-
Créez une méthode d'éditeur qui stocke la charge utile dans Amazon S3 et envoie un message de référence via RabbitMQ.
public void publishPayload() { // Store the payload in S3. String payload = PAYLOAD; String prefix = S3_KEY_PREFIX; String s3Key = prefix + "/" + UUID.randomUUID(); s3Client.putObject(PutObjectRequest.builder() .bucket(S3_BUCKET).key(s3Key).build(), RequestBody.fromString(payload)); // Send the reference through RabbitMQ. Message message = new Message(); message.s3Key = s3Key; message.s3Bucket = S3_BUCKET; // Assign values to other fields in your message instance. publishMessage(message); }
-
Implémentez une méthode consommateur qui récupère la charge utile d'Amazon S3, la traite et supprime l'objet Amazon S3.
public void consumeMessage(Message message) { // Retrieve the payload from S3. String payload = s3Client.getObjectAsBytes(GetObjectRequest.builder() .bucket(message.s3Bucket).key(message.s3Key).build()) .asUtf8String(); // Process the complete message. processPayload(message, payload); // Delete the S3 object. s3Client.deleteObject(DeleteObjectRequest.builder() .bucket(message.s3Bucket).key(message.s3Key).build()); }
Étape 2 : Utilisation basic.consume
et longue durée de vie des consommateurs
L'utilisation basic.consume
auprès d'un consommateur de longue date est plus efficace que le sondage pour des messages individuels. basic.get
Pour plus d'informations, consultez la section Sondage de messages individuels
Étape 3 : Configuration de la pré-extraction
Vous pouvez utiliser la valeur de pré-extraction RabbitMQ pour optimiser la façon dont vos consommateurs consomment les messages. RabbitMQ implémente le mécanisme de pré-extraction des canaux fourni par AMQP 0-9-1 en appliquant le nombre de pré-extraction aux consommateurs plutôt qu'aux canaux. La valeur de pré-extraction est utilisée pour spécifier le nombre de messages envoyés au consommateur à un moment donné. Par défaut, RabbitMQ définit une taille de tampon illimitée pour les applications client.
Il existe une variété de facteurs à prendre en compte lors de la définition d'un nombre de pré-extraction pour vos consommateurs RabbitMQ. Tout d'abord, considérez l'environnement et la configuration de vos clients. Étant donné que les consommateurs doivent conserver tous les messages en mémoire au fur et à mesure qu'ils sont traités, une valeur de pré-extraction élevée peut avoir un impact négatif sur les performances de vos consommateurs et, dans certains cas, peut entraîner un blocage potentiel d'un consommateur. De même, l'agent RabbitMQ conserve lui-même tous les messages qu'il envoie mis en mémoire cache jusqu'à ce qu'il reçoive l'accusé de réception du consommateur. Une valeur de pré-extraction élevée peut entraîner une perte de mémoire rapide de votre serveur RabbitMQ si l'accusé de réception automatique n'est pas configuré pour les consommateurs et si les consommateurs prennent un temps relativement long pour traiter les messages.
En prenant en compte les considérations ci-dessus, nous vous recommandons de toujours définir une valeur de pré-extraction afin d'éviter les situations où un agent RabbitMQ ou ses consommateurs manquent de mémoire en raison d'un grand nombre de messages non traités ou sans accusés de réception. Si vous avez besoin d'optimiser vos agents pour traiter de grands volumes de messages, vous pouvez tester vos agents et vos consommateurs à l'aide d'une plage de comptes de pré-extraction afin de déterminer la valeur à laquelle les frais généraux du réseau deviennent largement insignifiants par rapport au temps nécessaire au traitement des messages par un consommateur.
Note
Si vos applications client ont été configurées pour reconnaître automatiquement la remise des messages aux consommateurs, la définition d'une valeur de pré-extraction n'aura aucun effet.
Tous les messages pré-extraits sont supprimés de la file d'attente.
L'exemple suivant montre la définition d'une valeur de pré-extraction de 10
pour un seul consommateur utilisant la bibliothèque client Java RabbitMQ.
ConnectionFactory factory = new ConnectionFactory(); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.basicQos(10, false); QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicConsume("my_queue", false, consumer);
Note
Dans la bibliothèque client Java RabbitMQ, la valeur par défaut de la propriété global
est définie sur false
, donc l'exemple ci-dessus peut être écrit simplement comme channel.basicQos(10)
.
Étape 4 : Utiliser Celery 5.5 ou version ultérieure avec les files d'attente du quorum
Python Celery
Pour toutes les versions de Celery
-
Désactivez-le
task_create_missing_queues
pour réduire le taux de désabonnement des files d'attente. -
Ensuite, désactivez-le
worker_enable_remote_control
pour arrêter la création dynamique decelery@...pidbox
files d'attente. Cela réduira le taux de désabonnement des files d'attente chez le courtier.worker_enable_remote_control = false
-
Pour réduire davantage l'activité des messages non critiques, désactivez Celery worker-send-task-events
en ne les incluant pas -E
ou en les--task-events
signalant au démarrage de votre application Celery. -
Démarrez votre application Celery en utilisant les paramètres suivants :
celery -A app_name worker --without-heartbeat --without-gossip --without-mingle
Pour les versions 5.5 et supérieures de Celery
-
Passez à la version 5.5 de Celery
, la version minimale qui prend en charge les files d'attente de quorum, ou à une version ultérieure. Pour vérifier quelle version de Celery vous utilisez, utilisez celery --version
. Pour plus d'informations sur les files d'attente pour le quorum, consultezQueues de quorum pour RabbitMQ sur Amazon MQ. -
Après la mise à niveau vers Celery 5.5 ou version ultérieure, configurez
task_default_queue_type
sur « quorum ». -
Ensuite, vous devez également activer Publier les confirmations dans les options de transport des courtiers
: broker_transport_options = {"confirm_publish": True}