Löschen von Warteschlangen in RabbitMQ

93

Ich habe ein paar Warteschlangen mit RabbitMQ. Einige davon sind jetzt nutzlos. Wie kann ich sie löschen? Leider hatte ich die auto_deleteOption nicht eingestellt .

Wenn ich es jetzt einstelle, wird es gelöscht?

Gibt es eine Möglichkeit, diese Warteschlangen jetzt zu löschen?

Phalgun
quelle

Antworten:

121

Wenn Sie sich nicht für die Daten in der Verwaltungsdatenbank interessieren; dh users, vhosts, messagesusw., und weder über andere queues, dann können Sie resetüber Kommandozeile , indem Sie die folgenden Befehle in fahrbereitem Zustand:

WARNUNG: Zusätzlich zu den Warteschlangen, werden diese auch entfernen jede usersund vhostsSie auf Ihrem RabbitMQ Server konfiguriert haben; und löscht alle persistentenmessages

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

Die rabbitmq-Dokumentation besagt, dass der resetBefehl:

Bringt einen RabbitMQ-Knoten in seinen ursprünglichen Zustand zurück.

Entfernt den Knoten aus jedem Cluster, zu dem er gehört, entfernt alle Daten aus der Verwaltungsdatenbank, z. B. konfigurierte Benutzer und vhosts, und löscht alle persistenten Nachrichten.

Seien Sie also vorsichtig damit.

Faruk Sahin
quelle
46
WARNUNG: Dadurch werden auch alle Benutzer und vhosts gelöscht, die Sie auf Ihrem Rabbit-Server konfiguriert haben. Ich habe das auf die harte
Tour herausgefunden
Ups, tut mir leid. Ich habe es nicht bemerkt, da ich zu der Zeit, als ich mit rabbitmq beschäftigt war, eine wirklich grundlegende Konfiguration hatte. Ich werde die Antwort aktualisieren. Vielen Dank!
Faruk Sahin
3
Das ist eine wirklich extreme Antwort. Sie können auch "Server herunterfahren und Datenträger löschen" sagen, um die Warteschlangen zu "löschen".
RubyTuesdayDONO
30
import pika

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

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

connection.close()

Installieren Sie das Pika-Paket wie folgt

$ sudo pip install pika==0.9.8

Die Installation hängt von Pip- und Git-Core-Paketen ab. Möglicherweise müssen Sie diese zuerst installieren.

Unter Ubuntu:

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

Auf Debian:

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

Unter Windows: Um easy_install zu installieren, führen Sie das MS Windows Installer für setuptools aus

> easy_install pip
> pip install pika==0.9.8
Shweta B. Patil
quelle
Auf jeden Fall einfacher für diejenigen, die bereits mit Pika arbeiten, vielen Dank
m.raynal
27

In RabbitMQ-Versionen> 3.0 können Sie die HTTP-API auch verwenden, wenn das Plugin rabbitmq_management aktiviert ist. Stellen Sie einfach sicher, dass der Inhaltstyp auf 'application / json' gesetzt ist, und geben Sie den vhost- und den Warteschlangennamen an:

IE Verwenden von Curl mit einem vhost 'test' und dem Warteschlangennamen '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
Phriscage
quelle
1
administratorStellen Sie sicher, dass Ihr Benutzer mit einem Tag versehen ist, da er sonst bestimmte Teile der API nicht verwenden kann.
Ubershmekel
1
Ich $ 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
bekomme
23

Es gibt rabbitmqadmin, das schön ist, von der Konsole aus zu arbeiten.

Wenn Sie sich bei einem Server anmelden, auf dem Rabbit installiert ist, können Sie es herunterladen von:

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

und speichern Sie es in / usr / local / bin / rabbitmqadmin

Dann kannst du rennen

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

Normalerweise erfordert es Sudo.

Wenn Sie die Eingabe Ihres Benutzernamens und Kennworts vermeiden möchten, können Sie config verwenden

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

