Comment créer un retard de file d'attente dans RabbitMQ?
Quelle est la façon la plus simple de créer un retard (ou parking) de la file d'attente avec Python, Pika et RabbitMQ? J'ai vu une similaire questions, mais aucun pour Python.
Je trouve cette idée utile lors de la conception d'applications, car il nous permet de limiter les messages qui doit être re-file d'attente à nouveau.
Il y a toujours la possibilité que vous recevrez plus de messages que vous pouvez manipuler, peut-être que le serveur est lent, ou la base de données est sous trop de stress.
J'ai trouvé également très utile lorsque quelque chose va mal dans les scénarios où il y a une tolérance zéro à la perte de messages, et alors que la file d'attente des messages qui ne peut pas être traitée elle peut résoudre. Il peut aussi causer des problèmes où le message sera mis en file d'attente, encore et encore. Potentiellement provoquer des problèmes de performances, et le journal de spam.
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé cela très utile lors de l'élaboration de mes applications. Car il vous donne une alternative de simplement re-files d'attente de vos messages. Ce peut facilement réduire la complexité de votre code, et est l'une des nombreuses et puissantes fonctionnalités cachées RabbitMQ.
Étapes
Nous avons d'abord besoin de mettre en place deux chaînes de base, une pour la file d'attente principale, et un pour le retard de la file d'attente. Dans mon exemple, à la fin, j'ai inclus un couple d'indicateurs supplémentaires qui ne sont pas nécessaires, mais rend le code plus fiable; comme
confirm delivery
,delivery_mode
etdurable
. Vous pouvez trouver plus d'informations sur le RabbitMQ manuel.Après nous avons mis en place les canaux de nous ajouter une liaison vers le canal principal que l'on peut utiliser pour envoyer des messages à partir de la de retard du canal de notre file d'attente.
Ensuite, nous avons besoin de configurer notre retard de canal pour transmettre des messages à la file d'attente principale une fois qu'ils ont expiré.
x-message-ttl (Message - Time To Live)
Il est normalement utilisé pour supprimer automatiquement les anciens messages dans le
la file d'attente après une durée spécifique, mais par l'ajout de deux arguments optionnels nous
possible de modifier ce comportement, et au lieu d'avoir ce paramètre à déterminer
en millisecondes combien de temps les messages resteront dans le délai de file d'attente.
x-dead-lettre-routage-clé
Cette variable nous permet de transférer le message à un autre de la file d'attente
une fois qu'ils ont expiré, au lieu de le comportement par défaut de retrait
complètement.
x-dead-lettre-change
Cette variable détermine qui Change utilisé pour transférer le message à partir de hello_delay bonjour la file d'attente.
De la publication sur le retard de la file d'attente
Lorsque nous avons terminé la configuration de tous la base Pika paramètres il vous suffit d'envoyer un message au délai d'attente de l'aide de la base de publier.
Une fois que vous avez exécuté le script, vous devriez voir les files d'attente suivantes créé dans votre RabbitMQ module de gestion.
Exemple.
TTL
pour les propriétés du Message à la place. N'hésitez pas à ouvrir une nouvelle question et un lien ici et je vais y répondre.Vous pouvez utiliser RabbitMQ officiel du plugin: x-retard-message .
Tout d'abord, télécharger et copier le ez fichier en Your_rabbitmq_root_path/plugins
Deuxièmement, activer le plugin (n'avez pas besoin de redémarrer le serveur):
Enfin, la publication de votre message avec "x-retard" en-têtes comme:
Avis:
Il ne permet pas d'assurer que votre message de sécurité, parce que si votre message arrive à expiration pendant votre rabbitmq-serveur de temps d'arrêt, malheureusement, le message est perdu. Donc être prudent lorsque vous utilisez ce système.
En profiter et plus d'infos dans rabbitmq-retard-message-échange
Pour info, comment le faire au Printemps 3.2.x.
NodeJS mise en œuvre.
Tout est assez clair dans le code.
Espérons qu'il permettra de sauver quelqu'un de l'époque.
Message dans le Lapin de la file d'attente peut être retardée de 2 façons
- à l'aide de la FILE d'attente TTL
- à l'aide de Message TTL
Si tous les messages dans la file d'attente doivent être retardé pour des temps d'utilisation de la file d'attente TTL.
Si chaque message doit être retardé par le temps varié Message TTL.
Je l'ai expliqué tout à l'aide de python3 et pika module.
pika BasicProperties argument 'expiration' en millisecondes doit être définie afin de retarder le message en retard de la file d'attente.
Après réglage de l'heure d'expiration, de publier de message à un delayed_queue ("pas à proprement parler de la file d'attente où les consommateurs sont en attente à la consommation") , une fois le message dans delayed_queue expire, le message sera acheminé à un réel file d'attente à l'aide d'exchange 'amq.direct"
Dépend de votre scénario et les besoins, je vous recommande les approches suivantes,