web-dev-qa-db-fra.com

Supprimer des files d'attente dans RabbitMQ

J'ai quelques files d'attente sous RabbitMQ. Quelques-uns d'entre eux ne sont d'aucune utilité, comment puis-je les supprimer? Malheureusement, je n'avais pas réglé le auto_delete option.

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

Est-il possible de supprimer ces files d'attente maintenant?

84
Phalgun

Si vous ne vous souciez pas des autres files d'attente, vous pouvez toutes les supprimer via la ligne de commande en exécutant les commandes suivantes dans l'ordre:

Attention: cela aussi supprimer tout tilisateurs et vhosts vous avez configuré sur votre serveur lapin

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

La documentation de rabbitmq indique que la commande reset:

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

Alors, soyez prudent en l'utilisant.

114
Faruk Sahin
import pika

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

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

connection.close()

Installez le paquet pika comme suit

$ Sudo pip install pika==0.9.8

L’installation dépend des paquets pip et git-core, vous devrez peut-être les installer au préalable.

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, lancez MS Windows Installer pour setuptools.

> easy_install pip
> pip install pika==0.9.8
27
Shweta B. Patil

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

C'EST À DIRE. Utilisation de curl avec un 'test' vhost 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
25
phriscage

Il y a rabbitmqadmin qui permet de travailler facilement 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

Ensuite, vous pouvez courir

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

Habituellement, il faut Sudo.

Si vous souhaitez é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 avez au minimum

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

EDIT: En tant que commentaire de @ user299709, il pourrait être utile de signaler que l'utilisateur doit être identifié comme 'administrateur' chez le lapin. ( https://www.rabbitmq.com/management.html )

21
Lukino

Résumé succinct pour 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 vhost donné (par exemple, contenant 'amq.gen' dans la racine vhost):

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

Vous affirmez qu'une file d'attente existe (et la créez si ce n'est pas le cas) en utilisant queue.declare . Si vous avez initialement défini la suppression automatique sur false, un nouvel appel de queue.declare avec autodelete true entraîne une erreur logicielle et le courtier ferme le canal.

Vous devez utiliser queue.delete maintenant pour le supprimer.

Voir 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, essayez d’afficher sur la liste de diffusion RabbitMQ Discuter . Les développeurs font de leur mieux pour répondre à toutes les questions qui y sont posées.

14
scvalex

Une autre option serait d’activer le management_plugin et de vous 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.

10
robthewolf

J'ai généralisé un peu plus loin 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 vhost donné, puis les supprimer en fonction d'un queuePrefix facultatif:

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 la page de gestion de RabbitMQ, vous pouvez l'utiliser comme suit:

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 'dev' vhost commençant par 'foo'

deleteQueues('dev', 'foo');

Veuillez utiliser ceci à vos risques et périls!

9
Josh

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
6
guettli

J'utilise cet alias dans .profile:

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

qclean.py a 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
Vladimir

installer

$ Sudo rabbitmq-plugins enable rabbitmq_management

et allez à 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 Queues et supprimez la file.

4
zabusa

Avec le plugin rabbitmq_management installé, vous pouvez exécuter ceci 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. Supposons que nous voulions supprimer toutes les files d'attente sans les mots fast, medium 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 contient.

cut -d " " -f 1 Va fractionner chaque ligne par le blanc 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 définira à l'endroit où nous définissons 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.

4
Hassek

Je l'ai fait différemment, 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

2
Piotr Stapp

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

J'ai essayé les morceaux de code ci-dessus mais je n'ai pas fait de 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 file d’attente et passe en boucle ligne par ligne pour les supprimer. Pour les boucles, while read ... ne l’a pas fait pour moi. Il s'arrêtait toujours au premier nom de la file d'attente.

De plus, si vous souhaitez supprimer une seule file d'attente, les solutions ci-dessus vous aideront (python, Java ...)) ainsi que do Sudo rabbitmqctl delete_queue queue_name. J'utilise rabbitmqctl au lieu de rabbitmqadmin.

1
Julien Nyambal