Suppression des files d'attente dans RabbitMQ


93

J'ai quelques files d'attente avec RabbitMQ. Quelques-uns d'entre eux ne sont plus utiles maintenant, comment puis-je les supprimer? Malheureusement, je n'avais pas défini l' auto_deleteoption.

Si je le configure maintenant, sera-t-il supprimé?

Existe-t-il un moyen de supprimer ces files d'attente maintenant?

Réponses:


121

Si vous ne vous souciez pas des données dans la base de données de gestion; à- dire users, vhosts, messagesetc., ni sur d' autres queues, vous pouvez resetvia commandline en exécutant les commandes suivantes dans l' ordre:

AVERTISSEMENT: en plus des files d'attente, cela supprimera également tout userset vhosts, que vous avez configuré sur votre serveur RabbitMQ; et supprimera tout élément persistantmessages

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

La documentation rabbitmq indique que la resetcommande:

Renvoie un nœud RabbitMQ à son état vierge.

Supprime le nœud de tout cluster auquel il appartient, supprime toutes les données de la base de données de gestion, telles que les utilisateurs et les hôtes virtuels configurés, et supprime tous les messages persistants.

Alors, soyez prudent en l'utilisant.


46
AVERTISSEMENT: cela supprimera également tous les utilisateurs et hôtes virtuels que vous avez configurés sur votre serveur rabbit. J'ai découvert ça à la dure :)
mafrosis

Oups, désolé. Je ne l'ai pas remarqué car j'avais une configuration très basique à l'époque où j'étais impliqué dans rabbitmq. Je mettrai à jour la réponse. Merci!
Faruk Sahin

3
c'est une réponse vraiment extrême. vous pouvez également dire «arrêtez le serveur et essuyez le disque» pour «supprimer» les files d'attente.
RubyTuesdayDONO

30
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
               'localhost'))
channel = connection.channel()

channel.queue_delete(queue='queue-name')

connection.close()

Installez le package pika comme suit

$ sudo pip install pika==0.9.8

L'installation dépend des packages pip et git-core, vous devrez peut-être d'abord les installer.

Sur Ubuntu:

$ sudo apt-get install python-pip git-core

Sur Debian:

$ sudo apt-get install python-setuptools git-core
$ sudo easy_install pip

Sous Windows: pour installer easy_install, exécutez le programme d'installation de MS Windows pour setuptools

> easy_install pip
> pip install pika==0.9.8

Certainement plus facile pour ceux qui travaillent déjà avec pika, merci beaucoup
m.raynal

27

Dans les versions RabbitMQ> 3.0, vous pouvez également utiliser l'API HTTP si le plugin rabbitmq_management est activé. Assurez-vous simplement de définir le type de contenu sur 'application / json' et de fournir le vhost et le nom de la file d'attente:

IE Utilisation de curl avec un hôte virtuel 'test' et un nom de file d'attente 'testqueue':

$ curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/test/testqueue
HTTP/1.1 204 No Content
Server: MochiWeb/1.1 WebMachine/1.9.0 (someone had painted it blue)
Date: Tue, 16 Apr 2013 10:37:48 GMT
Content-Type: application/json
Content-Length: 0

1
Assurez-vous que votre utilisateur est étiqueté, administratorsinon il ne peut pas utiliser certaines parties de l'API.
ubershmekel

1
Je reçois: $ curl -i -u 'user:pass' -H "content-type:application/json" -XDELETE 'http://localhost:15672/api/queues/vhostname/name.portal' HTTP/1.1 204 No Content Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact) Date: Wed, 30 Jul 2014 11:23:47 GMT Content-Type: application/json Content-Length: 0 Cependant la file d'attente reste :( - des idées?
Hackeron

23

Il y a rabbitmqadmin qui est agréable à travailler depuis la console.

Si vous ssh / connectez-vous au serveur sur lequel vous avez installé rabbit, vous pouvez le télécharger à partir de:

http://{server}:15672/cli/rabbitmqadmin

et enregistrez-le dans / usr / local / bin / rabbitmqadmin

Alors tu peux courir

rabbitmqadmin -u {user} -p {password} -V {vhost} delete queue name={name}

Habituellement, cela nécessite sudo.

Si vous voulez éviter de saisir votre nom d'utilisateur et votre mot de passe, vous pouvez utiliser config

rabbitmqadmin -c /var/lib/rabbitmq/.rabbitmqadmin.conf -V {vhost} delete queue name={name}

