Eliminar colas en RabbitMQ

93

Tengo algunas colas ejecutándose con RabbitMQ. Algunos de ellos ya no sirven, ¿cómo puedo eliminarlos? Desafortunadamente no había configurado elauto_delete opción.

Si lo configuro ahora, ¿se eliminará?

¿Hay alguna forma de eliminar esas colas ahora?

Phalgun
fuente

Respuestas:

121

Si no le importan los datos de la base de datos de gestión; es decir users, vhosts, messagesetc., y ni de otro queues, entonces se puede reseta través de comandos ejecutando los siguientes comandos en orden:

ADVERTENCIA: Además de las colas, esto también eliminará cualquier usersy vhostsque haya configurado en su servidor RabbitMQ; y eliminará cualquier persistentemessages

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

La documentación de rabbitmq dice que el resetcomando:

Devuelve un nodo RabbitMQ a su estado virgen.

Elimina el nodo de cualquier clúster al que pertenece, elimina todos los datos de la base de datos de administración, como los usuarios configurados y vhosts, y elimina todos los mensajes persistentes.

Por lo tanto, tenga cuidado al usarlo.

Faruk Sahin
fuente
46
ADVERTENCIA: esto también eliminará los usuarios y vhosts que haya configurado en su servidor Rabbit. Descubrí esto por las malas :)
mafrosis
Ups, perdón por eso. No lo he notado desde que tenía una configuración realmente básica en el momento en que estuve involucrado con rabbitmq. Actualizaré la respuesta. ¡Gracias!
Faruk Sahin
3
esta es una respuesta realmente extrema. también podría decir "apague el servidor y limpie el disco" para "eliminar" las colas.
RubyTuesdayDONO
30
import pika

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

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

connection.close()

Instale el paquete pika de la siguiente manera

$ sudo pip install pika==0.9.8

La instalación depende de los paquetes pip y git-core, es posible que deba instalarlos primero.

En Ubuntu:

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

En Debian:

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

En Windows: para instalar easy_install, ejecute MS Windows Installer para herramientas de configuración

> easy_install pip
> pip install pika==0.9.8
Shweta B. Patil
fuente
Definitivamente más fácil para aquellos que ya trabajan con pika, muchas gracias
m.raynal
27

En las versiones de RabbitMQ> 3.0, también puede utilizar la API HTTP si el complemento rabbitmq_management está habilitado. Solo asegúrese de establecer el tipo de contenido en 'application / json' y proporcione el vhost y el nombre de la cola:

IE Usando curl con un vhost 'test' y un nombre de cola '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
phriscage
fuente
1
Asegúrese de que su usuario esté etiquetado, ya administratorque de lo contrario no podrá utilizar determinadas partes de la API.
ubershmekel
1
Estoy recibiendo: $ 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 Sin embargo, la cola aún permanece :( - ¿
Alguna
23

Hay rabbitmqadmin que es bueno para trabajar desde la consola.

Si ssh / inicia sesión en el servidor donde tiene Rabbit instalado, puede descargarlo desde:

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

y guárdelo en / usr / local / bin / rabbitmqadmin

Entonces puedes correr

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

Por lo general, requiere sudo.

Si desea evitar escribir su nombre de usuario y contraseña, puede usar config

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

Todo eso bajo el supuesto de que tiene el archivo ** /var/lib/rabbitmq/.rabbitmqadmin.conf** y tiene un mínimo mínimo

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

EDITAR: A partir del comentario de @ user299709, podría ser útil señalar que el usuario debe estar etiquetado como 'administrador' en rabbit. ( https://www.rabbitmq.com/management.html )

Lukino
fuente
esto devuelve `No se pudo conectar: ​​[Errno 111] Conexión rechazada` para mí alguna forma de depurar para ver qué está pasando?
user299709
Verifique los registros de autenticación, registros de conejo ... Es posible que el usuario no tenga permiso para trabajar en VHost ... Salga difícil de decir por dónde empezar
Lukino
la solución fue configurar al usuario con la etiqueta 'administrador'
user299709
16

Un breve resumen para la eliminación rápida de la cola con todos los valores predeterminados del host que ejecuta el servidor RMQ:

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

Para eliminar todas las colas que coinciden con un patrón en un vhost dado (por ejemplo, que contienen 'amq.gen' en el vhost raíz):

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

Usted afirma que existe una cola (y la crea si no existe) utilizando queue.declare . Si originalmente configuró la eliminación automática en falso, volver a llamar a queue.declare con autodelete verdadero dará como resultado un error leve y el corredor cerrará el canal.

Debe usar queue.delete ahora para eliminarlo.

Consulte la documentación de la API para obtener más detalles:

Si usa otro cliente, deberá encontrar el método equivalente. Dado que es parte del protocolo, debería estar allí, y probablemente sea parte de Channel o su equivalente.

Es posible que también desee echar un vistazo al resto de la documentación, en particular, la Guía de inicio sección , que cubre muchos casos de uso comunes.

Finalmente, si tiene una pregunta y no puede encontrar la respuesta en otro lugar, debería intentar publicarla en la lista de distribución de RabbitMQ Discuss . Los desarrolladores hacen todo lo posible para responder a todas las preguntas que se hacen allí.

scvalex
fuente
10

Otra opción sería habilitar management_plugin y conectarse a él a través de un navegador. Puede ver todas las colas e información sobre ellas. Es posible y sencillo eliminar las colas de esta interfaz.

robthewolf
fuente
He hecho esto, pero mi management_plugin está en un estado diferente al de mi interfaz de línea de comandos
Sweet Chilly Philly
9

He generalizado un poco más el método JavaScript / jQuery de Piotr Stapp, encapsulándolo en una función y generalizándolo un poco.

Esta función utiliza la API HTTP de RabbitMQ para consultar las colas disponibles en un determinado vhosty luego eliminarlas según un 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)}
                });
            });
        }
    });
};

