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.