Удаление очередей в RabbitMQ

93

У меня есть несколько очередей с RabbitMQ. Некоторые из них сейчас бесполезны, как их удалить? К сожалению, я не выбрал auto_deleteопцию.

Если я установлю сейчас, он будет удален?

Есть ли способ удалить эти очереди сейчас?

Phalgun
источник

Ответы:

121

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

ВНИМАНИЕ: В дополнение к очередям, это также удалит все usersи vhosts, которые вы настроили на своем сервере RabbitMQ; и удалит все постоянныеmessages

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

В документации rabbitmq говорится, что resetкоманда:

Возвращает узел RabbitMQ в исходное состояние.

Удаляет узел из любого кластера, к которому он принадлежит, удаляет все данные из базы данных управления, такие как настроенные пользователи и vhosts, и удаляет все постоянные сообщения.

Так что будьте осторожны при его использовании.

Фарук Сахин
источник
46
ВНИМАНИЕ: это также удалит всех пользователей и хостов, которые вы настроили на своем кроличьем сервере. Я выяснил это на собственном
горьком опыте
Ой, извините за это. Я не заметил этого, так как у меня была действительно базовая конфигурация в то время, когда я работал с rabbitmq. Обновлю ответ. Благодарность!
Фарук Сахин
3
это действительно крайний ответ. вы также можете сказать «выключите сервер и очистите диск», чтобы «удалить» очереди.
Ruby, вторникDONO,
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 для инструментов установки.

> easy_install pip
> pip install pika==0.9.8
Светлана Б. Патил
источник
Определенно проще для тех, кто уже работает с pika, спасибо большое
m.raynal
27

В версиях RabbitMQ> 3.0 вы также можете использовать HTTP API, если включен плагин 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 Однако очередь все еще остается :( - есть идеи?
Hackeron
23

Есть rabbitmqadmin, с которым приятно работать с консоли.

Если вы ssh / авторизуетесь на сервере, на котором установлен кролик, вы можете скачать его с:

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

и сохраните его в / usr / local / bin / rabbitmqadmin

Тогда ты можешь бежать

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

Обычно для этого требуется sudo.

Если вы не хотите вводить свое имя пользователя и пароль, вы можете использовать config

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 01
Проверьте журналы аутентификации, журналы кроликов ... Пользователь может не иметь разрешения на работу на VHost ... Трудно сказать, с чего начать
Лукино
решение заключалось в установке пользователя с тегом «администратор»
user299709
16

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

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

Чтобы удалить все очереди, соответствующие шаблону в данном виртуальном хосте (например, содержащие 'amq.gen' в корневом виртуальном хосте):

rabbitmqctl -p / list_queues | grep 'amq.gen' | cut -f1 -d$'\t' | xargs -I % ./rabbitmqadmin -V / delete queue name=%
Сергей Щербаков
источник
15

Вы утверждаете, что очередь существует (и создаете ее, если ее нет), используя queue.declare . Если вы изначально установили для автоматического удаления значение false, повторный вызов queue.declare с autodelete 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, вы можете использовать ее следующим образом:

Удалить все очереди в хосте '/'

deleteQueues('/');

Удалить все очереди в '/' vhost, начинающиеся с 'test'

deleteQueues('/', 'test');

Удалить все очереди в виртуальном хосте 'dev', начинающиеся с '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>/{}подберет имя очереди и установит его там, где мы установили {}символ, удаляющий все очереди, не отфильтрованные в процессе.

Убедитесь, что использованный пользователь имеет права администратора.

Hassek
источник
Спасибо @phriscage за вдохновение :)
Hassek
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

Петр Стапп
источник
1

Я изо всех сил пытался найти ответ, который соответствовал моим потребностям вручную удалить очередь в rabbigmq. Поэтому я думаю, что в этой теме стоит упомянуть, что можно удалить одну очередь без rabbitmqadminиспользования следующей команды:

rabbitmqctl delete_queue <queue_name>
Вальдемар Эдвард Сандал Рольфсен
источник