All dies unter der Annahme, dass Sie die Datei ** /var/lib/rabbitmq/.rabbitmqadmin.conf** haben und nur ein Minimum haben

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

BEARBEITEN: Ab dem Kommentar von @ user299709 kann es hilfreich sein, darauf hinzuweisen, dass der Benutzer in Kaninchen als "Administrator" gekennzeichnet sein muss. ( https://www.rabbitmq.com/management.html )

Lukino
quelle
Dies gibt "Konnte keine Verbindung herstellen: [Errno 111] Verbindung abgelehnt" für mich zurück. Gibt es eine Möglichkeit zum Debuggen, um zu sehen, was los ist?
user299709
Überprüfen Sie Auth Protokolle, Kaninchen Protokolle ... Benutzer keine Berechtigung zum Arbeiten an VHost haben könnte ... Quit schwer zu sagen , wo ich anfangen
Lukino
Die Lösung bestand darin, den Benutzer mit dem Tag 'Administrator'
user299709
15

Sie stellen sicher, dass eine Warteschlange vorhanden ist (und erstellen sie, wenn dies nicht der Fall ist), indem Sie queue.declare verwenden . Wenn Sie das automatische Löschen ursprünglich auf false gesetzt haben, führt ein erneuter Aufruf von queue.declare mit autodelete true zu einem weichen Fehler und der Broker schließt den Kanal.

Sie müssen jetzt queue.delete verwenden, um es zu löschen.

Weitere Informationen finden Sie in der API-Dokumentation:

Wenn Sie einen anderen Client verwenden, müssen Sie die entsprechende Methode finden. Da es Teil des Protokolls ist, sollte es dort sein, und es ist wahrscheinlich Teil von Channel oder einem gleichwertigen.

Vielleicht möchten Sie auch einen Blick auf den Rest der Dokumentation werfen , insbesondere auf den Abschnitt " Erste Schritte" , in dem viele häufig verwendete Anwendungsfälle behandelt werden.

Wenn Sie eine Frage haben und die Antwort an keiner anderen Stelle finden, sollten Sie versuchen, sie auf der RabbitMQ Discuss- Mailingliste zu veröffentlichen. Die Entwickler geben ihr Bestes, um alle dort gestellten Fragen zu beantworten.

scvalex
quelle
15

Eine kurze Zusammenfassung zum schnellen Löschen der Warteschlange mit allen Standardwerten vom Host, auf dem der RMQ-Server ausgeführt wird:

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

So löschen Sie alle Warteschlangen, die einem Muster in einem bestimmten vhost entsprechen (z. B. 'amq.gen' im root-vhost):

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

Eine andere Möglichkeit wäre, das management_plugin zu aktivieren und über einen Browser eine Verbindung zu ihm herzustellen. Sie können alle Warteschlangen und Informationen dazu anzeigen. Es ist möglich und einfach, Warteschlangen von dieser Schnittstelle zu löschen.

Robthewolf
quelle
Ich habe dies getan, aber mein management_plugin befindet sich in einem anderen Zustand als meine Befehlszeilenschnittstelle
Sweet Chilly Philly
9

Ich habe die JavaScript / jQuery-Methode von Piotr Stapp etwas weiter verallgemeinert, sie in eine Funktion eingekapselt und ein wenig verallgemeinert.

Diese Funktion verwendet die RabbitMQ-HTTP-API, um verfügbare Warteschlangen in einem bestimmten Bereich abzufragen vhostund sie dann basierend auf einer Option zu löschen 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)}
                });
            });
        }
    });
};

Sobald Sie diese Funktion in die JavaScript-Konsole Ihres Browsers eingefügt haben, während Sie sich auf Ihrer RabbitMQ-Verwaltungsseite befinden, können Sie sie folgendermaßen verwenden:

Löschen Sie alle Warteschlangen in '/' vhost

