Видалення черг у RabbitMQ


93

У мене кілька черг, що працюють із RabbitMQ. Деякі з них зараз ні до чого, як я можу їх видалити? На жаль, я не встановив цю auto_deleteопцію.

Якщо я встановлю його зараз, чи буде він видалений?

Чи є спосіб видалити ці черги зараз?

Відповіді:


121

Якщо ви не дбаєте про дані в базі даних управління; тобто users, vhosts, і messagesт.д., і ні про інше queues, то ви можете з resetдопомогою командного рядка, виконавши наступні команди в наступному порядку:

ПОПЕРЕДЖЕННЯ: Окрім черг, це також видалить будь-які usersі vhosts, які ви налаштували на своєму сервері RabbitMQ; і видалить усі постійніmessages

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

У документації rabbitmq сказано, що resetкоманда:

Повертає вузол RabbitMQ у початковий стан.

Видаляє вузол з будь-якого кластера, до якого він належить, видаляє всі дані з бази даних управління, наприклад налаштованих користувачів та vhosts, і видаляє всі постійні повідомлення.

Тож будьте обережні з його використанням.


46
ПОПЕРЕДЖЕННЯ: це також призведе до видалення всіх користувачів та хостів, які ви налаштували на своєму кролицькому сервері. Я знайшов це важким шляхом :)
mafrosis

На жаль, вибачте за це. Я цього не помічав, оскільки на той момент, коли я займався rabbitmq, у мене була справді базова конфігурація. Я оновлю відповідь. Дякую!
Фарук Сахін

3
це дійсно крайня відповідь. Ви також можете сказати "вимкніть сервер і витріть диск", щоб "видалити" черги.
RubyTuesdayDONO

30
import pika

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

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

connection.close()

Встановіть пакет pika наступним чином

$ sudo pip install pika==0.9.8

Встановлення залежить від пакетів pip та git-core, можливо, вам доведеться встановити їх спочатку.

На Ubuntu:

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

На Debian:

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

У Windows: Щоб встановити easy_install, запустіть інсталятор MS Windows для setuptools

> easy_install pip
> pip install pika==0.9.8

Безумовно, простіше для тих, хто вже працює з pika, велике спасибі
m.raynal 20.03.18

27

У версіях RabbitMQ> 3.0 ви також можете використовувати API HTTP, якщо увімкнено плагін rabbitmq_management. Просто не забудьте встановити тип вмісту на 'application / json' та вкажіть ім'я vhost та черги:

IE Використання curl із vhost 'test' та ім'ям черги '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
Переконайтеся, що ваш користувач позначений тегами, оскільки в administratorіншому випадку він не може використовувати певні частини API.
ubershmekel 02

1
Я отримую: $ 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 Однак черга все ще залишається :( - будь-які ідеї?
Хаккерон

23

Існує rabbitmqadmin, з яким приємно працювати з консолі.

Якщо ви ssh / увійти на сервер, де встановлено кролик, ви можете завантажити його з:

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

і збережіть його в / usr / local / bin / rabbitmqadmin

Тоді можна бігати

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

Зазвичай для цього потрібно судо.

Якщо ви хочете уникнути введення свого імені користувача та пароля, можете скористатися конфігурацією

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

Все це під припущенням, що у вас є файл ** /var/lib/rabbitmq/.rabbitmqadmin.conf** і ви маєте мінімум

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

РЕДАГУВАТИ: На коментар від @ user299709, може бути корисним зазначити, що користувач повинен бути позначений як "адміністратор" у кролика. ( https://www.rabbitmq.com/management.html )


це повертає `Не вдалося підключитися: [Errno 111] Підключення відмовлено` для мене будь-яким способом налагодження, щоб побачити, що відбувається?
user299709

Перевіряйте журнали автентифікації, журнали кроликів ... Можливо, користувач не має дозволу працювати на VHost ... Важко сказати, з чого почати
Лукіно,

рішенням було встановлення для користувача тегу «адміністратор»
user299709

16

Короткий підсумок для швидкого видалення черги з усіма значеннями за замовчуванням із хосту, на якому запущений сервер RMQ:

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

Щоб видалити всі черги, що відповідають шаблону в даному vhost (наприклад, що містить "amq.gen" у кореневому vhost):

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

15

Ви стверджуєте, що черга існує (і створюєте її, якщо її немає), використовуючи queue.declare . Якщо ви спочатку встановили для автоматичного видалення значення false, повторний виклик queue.declare з автоматичним видаленням true призведе до помилки, і брокер закриє канал.

Вам потрібно використовувати queue.delete зараз, щоб видалити його.

Детальніше див. Документацію API:

Якщо ви використовуєте іншого клієнта, вам потрібно буде знайти еквівалентний метод. Оскільки це частина протоколу, вона повинна бути там, і, можливо, це частина Channel або еквівалента.

Можливо, ви також захочете поглянути на решту документації, зокрема на розділ Початок роботи, який охоплює багато поширених випадків використання.

Нарешті, якщо у вас є запитання і ви не можете знайти відповідь в іншому місці, спробуйте розмістити повідомлення у списку розсилки RabbitMQ Discuss . Розробники роблять все можливе, щоб відповісти на всі запитання, задані там.


10

Іншим варіантом було б включити плагін management_plugin і підключитися до нього через браузер. Ви можете переглянути всі черги та інформацію про них. Видалити черги з цього інтерфейсу можна і просто.


Я зробив це, але мій management_plugin перебуває в іншому стані, ніж мій інтерфейс командного рядка
Sweet Chilly Philly

9

Я трохи узагальнив метод JavaScript / jQuery Петра Степпа, інкапсулюючи його у функцію і трохи узагальнивши.

Ця функція використовує RabbitMQ HTTP API для запиту наявних черг у заданому vhost, а потім видаляє їх на основі необов’язкового 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)}
                });
            });
        }
    });
};

