Excluindo filas no RabbitMQ


93

Tenho algumas filas em execução com RabbitMQ. Alguns deles são inúteis agora, como posso excluí-los? Infelizmente, não havia definido a auto_deleteopção.

Se eu definir agora, ele será excluído?

Existe uma maneira de excluir essas filas agora?

Respostas:


121

Se você não se preocupa com os dados no banco de dados de gerenciamento; ou seja users, vhosts, messagesetc., e nem sobre outra queues, então você pode resetvia linha de comando, executando os seguintes comandos em ordem:

AVISO: Além das filas, isso também removerá todas as userse vhosts, você configurou em seu servidor RabbitMQ; e irá deletar qualquer persistentemessages

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

A documentação do rabbitmq diz que o resetcomando:

Retorna um nó RabbitMQ ao seu estado virgem.

Remove o nó de qualquer cluster ao qual pertença, remove todos os dados do banco de dados de gerenciamento, como usuários e vhosts configurados, e exclui todas as mensagens persistentes.

Portanto, tome cuidado ao usá-lo.


46
AVISO: isto também irá deletar quaisquer usuários e vhosts que você configurou no seu servidor Rabbit. Descobri isso da maneira mais difícil :)
mafrosis

Opa, desculpe por isso. Eu não notei isso porque eu tinha uma configuração realmente básica na época em que estive envolvido com o rabbitmq. Vou atualizar a resposta. Obrigado!
Faruk Sahin

3
esta é uma resposta realmente extrema. você também pode dizer "desligue o servidor e limpe o disco" para "excluir" as filas.
RubyT TuesdayDONO

30
import pika

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

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

connection.close()

Instale o pacote pika como segue

$ sudo pip install pika==0.9.8

A instalação depende dos pacotes pip e git-core, você pode precisar instalá-los primeiro.

No Ubuntu:

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

No Debian:

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

No Windows: para instalar easy_install, execute o MS Windows Installer para ferramentas de configuração

> easy_install pip
> pip install pika==0.9.8

Definitivamente mais fácil para aqueles que já trabalham com pika, muito obrigado
m.raynal

27

Nas versões RabbitMQ> 3.0, você também pode utilizar a API HTTP se o plugin rabbitmq_management estiver habilitado. Apenas certifique-se de definir o tipo de conteúdo como 'application / json' e fornecer o vhost e o nome da fila:

IE usando curl com um vhost 'test' e nome de fila '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
Certifique-se de que seu usuário esteja marcado, administratorcaso contrário, ele não poderá usar certas partes da API.
ubershmekel

1
Estou recebendo: $ 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 No entanto, a fila ainda permanece :( - alguma ideia?
Hackeron

23

Existe o rabbitmqadmin que é bom para trabalhar no console.

Se você efetuar ssh / logar no servidor onde instalou o rabbit, poderá baixá-lo em:

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

e salve-o em / usr / local / bin / rabbitmqadmin

Então você pode correr

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

Normalmente, requer sudo.

Se você quiser evitar digitar seu nome de usuário e senha, você pode usar config

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

Tudo isso supondo que você tenha o arquivo ** /var/lib/rabbitmq/.rabbitmqadmin.conf** e tenha o mínimo

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

EDITAR: A partir do comentário de @ user299709, pode ser útil apontar que o usuário deve ser marcado como 'administrador' no coelho. ( https://www.rabbitmq.com/management.html )


isso retorna `Não foi possível conectar: ​​[Errno 111] Conexão recusada` para mim alguma forma de depurar para ver o que está acontecendo?
user299709

Verifique os logs de autenticação, os logs do coelho ... O usuário pode não ter permissão para trabalhar no VHost ... É difícil dizer por onde começar
Lukino

a solução foi configurar o usuário com a tag 'administrador'
user299709,

15

Você afirma que existe uma fila (e a cria se não existir) usando queue.declare . Se você configurou originalmente a exclusão automática para false, chamar queue.declare novamente com autodelete true resultará em um erro de software e o broker fechará o canal.

Você precisa usar queue.delete agora para excluí-lo.

Consulte a documentação da API para obter detalhes:

Se você usar outro cliente, precisará encontrar o método equivalente. Como faz parte do protocolo, deve estar lá e provavelmente faz parte do Canal ou equivalente.

Você também pode dar uma olhada no restante da documentação, em particular na seção Primeiros passos , que cobre muitos casos de uso comuns.

Finalmente, se você tem uma pergunta e não consegue encontrar a resposta em outro lugar, você deve tentar postar na lista de discussão RabbitMQ Discuss . Os desenvolvedores fazem o possível para responder a todas as perguntas feitas lá.


15

Um breve resumo para exclusão rápida da fila com todos os valores padrão do host que está executando o servidor RMQ:

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

Para excluir todas as filas que correspondem a um padrão em um determinado vhost (por exemplo, contendo 'amq.gen' no vhost raiz):

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

10

Outra opção seria habilitar o management_plugin e conectar-se a ele por meio de um navegador. Você pode ver todas as filas e informações sobre elas. É possível e simples excluir filas desta interface.


Eu fiz isso, mas meu management_plugin está em um estado diferente da minha interface de linha de comando
Sweet Chilly Philly

9

Eu generalizei o método JavaScript / jQuery de Piotr Stapp um pouco mais, encapsulando-o em uma função e generalizando-o um pouco.

Esta função usa a API RabbitMQ HTTP para consultar as filas disponíveis em um determinado vhoste excluí-las com base em um opcional 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)}
                });
            });
        }
    });
};

