การลบคิวใน RabbitMQ


93

ฉันมีคิวสองสามคิวที่ทำงานกับ RabbitMQ ตอนนี้มีบางส่วนที่ไม่มีประโยชน์แล้วฉันจะลบออกได้อย่างไร น่าเสียดายที่ฉันไม่ได้ตั้งค่าauto_deleteตัวเลือก

ถ้าตั้งตอนนี้จะลบไหม

ตอนนี้มีวิธีลบคิวเหล่านั้นหรือไม่?

คำตอบ:


121

หากคุณไม่สนใจข้อมูลในฐานข้อมูลการจัดการ เช่นusers, vhosts, messagesฯลฯ และไม่เกี่ยวกับคนอื่น ๆqueuesแล้วคุณสามารถresetผ่าน commandline โดยการเรียกใช้คำสั่งต่อไปในการสั่งซื้อ:

คำเตือน:นอกจากคิวแล้วสิ่งนี้จะลบใด ๆusersและvhostsคุณได้กำหนดค่าบนเซิร์ฟเวอร์ RabbitMQ ของคุณด้วย และจะลบถาวรใด ๆmessages

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

เอกสาร rabbitmqบอกว่าresetคำสั่ง:

ส่งคืนโหนด RabbitMQ เป็นสถานะบริสุทธิ์

ลบโหนดออกจากคลัสเตอร์ใด ๆ ที่เป็นสมาชิกลบข้อมูลทั้งหมดออกจากฐานข้อมูลการจัดการเช่นผู้ใช้ที่กำหนดค่าและ vhosts และลบข้อความที่มีอยู่ทั้งหมด

ดังนั้นโปรดใช้ความระมัดระวัง


46
คำเตือน: การดำเนินการนี้จะลบผู้ใช้และ vhost ที่คุณกำหนดค่าไว้บนเซิร์ฟเวอร์กระต่ายของคุณด้วย ฉันพบสิ่งนี้เป็นวิธีที่ยาก :)
mafrosis

อ๊ะขออภัยด้วย ฉันไม่ได้สังเกตเห็นมันตั้งแต่ฉันมีการกำหนดค่าพื้นฐานจริงๆในเวลาที่ฉันเกี่ยวข้องกับ rabbitmq ฉันจะอัปเดตคำตอบ ขอบคุณ!
Faruk Sahin

3
นี่เป็นคำตอบที่ยอดเยี่ยมจริงๆ คุณยังสามารถพูดว่า "ปิดเซิร์ฟเวอร์และล้างดิสก์" เพื่อ "ลบ" คิว
RubyT TuesdayDONO

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 Installer สำหรับ setuptools

> 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

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 / ล็อกอินเข้าสู่เซิร์ฟเวอร์ที่คุณติดตั้ง rabbit ไว้คุณสามารถดาวน์โหลดได้จาก:

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** และมี minumum เปล่า

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

แก้ไข: ตามความคิดเห็นของ @ user299709 อาจเป็นประโยชน์ที่จะชี้ให้เห็นว่าผู้ใช้ต้องถูกแท็กเป็น 'ผู้ดูแลระบบ' ในกระต่าย ( https://www.rabbitmq.com/management.html )


สิ่งนี้ส่งคืน "ไม่สามารถเชื่อมต่อ: [Errno 111] การเชื่อมต่อถูกปฏิเสธ" สำหรับฉันวิธีใดในการดีบักเพื่อดูว่าเกิดอะไรขึ้น
user299709

ตรวจสอบบันทึกการตรวจสอบสิทธิ์บันทึกกระต่าย ... ผู้ใช้อาจไม่ได้รับอนุญาตให้ทำงานกับ VHost ... เลิกยากที่จะบอกว่าจะเริ่มที่ไหน
Lukino

วิธีแก้ปัญหาคือการตั้งค่าผู้ใช้ด้วยแท็ก 'ผู้ดูแลระบบ'
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 หากคุณตั้งค่าการลบอัตโนมัติเป็นเท็จการเรียกใช้คิวประกาศอีกครั้งด้วยการลบอัตโนมัติจริงจะทำให้เกิดข้อผิดพลาดเล็กน้อยและนายหน้าจะปิดช่องนั้น

คุณต้องใช้que.delete ทันทีเพื่อที่จะลบมัน

ดูรายละเอียดในเอกสาร API:

หากคุณใช้ไคลเอนต์อื่นคุณจะต้องหาวิธีการที่เทียบเท่ากัน เนื่องจากเป็นส่วนหนึ่งของโปรโตคอลจึงควรอยู่ที่นั่นและอาจเป็นส่วนหนึ่งของ Channel หรือเทียบเท่า

คุณอาจต้องการดูเอกสารที่เหลือโดยเฉพาะในส่วนการเริ่มต้นใช้งานซึ่งครอบคลุมกรณีการใช้งานทั่วไปจำนวนมาก

สุดท้ายนี้หากคุณมีคำถามและหาคำตอบไม่ได้จากที่อื่นคุณควรลองโพสต์ในรายชื่อเมลของ RabbitMQ Discuss นักพัฒนาพยายามอย่างเต็มที่เพื่อตอบทุกคำถามที่ถามที่นั่น


10

อีกทางเลือกหนึ่งคือการเปิดใช้งาน management_plugin และเชื่อมต่อผ่านเบราว์เซอร์ คุณสามารถดูคิวและข้อมูลเกี่ยวกับคิวทั้งหมดได้ เป็นไปได้และง่ายในการลบคิวจากอินเทอร์เฟซนี้


ฉันทำสิ่งนี้แล้ว แต่ management_plugin ของฉันอยู่ในสถานะที่แตกต่างจากอินเทอร์เฟซบรรทัดคำสั่งของฉัน
Sweet Chilly Philly

9

ฉันได้กำหนดวิธีการ JavaScript / jQuery ของ Piotr Stapp ให้กว้างขึ้นอีกเล็กน้อยโดยห่อหุ้มให้เป็นฟังก์ชันและสรุปให้เป็นส่วนหนึ่ง

ฟังก์ชันนี้ใช้ 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()

โดยพื้นฐานแล้วนี่คือรหัสรุ่นซ้ำของ Shweta B. Patil


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 สำหรับแรงบันดาลใจ :)
Hassek

2

ฉันทำวิธีที่แตกต่างออกไปเพราะฉันเข้าถึงหน้าเว็บการจัดการเท่านั้น ฉันสร้าง "snippet" แบบธรรมดาซึ่งจะลบคิวใน 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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.