Una vez que pegue esta función en la consola de JavaScript de su navegador mientras está en su página de administración de RabbitMQ, puede usarla así:

Eliminar todas las colas en '/' vhost

deleteQueues('/');

Elimine todas las colas en '/' vhost que comienzan con 'prueba'

deleteQueues('/', 'test');

Elimina todas las colas en 'dev' vhost que comienzan con 'foo'

deleteQueues('dev', 'foo');

¡Utilice esto bajo su propio riesgo!

Josh
fuente
1
Esto funcionó perfectamente para eliminar una gran cantidad de colas con el mismo prefijo usando solo el administrador web. ¡Gracias!
espenoh
6

El complemento de administración (interfaz web) le brinda un enlace a un script de Python. Puede usarlo para eliminar colas. Usé este patrón para eliminar muchas colas:

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
guettli
fuente
5

Yo uso este alias en .profile:

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

donde qclean.pytiene el siguiente 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()

Esencialmente, esta es una versión iterativa del código de Shweta B. Patil.

Vladimir
fuente
5

Instalar en pc

$ sudo rabbitmq-plugins enable rabbitmq_management

y vaya a http: // localhost: 15672 / # / queues si está utilizando localhost. la contraseña predeterminada será username: guest, password: guest vaya a la pestaña de colas y elimine la cola.

zabusa
fuente
Hombre ... muchas gracias. Encontré su respuesta muy útil.
bereket gebredingle
5

Con suerte, podría ayudar a alguien.

Probé las piezas de código anteriores pero no hice ninguna transmisión.

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

Genero un archivo que contiene todos los nombres de las colas y lo recorro línea por línea para eliminarlos. Para los bucleswhile read ... no lo hice por mí. Siempre se detenía en el primer nombre de la cola.

Además, si desea eliminar una sola cola, las soluciones anteriores ayudarán (python, Java ...) y también do sudo rabbitmqctl delete_queue queue_name. Estoy usando en rabbitmqctllugar de rabbitmqadmin.

Julien Nyambal
fuente
4

Con el complemento rabbitmq_management instalado, puede ejecutar esto para eliminar todas las colas no deseadas:

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

Analicemos el comando:

rabbitmqctl list_queues -p vhost_name enumerará todas las colas y cuántas tareas tienen actualmente.

grep -v "fast\|medium\|slow"filtrará las colas que no desea eliminar, digamos que queremos eliminar todas las colas sin las palabras rápido , medio o lento .

tr "[:blank:]" " " normalizará el delimitador en rabbitmqctl entre el nombre de la cola y la cantidad de tareas que hay

cut -d " " -f 1se divide cada línea por el espacio en blanco y recoger la primera columna (el nombre de la cola)

xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{}recogerá el nombre de la cola y lo colocará en el lugar donde configuramos el {}carácter eliminando todas las colas no filtradas en el proceso.

Asegúrese de que el usuario utilizado tenga permisos de administrador.

Hassek
fuente
Gracias a @phriscage por la inspiración :)
Hassek
2

Lo hice de otra manera, porque solo tenía acceso a la página web de administración. Creé un "fragmento" simple que elimina las colas en Javascript. Aquí 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 mis colas estaban en formato: PREFIX_0001 a PREFIX_0XXX

Piotr Stapp
fuente