Depois de colar esta função no console JavaScript do seu navegador enquanto estiver na página de gerenciamento do RabbitMQ, você pode usá-la assim:

Exclua todas as filas em '/' vhost

deleteQueues('/');

Exclua todas as filas em '/' vhost começando com 'test'

deleteQueues('/', 'test');

Exclua todas as filas em 'dev' vhost começando com 'foo'

deleteQueues('dev', 'foo');

Use por sua própria conta e risco!


1
Isso funcionou perfeitamente para remover um grande número de filas com o mesmo prefixo usando apenas o web-admin. Obrigado!
espenoh

6

O plugin de gerenciamento (interface da web) fornece um link para um script python. Você pode usá-lo para excluir filas. Usei este padrão para remover muitas filas:

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

Eu uso este alias em .profile:

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

onde qclean.pytem o seguinte código:

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

Essencialmente, esta é uma versão iterativa do código de Shweta B. Patil.



5

Espero que possa ajudar alguém.

Tentei os trechos de código acima, mas não fiz nenhum streaming.

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

Eu gero um arquivo que contém todos os nomes de filas e faço um loop, linha por linha, para excluí-los. Para os loops, while read ...não fez isso para mim. Ele sempre parava no primeiro nome da fila.

Além disso, se você deseja excluir uma única fila, as soluções acima irão ajudar (python, Java ...) e também do sudo rabbitmqctl delete_queue queue_name. Estou usando em rabbitmqctlvez de rabbitmqadmin.


4

Com o plug-in rabbitmq_management instalado, você pode executá-lo para excluir todas as filas indesejadas:

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

Vamos quebrar o comando:

rabbitmqctl list_queues -p vhost_name irá listar todas as filas e quantas tarefas eles têm atualmente.

grep -v "fast\|medium\|slow"irá filtrar as filas que você não deseja excluir, digamos que queremos excluir todas as filas sem as palavras rápido , médio ou lento .

tr "[:blank:]" " " irá normalizar o delimitador em rabbitmqctl entre o nome da fila e a quantidade de tarefas que existem

cut -d " " -f 1irá dividir cada linha pelo espaço em branco e escolher a 1ª coluna (o nome da fila)

xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{}pegará o nome da fila e o definirá onde definimos o {}caractere, excluindo todas as filas não filtradas no processo.

Certifique-se de que o usuário utilizado tenha permissões de administrador.


Agradecimentos a @phriscage pela inspiração :)
Hassek

2

Fiz de forma diferente, pois só tinha acesso à página de gerenciamento. Criei um "snippet" simples que exclui filas em Javascript. Aqui está:

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

Todas as minhas filas estavam no formato: PREFIX_0001 a PREFIX_0XXX

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.