Після того, як ви вставите цю функцію в консоль JavaScript вашого браузера, перебуваючи на сторінці керування RabbitMQ, ви можете використовувати її так:

Видалити всі черги у '/' vhost

deleteQueues('/');

Видалити всі черги в '/' vhost, що починаються з 'test'

deleteQueues('/', 'test');

Видалити всі черги у "dev" vhost, що починаються на "foo"

deleteQueues('dev', 'foo');

Будь ласка, використовуйте це на свій страх і ризик!


1
Це чудово працювало для видалення величезної кількості черг з однаковим префіксом за допомогою лише веб-адміністратора. Дякую!
espenoh

6

Плагін управління (веб-інтерфейс) дає посилання на скрипт python. Ви можете використовувати його для видалення черг. Я використав цей шаблон, щоб видалити багато черг:

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

Я використовую цей псевдонім у .profile:

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

де qclean.pyмає такий код:

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

По суті, це ітеративна версія коду Швети Б. Патіл.


5

встановити

$ sudo rabbitmq-plugins enable rabbitmq_management

і перейдіть до http: // localhost: 15672 / # / queues, якщо ви використовуєте localhost. пароль за замовчуванням буде username: guest, password: guest перейдіть на вкладку черги та видаліть чергу.


Людина ... велике спасибі. Я знайшов вашу відповідь дуже корисною.
bereket gebredingle

5

Сподіваємось, це може комусь допомогти.

Я спробував вищезазначені фрагменти коду, але не виконував потокового передавання.

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

Я генерую файл, який містить усі назви черги та цикли по ньому, рядок за рядком для їх видалення. Для петель, while read ...не зробив це для мене. Це завжди зупинялося біля першої назви черги.

Крім того, якщо ви хочете видалити одну чергу, допоможуть наведені вище рішення (python, Java ...), а також do sudo rabbitmqctl delete_queue queue_name. Я використовую rabbitmqctlзамість rabbitmqadmin.


4

З встановленим плагіном rabbitmq_management ви можете запустити це, щоб видалити всі небажані черги:

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

Давайте розберемо команду:

rabbitmqctl list_queues -p vhost_name перерахує всі черги та скільки завдань вони мають на даний момент.

grep -v "fast\|medium\|slow"буде фільтрувати черги, які ви не хочете видаляти, скажімо, ми хочемо видалити кожну чергу без слів швидкий , середній або повільний .

tr "[:blank:]" " " нормалізує роздільник на rabbitmqctl між назвою черги та обсягом завдань

cut -d " " -f 1буде розділити кожен рядок на пробіл і виберіть 1 - й стовпець (ім'я черги)

xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{}підбере ім'я черги та встановить його там, де ми встановили {}символ, видаляючи всі черги, не відфільтровані в процесі.

Переконайтеся, що користувач використовував права адміністратора.


Дякую @phriscage за натхнення :)
Хассек,

2

Я зробив це по-іншому, оскільки мав доступ лише до веб-сторінки управління. Я створив простий "фрагмент", який видаляє черги в Javascript. Ось:

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

Усі мої черги були у форматі: PREFIX_0001 до PREFIX_0XXX

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.