Tout cela en supposant que vous avez le fichier ** /var/lib/rabbitmq/.rabbitmqadmin.conf** et que vous disposez d'un minimum

hostname = localhost
port = 15672
username = {user}
password = {password}

EDIT: À partir du commentaire de @ user299709, il peut être utile de souligner que l'utilisateur doit être marqué comme 'administrateur' dans rabbit. ( https://www.rabbitmq.com/management.html )


cela retourne `Impossible de se connecter: [Errno 111] Connexion refusée` pour moi un moyen de déboguer pour voir ce qui se passe?
user299709

Vérifiez les journaux d'authentification, les journaux de lapin ... L'utilisateur n'a peut-être pas l'autorisation de travailler sur VHost ... Quittez difficile de dire par où commencer
Lukino

la solution était de définir l'utilisateur avec la balise 'administrator'
user299709

16

Un bref résumé de la suppression rapide de la file d'attente avec toutes les valeurs par défaut de l'hôte qui exécute le serveur RMQ:

curl -O http://localhost:15672/cli/rabbitmqadmin
chmod u+x rabbitmqadmin
./rabbitmqadmin delete queue name=myQueueName

Pour supprimer toutes les files d'attente correspondant à un modèle dans un hôte virtuel donné (par exemple contenant 'amq.gen' dans l'hôte virtuel racine):

rabbitmqctl -p / list_queues | grep 'amq.gen' | cut -f1 -d$'\t' | xargs -I % ./rabbitmqadmin -V / delete queue name=%

15

