Menghapus antrian di RabbitMQ

93

Saya memiliki beberapa antrian yang berjalan dengan RabbitMQ. Beberapa di antaranya tidak berguna sekarang, bagaimana cara menghapusnya? Sayangnya saya belum mengatur auto_deleteopsi.

Jika saya mengaturnya sekarang, apakah akan dihapus?

Apakah ada cara untuk menghapus antrian tersebut sekarang?

Phalgun
sumber

Jawaban:

121

Jika Anda tidak peduli dengan data dalam database manajemen; yaitu users, vhosts, messagesdll, dan tidak tentang lainnya queues, maka Anda dapat resetmelalui commandline dengan menjalankan perintah berikut agar:

PERINGATAN: Selain antrian, ini juga akan menghapus semua usersdan vhosts, Anda telah mengkonfigurasi di server RabbitMQ Anda; dan akan menghapus persistenmessages

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

The dokumentasi RabbitMQ mengatakan bahwa resetperintah:

Mengembalikan node RabbitMQ ke status perawannya.

Menghapus node dari cluster mana pun yang dimilikinya, menghapus semua data dari database manajemen, seperti pengguna dan vhost yang dikonfigurasi, dan menghapus semua pesan yang ada.

Jadi berhati-hatilah saat menggunakannya.

Faruk Sahin
sumber
46
PERINGATAN: ini juga akan menghapus semua pengguna dan vhost yang telah Anda konfigurasikan di server kelinci Anda. Saya menemukan ini dengan cara yang sulit :)
mafrosis
Ups, maaf soal itu. Saya tidak menyadarinya karena saya memiliki konfigurasi yang sangat dasar pada saat saya terlibat dengan rabbitmq. Saya akan memperbarui jawabannya. Terima kasih!
Faruk Sahin
3
ini adalah jawaban yang sangat ekstrim. Anda juga bisa mengatakan "matikan server dan hapus disk" untuk "menghapus" antrian.
RubyTuesdayDONO
30
import pika

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

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

connection.close()

Instal paket pika sebagai berikut

$ sudo pip install pika==0.9.8

Instalasi bergantung pada paket pip dan git-core, Anda mungkin perlu menginstalnya terlebih dahulu.

Di Ubuntu:

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

Di Debian:

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

Di Windows: Untuk menginstal easy_install, jalankan Penginstal MS Windows untuk alat pengaturan

> easy_install pip
> pip install pika==0.9.8
Shweta B. Patil
sumber
Jelas lebih mudah bagi mereka yang sudah bekerja dengan pika, terima kasih banyak
m.raynal
27

Di RabbitMQ versi> 3.0, Anda juga dapat menggunakan HTTP API jika plugin rabbitmq_management diaktifkan. Pastikan untuk mengatur tipe konten ke 'application / json' dan berikan vhost dan nama antrian:

IE Menggunakan curl dengan 'test' vhost dan nama antrian '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
sumber
1
Pastikan pengguna Anda diberi tag karena administratorjika tidak, mereka tidak dapat menggunakan bagian tertentu dari API.
ubershmekel
1
Saya mendapatkan: $ 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 Namun antriannya masih tetap :( - ada ide?
Hackeron
23

Ada rabbitmqadmin yang bagus untuk bekerja dari konsol.

Jika Anda ssh / masuk ke server tempat Anda memasang kelinci, Anda dapat mengunduhnya dari:

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

dan simpan ke / usr / local / bin / rabbitmqadmin

Lalu kamu bisa lari

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

Biasanya membutuhkan sudo.

Jika Anda ingin menghindari mengetik nama pengguna dan kata sandi, Anda dapat menggunakan config

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

Semua itu dengan asumsi Anda memiliki file ** /var/lib/rabbitmq/.rabbitmqadmin.conf** dan memiliki minumum telanjang

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

EDIT: Sebagai komentar dari @ user299709, mungkin berguna untuk menunjukkan bahwa pengguna harus ditandai sebagai 'administrator' pada kelinci. ( https://www.rabbitmq.com/management.html )

Lukino
sumber
ini mengembalikan `Tidak dapat terhubung: [Errno 111] Sambungan ditolak` bagi saya cara apa pun untuk men-debug untuk melihat apa yang terjadi?
pengguna299709
Periksa log auth, log kelinci ... Pengguna mungkin tidak memiliki izin untuk bekerja di VHost ... Tidak sulit untuk mengatakan dari mana harus memulai
Lukino
solusinya adalah menyetel pengguna dengan tag 'administrator'
user299709
16

Ringkasan singkat untuk penghapusan antrian cepat dengan semua nilai default dari host yang menjalankan server RMQ:

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

Untuk menghapus semua antrian yang cocok dengan pola di vhost tertentu (misalnya berisi 'amq.gen' di root vhost):

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

Anda menegaskan bahwa antrian ada (dan membuatnya jika tidak) dengan menggunakan queue.declare . Jika Anda awalnya menyetel hapus otomatis ke salah, memanggil queue.declare lagi dengan autodelete true akan menghasilkan kesalahan lunak dan broker akan menutup saluran.

Anda perlu menggunakan queue.delete sekarang untuk menghapusnya.

Lihat dokumentasi API untuk detailnya:

Jika Anda menggunakan klien lain, Anda harus menemukan metode yang setara. Karena itu bagian dari protokol, itu harus ada di sana, dan itu mungkin bagian dari Channel atau yang setara.

Anda mungkin juga ingin melihat dokumentasi lainnya, khususnya bagian Memulai yang mencakup banyak kasus penggunaan umum.

Terakhir, jika Anda memiliki pertanyaan dan tidak dapat menemukan jawabannya di tempat lain, Anda harus mencoba memposting di milis Diskusi RabbitMQ . Pengembang melakukan yang terbaik untuk menjawab semua pertanyaan yang diajukan di sana.

scvalex
sumber
10

Pilihan lainnya adalah mengaktifkan management_plugin dan menghubungkannya melalui browser. Anda dapat melihat semua antrian dan informasi tentang mereka. Anda dapat dan mudah menghapus antrian dari antarmuka ini.

robthewolf
sumber
Saya telah melakukan ini tetapi management_plugin saya berada dalam status yang berbeda dari antarmuka baris perintah saya
Sweet Chilly Philly
9

Saya telah menggeneralisasi metode JavaScript / jQuery Piotr Stapp sedikit lebih jauh, merangkumnya menjadi sebuah fungsi dan menggeneralisasikannya sedikit.

Fungsi ini menggunakan RabbitMQ HTTP API untuk menanyakan antrian yang tersedia di suatu tempat vhost, dan kemudian menghapusnya berdasarkan pilihan 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)}
                });
            });
        }
    });
};

