Eliminazione delle code in RabbitMQ


93

Ho alcune code in esecuzione con RabbitMQ. Alcuni di loro non servono ora, come posso eliminarli? Purtroppo non avevo impostato l' auto_deleteopzione.

Se lo imposto adesso, verrà cancellato?

C'è un modo per eliminare quelle code adesso?

Risposte:


121

Se non ti interessano i dati nel database di gestione; vale a dire users, vhosts, messagesecc, e non su altri queues, allora si può resettramite riga di comando eseguendo i seguenti comandi in ordine:

ATTENZIONE: Oltre alle code, questo rimuoverà anche qualsiasi userse vhosts, che hai configurato sul tuo server RabbitMQ; e cancellerà qualsiasi file persistentemessages

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

La documentazione di rabbitmq dice che il resetcomando:

Restituisce un nodo RabbitMQ al suo stato vergine.

Rimuove il nodo da qualsiasi cluster a cui appartiene, rimuove tutti i dati dal database di gestione, come utenti configurati e vhost, ed elimina tutti i messaggi persistenti.

Quindi, fai attenzione ad usarlo.


46
ATTENZIONE: questo cancellerà anche tutti gli utenti e vhost che hai configurato sul tuo server rabbit. L'ho scoperto nel modo più duro :)
mafrosis

Ops, mi dispiace per questo. Non l'ho notato da quando avevo una configurazione davvero di base al momento in cui mi occupavo di rabbitmq. Aggiornerò la risposta. Grazie!
Faruk Sahin

3
questa è una risposta davvero estrema. potresti anche dire "spegni il server e cancella il disco" per "eliminare" le code.
RubyTuesdayDONO

30
import pika

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

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

connection.close()

Installa il pacchetto pika come segue

$ sudo pip install pika==0.9.8

L'installazione dipende dai pacchetti pip e git-core, potrebbe essere necessario installarli prima.

Su Ubuntu:

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

Su Debian:

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

Su Windows: per installare easy_install, esegui MS Windows Installer per setuptools

> easy_install pip
> pip install pika==0.9.8

Decisamente più facile per chi già lavora con pika, grazie mille
m.raynal

27

Nelle versioni RabbitMQ> 3.0, puoi anche utilizzare l'API HTTP se il plug-in rabbitmq_management è abilitato. Assicurati solo di impostare il tipo di contenuto su 'application / json' e di fornire il vhost e il nome della coda:

IE Utilizzo di curl con un vhost 'test' e il nome della coda '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
Assicurati che il tuo utente sia taggato, administratoraltrimenti non potrà utilizzare alcune parti dell'API.
ubershmekel

1
Ricevo: $ 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 Tuttavia la coda rimane ancora :( - qualche idea?
Hackeron

23

C'è rabbitmqadmin che è bello lavorare da console.

Se accedi con ssh / al server su cui hai installato rabbit, puoi scaricarlo da:

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

e salvalo in / usr / local / bin / rabbitmqadmin

Allora puoi correre

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

Di solito richiede sudo.

Se vuoi evitare di digitare il tuo nome utente e la tua password, puoi usare config

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

Tutto ciò presupponendo che tu abbia il file ** /var/lib/rabbitmq/.rabbitmqadmin.conf** e abbia un minimo minimo

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

EDIT: A partire dal commento di @ user299709, potrebbe essere utile sottolineare che l'utente deve essere etichettato come "amministratore" in rabbit. ( https://www.rabbitmq.com/management.html )


questo restituisce `Impossibile connettersi: [Errno 111] Connessione rifiutata` per me in qualche modo per eseguire il debug per vedere cosa sta succedendo?
user299709

Controlla i log di autenticazione, i log di coniglio ... L'utente potrebbe non avere il permesso di lavorare su VHost ... Difficile dire da dove cominciare
Lukino

la soluzione è stata impostare l'utente con il tag "amministratore"
user299709

16

Un breve riepilogo per l'eliminazione rapida della coda con tutti i valori predefiniti dall'host che esegue il server RMQ:

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

Per eliminare tutte le code che corrispondono a un modello in un dato vhost (es. Contenente 'amq.gen' nel vhost root):

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

15

Asserisci che esiste una coda (e la crei se non esiste) utilizzando queue.declare . Se originariamente hai impostato la cancellazione automatica su false, chiamando di nuovo queue.declare con autodelete true si verificherà un errore soft e il broker chiuderà il canale.

Devi usare queue.delete ora per eliminarlo.

Consulta la documentazione API per i dettagli:

Se utilizzi un altro client, dovrai trovare il metodo equivalente. Dato che fa parte del protocollo, dovrebbe esserci, e probabilmente fa parte di Channel o equivalente.

Potresti anche voler dare un'occhiata al resto della documentazione, in particolare alla Guida introduttiva sezione che copre molti casi d'uso comuni.

Infine, se hai una domanda e non riesci a trovare la risposta altrove, dovresti provare a postare sulla mailing list di RabbitMQ Discuss . Gli sviluppatori fanno del loro meglio per rispondere a tutte le domande poste lì.


10

Un'altra opzione potrebbe essere quella di abilitare management_plugin e connettersi ad esso tramite un browser. Puoi vedere tutte le code e le informazioni su di esse. È possibile e semplice eliminare le code da questa interfaccia.


L'ho fatto ma il mio management_plugin è in uno stato diverso dalla mia interfaccia a riga di comando
Sweet Chilly Philly,

9

Ho generalizzato ulteriormente il metodo JavaScript / jQuery di Piotr Stapp, incapsulandolo in una funzione e generalizzandolo un po '.

Questa funzione utilizza l'API HTTP RabbitMQ per interrogare le code disponibili in un dato vhoste quindi eliminarle in base a un facoltativo 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)}
                });
            });
        }
    });
};

