View a markdown version of this page

Meilleures pratiques en matière d'optimisation des performances et d'efficacité dans Amazon MQ pour RabbitMQ - Amazon MQ

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 courtier Amazon MQ for RabbitMQ en maximisant le débit, en minimisant la latence et en garantissant une utilisation efficace des ressources. Suivez les bonnes pratiques suivantes pour optimiser les performances de vos applications.

Étape 1 : Limiter la taille des messages à moins de 1 Mo

Nous vous recommandons de conserver les messages en dessous de 1 mégaoctet (Mo) pour des performances et une fiabilité optimales.

RabbitMQ 3.13 prend en charge des messages d'une taille maximale de 128 Mo par défaut, mais les messages volumineux peuvent déclencher des alarmes mémoire imprévisibles qui bloquent la publication et peuvent potentiellement créer une pression mémoire élevée lors de la réplication des messages entre 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 volumineuses à 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 la 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 afin de mettre en œuvre le modèle de vérification des réclamations.

Schéma illustrant le flux de données entre le producteur, le consommateur, le Amazon MQ courtier et AWS S3.

L'exemple suivant illustre ce modèle à l'aide d'Amazon MQ, le AWS SDK pour Java 2.x, et d'Amazon S3 :

  1. Définissez d'abord une classe 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; }
  2. Créez une méthode d'édition 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); }
  3. Implémentez une méthode grand public qui extrait la charge utile d'Amazon S3, traite la charge utile 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 : Utilisez des consommateurs basic.consume et long-lived

L'utilisation basic.consume auprès d'un consommateur de longue date est plus efficace que l'utilisation basic.get de messages individuels. Pour plus d'informations, voir Sondage pour des 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é globalest définie sur false, donc l'exemple ci-dessus peut être écrit simplement comme channel.basicQos(10).

Étape 4 : Utiliser Celery 5.5 ou une version ultérieure avec des files d'attente de quorum

Python Celery, un système de file d'attente de tâches distribuée, peut générer de nombreux messages non critiques en cas de charge de tâches élevée. Cette activité supplémentaire du courtier peut déclencher Amazon MQ pour RabbitMQ : alarme de mémoire élevée et entraîner une indisponibilité du courtier. Pour réduire le risque de déclenchement d'une alarme mémoire, procédez comme suit :

Pour toutes les versions de Celery

  1. Désactivez-la task_create_missing_queues pour réduire le taux de désabonnement dans la file d'attente.

  2. Désactivez ensuite worker_enable_remote_control pour arrêter la création dynamique de celery@...pidbox files d'attente. Cela réduira le taux de désabonnement des files d'attente pour le courtier.

    worker_enable_remote_control = false
  3. Pour réduire davantage l'activité des messages non critiques, désactivez Celery worker-send-task-events en ne les incluant pas -E ou --task-events en ne les signalant pas lors du démarrage de votre application Celery.

  4. Démarrez votre application Celery à l'aide des paramètres suivants :

    celery -A app_name worker --without-heartbeat --without-gossip --without-mingle

Pour les versions 5.5 et supérieures de Celery

  1. 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 la version de Celery que vous utilisez, utilisezcelery --version. Pour plus d'informations sur les files d'attente de quorum, consultezFiles d'attente de quorum pour RabbitMQ sur Amazon MQ.

  2. Après la mise à niveau vers Celery 5.5 ou version ultérieure, configurez task_default_queue_type le « quorum ».

  3. Ensuite, vous devez également activer Publier les confirmations dans Broker Transport Options  :

    broker_transport_options = {"confirm_publish": True}