Vous déclarez qu'une file d'attente existe (et la créez si ce n'est pas le cas) à l'aide de queue.declare . Si vous définissez à l'origine la suppression automatique sur false, un nouvel appel de queue.declare avec autodelete true entraînera une erreur logicielle et le courtier fermera le canal.

Vous devez utiliser queue.delete maintenant pour le supprimer.

Consultez la documentation de l'API pour plus de détails:

Si vous utilisez un autre client, vous devrez trouver la méthode équivalente. Comme cela fait partie du protocole, il devrait être là, et cela fait probablement partie de Channel ou l'équivalent.

Vous pouvez également consulter le reste de la documentation, en particulier la section Mise en route qui couvre de nombreux cas d'utilisation courants.

Enfin, si vous avez une question et que vous ne trouvez pas la réponse ailleurs, vous devriez essayer de publier sur la liste de diffusion RabbitMQ Discuss . Les développeurs font de leur mieux pour répondre à toutes les questions qui y sont posées.


10

Une autre option serait d'activer le management_plugin et de s'y connecter via un navigateur. Vous pouvez voir toutes les files d'attente et les informations les concernant. Il est possible et simple de supprimer des files d'attente de cette interface.


J'ai fait cela mais mon management_plugin est dans un état différent de celui de mon interface de ligne de commande
Sweet Chilly Philly

9

J'ai généralisé un peu plus la méthode JavaScript / jQuery de Piotr Stapp, en l'encapsulant dans une fonction et en la généralisant un peu.

Cette fonction utilise l'API HTTP RabbitMQ pour interroger les files d'attente disponibles dans un fichier donné vhost, puis les supprimer en fonction d'une option queuePrefix:

function deleteQueues(vhost, queuePrefix) {
    if (vhost === '/') vhost = '%2F';  // html encode forward slashes
    $.ajax({
        url: '/api/queues/'+vhost, 
        success: function(result) {
            $.each(result, function(i, queue) {
                if (queuePrefix && !queue.name.startsWith(queuePrefix)) return true;
                $.ajax({
                    url: '/api/queues/'+vhost+'/'+queue.name, 
                    type: 'DELETE', 
                    success: function(result) { console.log('deleted '+ queue.name)}
                });
            });
        }
    });
};

Une fois que vous avez collé cette fonction dans la console JavaScript de votre navigateur sur votre page de gestion RabbitMQ, vous pouvez l'utiliser comme ceci:

Supprimer toutes les files d'attente dans '/' vhost

deleteQueues('/');

Supprimer toutes les files d'attente dans '/' vhost commençant par 'test'

deleteQueues('/', 'test');

Supprimer toutes les files d'attente dans l'hôte virtuel 'dev' commençant par 'foo'

deleteQueues('dev', 'foo');

Veuillez utiliser ceci à vos propres risques!


1
Cela a parfaitement fonctionné pour supprimer un grand nombre de files d'attente avec le même préfixe en utilisant uniquement le web-admin. Merci!
espenoh

6

Le plugin de gestion (interface web) vous donne un lien vers un script python. Vous pouvez l'utiliser pour supprimer des files d'attente. J'ai utilisé ce modèle pour supprimer beaucoup de files d'attente:

python tmp/rabbitmqadmin --vhost=... --username=... --password=... list queues > tmp/q

vi tmp/q # remove all queues which you want to keep

cut -d' ' -f4 tmp/q| while read q; 
    do python tmp/rabbitmqadmin --vhost=... --username=... --password=... delete queue name=$q; 
done

5

J'utilise cet alias dans .profile:

alias qclean="rabbitmqctl list_queues | python ~/bin/qclean.py"

qclean.pya le code suivant:

import sys
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

queues = sys.stdin.readlines()[1:-1]
for x in queues:
    q = x.split()[0]
    print 'Deleting %s...' %(q)
    channel.queue_delete(queue=q)

connection.close()

Il s'agit essentiellement d'une version itérative du code de Shweta B. Patil.


5

installer

$ sudo rabbitmq-plugins enable rabbitmq_management

et accédez à http: // localhost: 15672 / # / queues si vous utilisez localhost. le mot de passe par défaut sera username: guest, password: guest et allez dans l'onglet files d'attente et supprimez la file d'attente.


Mec ... merci beaucoup. J'ai trouvé votre réponse très utile.
bereket gebredingle

5

J'espère que cela pourrait aider quelqu'un.

J'ai essayé les morceaux de code ci-dessus mais je n'ai fait aucun streaming.

sudo rabbitmqctl list_queues | awk '{print $1}' > queues.txt; for line in $(cat queues.txt); do sudo rabbitmqctl delete_queue "$line"; done.

Je génère un fichier qui contient tous les noms de files d'attente et les parcourt ligne par ligne pour les supprimer. Pour les boucles,while read ... je ne l'ai pas fait pour moi. Il s'arrêtait toujours au premier nom de file d'attente.

Aussi, si vous souhaitez supprimer une seule file d'attente, les solutions ci-dessus vous aideront (python, Java ...) et aussi do sudo rabbitmqctl delete_queue queue_name. J'utilise rabbitmqctlau lieu de rabbitmqadmin.


4

Avec le plugin rabbitmq_management installé, vous pouvez l'exécuter pour supprimer toutes les files d'attente indésirables:

rabbitmqctl list_queues -p vhost_name |\
grep -v "fast\|medium\|slow" |\
tr "[:blank:]" " " |\
cut -d " " -f 1 |\
xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost_name>/{}

Décomposons la commande:

rabbitmqctl list_queues -p vhost_name listera toutes les files d'attente et le nombre de tâches qu'elles ont actuellement.

grep -v "fast\|medium\|slow"filtrera les files d'attente que vous ne voulez pas supprimer, disons que nous voulons supprimer toutes les files d'attente sans les mots rapide , moyen ou lent .

tr "[:blank:]" " " normalisera le délimiteur sur rabbitmqctl entre le nom de la file d'attente et le nombre de tâches qu'il y a

cut -d " " -f 1va diviser chaque ligne par l'espace et choisir la 1ère colonne (le nom de la file d'attente)

xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{}récupérera le nom de la file d'attente et le placera là où nous avons défini le {}caractère en supprimant toutes les files d'attente non filtrées dans le processus.

Assurez-vous que l'utilisateur utilisé dispose des autorisations d'administrateur.


Merci à @phriscage pour l'inspiration :)
Hassek

2

Je l'ai fait de manière différente, car je n'avais accès qu'à la page Web de gestion. J'ai créé un simple "extrait" qui supprime les files d'attente en Javascript. C'est ici:

function zeroPad(num, places) {
  var zero = places - num.toString().length + 1;
  return Array(+(zero > 0 && zero)).join("0") + num;
}
var queuePrefix = "PREFIX"
for(var i=0; i<255; i++){ 
   var queueid = zeroPad(i, 4);
   $.ajax({url: '/api/queues/vhost/'+queuePrefix+queueid, type: 'DELETE', success: function(result) {console.log('deleted '+queuePrefix+queueid)}});
}

Toutes mes files d'attente étaient au format: PREFIX_0001 à PREFIX_0XXX

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.