Usuwanie kolejek w RabbitMQ


93

Mam kilka kolejek uruchomionych z RabbitMQ. Kilka z nich jest teraz bezużytecznych, jak mogę je usunąć? Niestety nie ustawiłem tej auto_deleteopcji.

Jeśli ustawię to teraz, czy zostanie usunięte?

Czy jest sposób, aby teraz usunąć te kolejki?

Odpowiedzi:


121

Jeśli nie dbasz o dane w bazie danych zarządzania; czyli users, vhosts, messagesitd., a nie o innych queues, wtedy można resetza pomocą poleceń, uruchamiając następujące polecenia w kolejności:

OSTRZEŻENIE: Oprócz kolejek, spowoduje to również usunięcie wszystkich usersi vhosts, które skonfigurowałeś na swoim serwerze RabbitMQ; i usunie wszystkie trwałe plikimessages

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

Dokumentacja rabbitmq mówi, że resetpolecenie:

Przywraca węzeł RabbitMQ do stanu pierwotnego.

Usuwa węzeł z dowolnego klastra, do którego należy, usuwa wszystkie dane z bazy danych zarządzania, takie jak skonfigurowani użytkownicy i hosty wirtualne, oraz wszystkie trwałe komunikaty.

Więc uważaj, używając go.


46
OSTRZEŻENIE: spowoduje to również usunięcie wszystkich użytkowników i vhostów skonfigurowanych na serwerze królika.
Przekonałem

Przepraszam za to. Nie zauważyłem tego, ponieważ miałem naprawdę podstawową konfigurację w czasie, gdy byłem zaangażowany w rabbitmq. Zaktualizuję odpowiedź. Dzięki!
Faruk Sahin

3
to jest naprawdę skrajna odpowiedź. można też powiedzieć „zamknij serwer i wyczyść dysk”, aby „usunąć” kolejki.
RubyTuesdayDONO

30
import pika

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

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

connection.close()

Zainstaluj pakiet pika w następujący sposób

$ sudo pip install pika==0.9.8

Instalacja zależy od pakietów pip i git-core, być może trzeba będzie je najpierw zainstalować.

W systemie Ubuntu:

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

W Debianie:

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

W systemie Windows: Aby zainstalować easy_install, uruchom Instalatora MS Windows dla setuptools

> easy_install pip
> pip install pika==0.9.8

Zdecydowanie łatwiejsze dla tych, którzy już pracują z pika, wielkie dzięki
m.raynal

27

W wersjach RabbitMQ> 3.0 można również używać interfejsu API HTTP, jeśli włączona jest wtyczka rabbitmq_management. Po prostu pamiętaj, aby ustawić typ zawartości na „application / json” i podać nazwę vhosta i kolejki:

IE Używanie curl z "test" vhosta i nazwą kolejki "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
Upewnij się, że Twój użytkownik jest otagowany, ponieważ w administratorprzeciwnym razie nie będzie mógł używać niektórych części interfejsu API.
ubershmekel

1
Dostaję: $ 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 Jednak kolejka nadal pozostaje :( - jakieś pomysły?
Hackeron

23

Jest rabbitmqadmin, który jest przyjemny do pracy z konsoli.

Jeśli zalogujesz się przez ssh / do serwera, na którym masz zainstalowanego królika, możesz go pobrać z:

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

i zapisz go w / usr / local / bin / rabbitmqadmin

Wtedy możesz biec

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

Zwykle wymaga sudo.

Jeśli chcesz uniknąć wpisywania nazwy użytkownika i hasła, możesz użyć config

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

Wszystko to przy założeniu, że masz plik ** /var/lib/rabbitmq/.rabbitmqadmin.conf** i masz gołe minumum

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

EDYCJA: Od komentarza @ user299709, pomocne może być wskazanie, że użytkownik musi być oznaczony jako „administrator” w króliku. ( https://www.rabbitmq.com/management.html )


zwraca „Could not connect: [Errno 111] Connection odrzucone” dla mnie w jakikolwiek sposób na debugowanie, aby zobaczyć, co się dzieje?
user299709

Sprawdź dzienniki uwierzytelniania, dzienniki królików ... Użytkownik może nie mieć uprawnień do pracy na VHost ... Trudno powiedzieć, od czego zacząć
Lukino

rozwiązaniem było ustawienie użytkownika z tagiem „administrator”
user299709

16

Krótkie podsumowanie dotyczące szybkiego usuwania kolejki ze wszystkimi wartościami domyślnymi z hosta, na którym działa serwer RMQ:

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

Aby usunąć wszystkie kolejki pasujące do wzorca w danym vhostie (np. Zawierające „amq.gen” w głównym vhostie):

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

15

Twierdzisz, że kolejka istnieje (i tworzysz ją, jeśli tak nie jest) za pomocą queue.declare . Jeśli pierwotnie ustawiłeś automatyczne usuwanie na fałsz, ponowne wywołanie queue.declare z autodelete true spowoduje wystąpienie miękkiego błędu i broker zamknie kanał.

Musisz teraz użyć queue.delete , aby go usunąć.

Więcej informacji znajdziesz w dokumentacji API:

Jeśli używasz innego klienta, musisz znaleźć równoważną metodę. Ponieważ jest częścią protokołu, powinien tam być i prawdopodobnie jest częścią kanału lub jego odpowiednika.

Możesz również zajrzeć do pozostałej części dokumentacji, w szczególności do sekcji Rozpoczęcie pracy, która obejmuje wiele typowych przypadków użycia.

Wreszcie, jeśli masz pytanie i nie możesz znaleźć odpowiedzi gdzie indziej, spróbuj opublikować post na liście mailingowej RabbitMQ Discuss . Deweloperzy starają się odpowiedzieć na wszystkie zadawane tam pytania.


10

Inną opcją byłoby włączenie management_plugin i połączenie się z nim przez przeglądarkę. Możesz zobaczyć wszystkie kolejki i informacje o nich. Z poziomu tego interfejsu możliwe i proste jest usuwanie kolejek.


Zrobiłem to, ale mój management_plugin jest w innym stanie niż mój interfejs wiersza poleceń
Sweet Chilly Philly

9

Metodę JavaScript / jQuery Piotra Stappa uogólniłem nieco dalej, hermetyzując ją w funkcję i nieco uogólniając.

Ta funkcja używa RabbitMQ HTTP API do odpytywania dostępnych kolejek w danym vhost, a następnie usuwa je na podstawie opcjonalnego 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)}
                });
            });
        }
    });
};