Setelah Anda menempelkan fungsi ini di konsol JavaScript browser Anda saat berada di halaman manajemen RabbitMQ, Anda dapat menggunakannya seperti ini:

Hapus semua antrian di '/' vhost

deleteQueues('/');

Hapus semua antrian di '/' vhost yang diawali dengan 'test'

deleteQueues('/', 'test');

Hapus semua antrian di 'dev' vhost yang diawali dengan 'foo'

deleteQueues('dev', 'foo');

Silakan gunakan ini dengan resiko Anda sendiri!

Josh
sumber
1
Ini bekerja dengan sempurna untuk menghapus sejumlah besar antrian dengan awalan yang sama hanya menggunakan web-admin. Terima kasih!
espenoh
6

Plugin manajemen (antarmuka web) memberi Anda tautan ke skrip python. Anda dapat menggunakannya untuk menghapus antrian. Saya menggunakan pola ini untuk menghapus banyak antrian:

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
sumber
5

Saya menggunakan alias ini di .profile:

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

dimana qclean.pymemiliki kode berikut:

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

Pada dasarnya, ini adalah versi iteratif dari kode Shweta B. Patil.

Vladimir
sumber
5

Install

$ sudo rabbitmq-plugins enable rabbitmq_management

dan buka http: // localhost: 15672 / # / queues jika Anda menggunakan localhost. kata sandi default username: guest, password: guest dan pergi ke tab antrian dan hapus antrian.

zabusa
sumber
Man ... terima kasih banyak. Saya menemukan jawaban Anda sangat membantu.
bareket gebredingle
5

Semoga bisa membantu seseorang.

Saya mencoba potongan kode di atas tetapi saya tidak melakukan streaming apa pun.

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

Saya menghasilkan file yang berisi semua nama antrian dan mengulanginya baris demi baris untuk menghapusnya. Untuk loop, while read ...tidak melakukannya untuk saya. Itu selalu berhenti di nama antrian pertama.

Juga, jika Anda ingin menghapus satu antrian, solusi di atas akan membantu (python, Java ...) dan juga do sudo rabbitmqctl delete_queue queue_name. Saya menggunakan, rabbitmqctlbukan rabbitmqadmin.

Julien Nyambal
sumber
4

Dengan plugin rabbitmq_management terinstal, Anda dapat menjalankan ini untuk menghapus semua antrean yang tidak diinginkan:

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

Mari kita hancurkan perintahnya:

rabbitmqctl list_queues -p vhost_name akan mencantumkan semua antrian dan berapa banyak tugas yang mereka miliki saat ini.

grep -v "fast\|medium\|slow"akan memfilter antrian yang tidak ingin Anda hapus, katakanlah kita ingin menghapus setiap antrian tanpa kata cepat , sedang atau lambat .

tr "[:blank:]" " " akan menormalkan pembatas pada rabbitmqctl antara nama antrian dan jumlah tugas yang ada

cut -d " " -f 1akan membagi setiap baris dengan spasi dan memilih kolom pertama (nama antrian)

xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{}akan mengambil nama antrian dan akan mengaturnya ke tempat kita mengatur {}karakter menghapus semua antrian yang tidak disaring dalam proses.

Pastikan pengguna yang digunakan memiliki izin administrator.

Hassek
sumber
Terima kasih kepada @phriscage untuk inspirasinya :)
Hassek
2

Saya melakukannya dengan cara yang berbeda, karena saya hanya memiliki akses ke halaman web manajemen. Saya membuat "potongan" sederhana yang menghapus antrian di Javascript. Ini dia:

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

Semua antrian saya berformat: PREFIX_0001 hingga PREFIX_0XXX

Piotr Stapp
sumber
1

Saya kesulitan menemukan jawaban yang sesuai dengan kebutuhan saya untuk menghapus antrian secara manual di rabbigmq. Oleh karena itu saya pikir perlu disebutkan di utas ini bahwa dimungkinkan untuk menghapus satu antrian tanpa rabbitmqadminmenggunakan perintah berikut:

rabbitmqctl delete_queue <queue_name>
Valdemar Edvard Sandal Rolfsen
sumber