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 노드를 원래 상태로 되돌립니다.

속한 클러스터에서 노드를 제거하고 구성된 사용자 및 가상 호스트와 같은 관리 데이터베이스에서 모든 데이터를 제거하며 모든 지속성 메시지를 삭제합니다.

따라서 사용에주의하십시오.


46
경고 : 이것은 또한 토끼 서버에서 구성한 모든 사용자 및 가상 호스트를 삭제합니다. 나는 이것을 어려운 방법으로 발견했다 :)
mafrosis

죄송합니다. 나는 rabbitmq에 참여했을 때 정말 기본적인 구성을 가지고 있었기 때문에 그것을 알아 차리지 못했습니다. 답변을 업데이트하겠습니다. 감사!
Faruk Sahin 2013 년

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

데비안 :

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

Windows : easy_install을 설치하려면 setuptools 용 MS Windows Installer를 실행하십시오.

> easy_install pip
> pip install pika==0.9.8

사람들에게 확실히 쉽게 이미 감사에게, 새앙 토끼와 함께 많은 작업
m.raynal

27

RabbitMQ 버전> 3.0에서 rabbitmq_management 플러그인이 활성화 된 경우 HTTP API를 사용할 수도 있습니다. content-type을 'application / json'으로 설정하고 가상 호스트 및 대기열 이름을 제공하십시오.

IE 가상 호스트 'test'및 큐 이름 'testqueue'와 함께 curl 사용 :

$ 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
사용자가 administratorAPI의 특정 부분을 사용할 수없는 태그가 지정되었는지 확인하십시오 .
ubershmekel 2014

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 이 있습니다 .

Rabbit이 설치된 서버에 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

인증 로그, 토끼 로그 확인 ... 사용자가 VHost에서 작업 할 권한이 없을 수 있습니다 ... 어디서부터 시작해야할지 말하기 어렵습니다.
Lukino

해결책은 'administrator'태그로 사용자를 설정하는 것이 었습니다
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로 설정 한 경우 autodelete true로 queue.declare를 다시 호출하면 소프트 오류가 발생하고 브로커가 채널을 닫습니다.

queue.delete 를 사용해야 합니다.삭제하려면 지금 합니다.

자세한 내용은 API 문서를 참조하세요.

다른 클라이언트를 사용하는 경우 동등한 방법을 찾아야합니다. 프로토콜의 일부이기 때문에 거기에 있어야하며 아마도 채널의 일부이거나 이와 동등한 것입니다.

나머지 문서, 특히 시작하기를 살펴볼 수도 있습니다. 많은 일반적인 사용 사례를 다루는 섹션을 살펴볼 수도 있습니다.

마지막으로 질문이 있고 다른 곳에서 답을 찾을 수없는 경우 RabbitMQ 토론 메일 링리스트 에 게시 해보세요 . 개발자는 모든 질문에 답하기 위해 최선을 다합니다.


10

또 다른 옵션은 management_plugin을 활성화하고 브라우저를 통해 연결하는 것입니다. 모든 대기열과 이에 대한 정보를 볼 수 있습니다. 이 인터페이스에서 대기열을 삭제하는 것이 가능하고 간단합니다.


나는이 일을했지만 내 management_plugin 내 명령 줄 인터페이스는 다른 상태에
달콤한 칠리 필라델피아

9

Piotr Stapp의 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)}
                });
            });
        }
    });
};

RabbitMQ 관리 페이지에서 브라우저의 JavaScript 콘솔에이 함수를 붙여 넣으면 다음과 같이 사용할 수 있습니다.

'/'가상 호스트의 모든 대기열 삭제

deleteQueues('/');

'test'로 시작하는 '/'가상 호스트의 모든 대기열을 삭제합니다.

deleteQueues('/', 'test');

'foo'로 시작하는 'dev'가상 호스트의 모든 대기열을 삭제합니다.

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

본질적으로 이것은 Shweta B. Patil 코드의 반복적 버전입니다.



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"삭제하고 싶지 않은 대기열을 필터링합니다. 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합니다
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 형식이었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.