Po wklejeniu tej funkcji w konsoli JavaScript przeglądarki na stronie zarządzania RabbitMQ możesz jej używać w następujący sposób:

Usuń wszystkie kolejki w „/” vhost

deleteQueues('/');

Usuń wszystkie kolejki w „/” vhost zaczynające się od „test”

deleteQueues('/', 'test');

Usuń wszystkie kolejki w „dev” vhost zaczynające się od „foo”

deleteQueues('dev', 'foo');

Używaj tego na własne ryzyko!


1
To działało doskonale przy usuwaniu ogromnej liczby kolejek z tym samym prefiksem przy użyciu tylko administratora sieci. Dzięki!
espenoh

6

Wtyczka zarządzająca (interfejs sieciowy) udostępnia łącze do skryptu w języku Python. Możesz go użyć do usuwania kolejek. Użyłem tego wzorca do usunięcia wielu kolejek:

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

Używam tego aliasu w .profile:

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

gdzie qclean.pyma następujący kod:

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

Zasadniczo jest to iteracyjna wersja kodu Shwety B. Patil.


5

zainstalować

$ sudo rabbitmq-plugins enable rabbitmq_management

i przejdź do http: // localhost: 15672 / # / queues, jeśli używasz localhost. domyślne hasło będzie username: guest, password: guest i przejdź do zakładki kolejek i usunąć kolejkę.


Człowieku ... wielkie dzięki. Twoja odpowiedź była dla mnie bardzo pomocna.
bereket gebredingle

5

Miejmy nadzieję, że może to komuś pomóc.

Wypróbowałem powyższe fragmenty kodu, ale nie wykonałem żadnego przesyłania strumieniowego.

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

Generuję plik, który zawiera wszystkie nazwy kolejek i przechodzę przez niego wiersz po wierszu, aby je usunąć. W przypadku pętliwhile read ... nie zrobiłem tego za mnie. Zawsze zatrzymywał się na pierwszej nazwie kolejki.

Ponadto, jeśli chcesz usunąć pojedynczą kolejkę, powyższe rozwiązania pomogą (python, Java ...), a także do sudo rabbitmqctl delete_queue queue_name. Używam rabbitmqctlzamiast rabbitmqadmin.


4

Po zainstalowaniu wtyczki rabbitmq_management możesz uruchomić to, aby usunąć wszystkie niechciane kolejki:

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

Złóżmy polecenie:

rabbitmqctl list_queues -p vhost_name wyświetli listę wszystkich kolejek i liczbę aktualnie wykonanych zadań.

grep -v "fast\|medium\|slow"przefiltruje kolejki, których nie chcesz usunąć, powiedzmy, że chcemy usunąć każdą kolejkę bez słów szybko , średnio lub wolno .

tr "[:blank:]" " " znormalizuje ogranicznik w rabbitmqctl między nazwą kolejki a liczbą zadań

cut -d " " -f 1podzieli każdą linię białymi znakami i wybierze pierwszą kolumnę (nazwę kolejki)

xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{}odbierze nazwę kolejki i ustawi ją w miejscu, w którym ustawimy {}znak, usuwając wszystkie kolejki niefiltrowane w procesie.

Upewnij się, że użyty użytkownik ma uprawnienia administratora.


Dzięki @phriscage za inspirację :)
Hassek

2

Zrobiłem to inaczej, bo miałem tylko dostęp do strony zarządzania. Stworzyłem prosty "fragment", który usuwa kolejki w Javascript. Oto ona:

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

Wszystkie moje kolejki były w formacie: od PREFIX_0001 do PREFIX_0XXX


1

Miałem trudności ze znalezieniem odpowiedzi, która odpowiadałaby moim potrzebom, czyli ręcznego usunięcia kolejki w rabbigmq. Dlatego myślę, że warto wspomnieć w tym wątku, że można usunąć pojedynczą kolejkę bez rabbitmqadminużycia następującego polecenia:

rabbitmqctl delete_queue <queue_name>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.