deleteQueues('/');

Löschen Sie alle Warteschlangen in '/' vhost, beginnend mit 'test'.

deleteQueues('/', 'test');

Löschen Sie alle Warteschlangen in 'dev' vhost, beginnend mit 'foo'.

deleteQueues('dev', 'foo');

Bitte benutzen Sie dies auf eigenes Risiko!

Josh
quelle
1
Dies funktionierte perfekt, um eine große Anzahl von Warteschlangen mit demselben Präfix nur mit dem Webadministrator zu entfernen. Vielen Dank!
Espenoh
6

Das Management Plugin (Webinterface) gibt Ihnen einen Link zu einem Python-Skript. Sie können damit Warteschlangen löschen. Ich habe dieses Muster verwendet, um viele Warteschlangen zu entfernen:

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
guettli
quelle
5

Ich benutze diesen Alias ​​in .profile:

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

Wo qclean.pyhat der folgende Code:

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

Im Wesentlichen ist dies eine iterative Version des Codes von Shweta B. Patil.

Vladimir
quelle
5

Installieren

$ sudo rabbitmq-plugins enable rabbitmq_management

und gehen Sie zu http: // localhost: 15672 / # / queues, wenn Sie localhost verwenden. das Standardkennwort wird username: guest, password: guest und auf Warteschlangen Registerkarte gehen und die Warteschlange löschen.

Zabusa
quelle
Mann ... vielen Dank. Ich fand Ihre Antwort sehr hilfreich.
bereket gebredingle
5

Hoffentlich könnte es jemandem helfen.

Ich habe die oben genannten Codeteile ausprobiert, aber kein Streaming durchgeführt.

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

Ich generiere eine Datei, die alle Warteschlangennamen enthält und diese zeilenweise durchläuft, um sie zu löschen. Für die Schleifen while read ...habe ich es nicht getan. Es hörte immer beim ersten Warteschlangennamen auf.

Wenn Sie eine einzelne Warteschlange löschen möchten, helfen die oben genannten Lösungen (Python, Java ...) und auch do sudo rabbitmqctl delete_queue queue_name. Ich benutze rabbitmqctlstatt rabbitmqadmin.

Julien Nyambal
quelle
4

Wenn das Plugin rabbitmq_management installiert ist, können Sie dies ausführen, um alle unerwünschten Warteschlangen zu löschen:

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

Lassen Sie uns den Befehl aufschlüsseln:

rabbitmqctl list_queues -p vhost_name listet alle Warteschlangen auf und wie viele Aufgaben sie aktuell haben.

grep -v "fast\|medium\|slow"filtert die Warteschlangen, die Sie nicht löschen möchten. Nehmen wir an, wir möchten jede Warteschlange ohne die Wörter schnell , mittel oder langsam löschen .

tr "[:blank:]" " " normalisiert das Trennzeichen in rabbitmqctl zwischen dem Namen der Warteschlange und der Anzahl der vorhandenen Aufgaben

cut -d " " -f 1wird sich teilen , jede Zeile durch das Leerzeichen und der 1. Spalte (die Warteschlangenname) Wählen

xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{} nimmt den Namen der Warteschlange auf und setzt ihn dort ein, wo wir ihn eingestellt haben {} Zeichen alle Warteschlangen löscht, die dabei nicht gefiltert werden.

Stellen Sie sicher, dass der verwendete Benutzer über Administratorrechte verfügt.

Hassek
quelle
Vielen Dank an @phriscage für die Inspiration :)
Hassek
2

Ich habe es anders gemacht, weil ich nur Zugriff auf die Management-Webseite hatte. Ich habe ein einfaches "Snippet" erstellt, das Warteschlangen in Javascript löscht. Hier ist es:

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

Alle meine Warteschlangen hatten das Format: PREFIX_0001 bis PREFIX_0XXX

Piotr Stapp
quelle