Dopo aver incollato questa funzione nella console JavaScript del tuo browser mentre sei nella pagina di gestione di RabbitMQ, puoi usarla in questo modo:

Elimina tutte le code in "/" vhost

deleteQueues('/');

Elimina tutte le code in "/" vhost che iniziano con "test"

deleteQueues('/', 'test');

Elimina tutte le code in vhost "dev" che iniziano con "foo"

deleteQueues('dev', 'foo');

Si prega di utilizzare questo a proprio rischio!


1
Questo ha funzionato perfettamente per rimuovere un numero enorme di code con lo stesso prefisso utilizzando solo l'amministratore web. Grazie!
espenoh

6

Il plug-in di gestione (interfaccia web) fornisce un collegamento a uno script Python. Puoi usarlo per eliminare le code. Ho usato questo modello per rimuovere molte code:

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

Uso questo alias in .profile:

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

dove qclean.pyha il seguente codice:

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()

Essenzialmente, questa è una versione iterativa del codice di Shweta B. Patil.



5

Si spera che possa aiutare qualcuno.

Ho provato i pezzi di codice sopra ma non ho fatto alcun streaming.

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

Genero un file che contiene tutti i nomi delle code e lo faccio scorrere riga per riga per eliminarli. Per i loop,while read ... non l'ho fatto per me. Si fermava sempre al primo nome della coda.

Inoltre, se vuoi eliminare una singola coda, le soluzioni di cui sopra ti aiuteranno (python, Java ...) e anche do sudo rabbitmqctl delete_queue queue_name. Sto usando rabbitmqctlinvece di rabbitmqadmin.


4

Con il plug-in rabbitmq_management installato puoi eseguirlo per eliminare tutte le code indesiderate:

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>/{}

Analizziamo il comando:

rabbitmqctl list_queues -p vhost_name elencherà tutte le code e quante attività hanno attualmente.

grep -v "fast\|medium\|slow"filtrerà le code che non vuoi eliminare, diciamo che vogliamo eliminare ogni coda senza le parole veloce , medio o lento .

tr "[:blank:]" " " normalizzerà il delimitatore su rabbitmqctl tra il nome della coda e la quantità di attività presenti

cut -d " " -f 1sarà dividere ogni riga dal spazi e scegliere la prima colonna (il nome della coda)

xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{}prenderà il nome della coda e lo imposterà dove abbiamo impostato il {}carattere eliminando tutte le code non filtrate nel processo.

Assicurati che l'utente utilizzato disponga delle autorizzazioni di amministratore.


Grazie a @phriscage per l'ispirazione :)
Hassek

2

L'ho fatto in modo diverso, perché avevo accesso solo alla pagina web di gestione. Ho creato un semplice "snippet" che elimina le code in Javascript. Ecco qui:

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)}});
}

Tutte le mie code erano nel formato: da PREFIX_0001 a PREFIX_0XXX

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.