Xóa hàng đợi trong RabbitMQ


93

Tôi có một vài hàng đợi đang chạy với RabbitMQ. Một vài trong số chúng bây giờ không sử dụng, làm thế nào tôi có thể xóa chúng? Thật không may, tôi đã không thiết lập auto_deletetùy chọn.

Nếu tôi đặt nó bây giờ, nó có bị xóa không?

Có cách nào để xóa những hàng đợi đó bây giờ không?

Câu trả lời:


121

Nếu bạn không quan tâm đến dữ liệu trong cơ sở dữ liệu quản lý; tức là users, vhosts, messagesvv, và không phải về khác queues, sau đó bạn có thể resetthông qua dòng lệnh bằng cách chạy các lệnh sau theo thứ tự:

CẢNH BÁO: Ngoài các hàng đợi, điều này cũng sẽ xóa bất kỳ usersvhostsbạn đã định cấu hình trên máy chủ RabbitMQ của mình; và sẽ xóa bất kỳmessages

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

Các tài liệu RabbitMQ nói rằng resetlệnh:

Trả một nút RabbitMQ về trạng thái nguyên thủy của nó.

Xóa nút khỏi bất kỳ cụm nào mà nó thuộc về, xóa tất cả dữ liệu khỏi cơ sở dữ liệu quản lý, chẳng hạn như người dùng và vhosts đã định cấu hình, đồng thời xóa tất cả các thông báo liên tục.

Vì vậy, hãy cẩn thận khi sử dụng nó.


46
CẢNH BÁO: thao tác này cũng sẽ xóa mọi người dùng và vhosts bạn đã định cấu hình trên máy chủ thỏ của mình. Tôi thấy điều này ra cách cứng :)
mafrosis

Rất tiếc, xin lỗi về điều đó. Tôi đã không nhận thấy nó vì tôi đã có một cấu hình thực sự cơ bản vào thời điểm tôi tham gia vào Rabbitmq. Tôi sẽ cập nhật câu trả lời. Cảm ơn!
Faruk Sahin,

3
đây là một câu trả lời thực sự cực đoan. bạn cũng có thể nói "tắt máy chủ và xóa đĩa" để "xóa" hàng đợi.
RubyTuesdayDONO

30
import pika

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

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

connection.close()

Cài đặt gói pika như sau

$ sudo pip install pika==0.9.8

Việc cài đặt phụ thuộc vào gói pip và git-core, bạn có thể cần cài đặt chúng trước.

Trên Ubuntu:

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

Trên Debian:

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

Trên Windows: Để cài đặt easy_install, hãy chạy MS Windows Installer cho các công cụ thiết lập

> easy_install pip
> pip install pika==0.9.8

Chắc chắn dễ dàng hơn cho những người đã làm việc với pika, thanks a lot
m.raynal

27

Trong các phiên bản RabbitMQ> 3.0, bạn cũng có thể sử dụng API HTTP nếu plugin Rabbitmq_management được bật. Chỉ cần đảm bảo đặt loại nội dung thành 'application / json' và cung cấp vhost và tên hàng đợi:

IE Sử dụng curl với vhost 'test' và tên hàng đợi '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
Đảm bảo rằng người dùng của bạn được gắn thẻ administratornếu không họ không thể sử dụng các phần nhất định của API.
ubershmekel

1
Tôi nhận được: $ 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 Tuy nhiên hàng đợi vẫn :( - bất kỳ ý tưởng?
Hackeron

23

Rabbitmqadmin rất hay khi hoạt động từ bảng điều khiển.

Nếu bạn ssh / đăng nhập vào máy chủ mà bạn đã cài đặt thỏ, bạn có thể tải xuống từ:

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

và lưu nó vào / usr / local / bin / Rabbitmqadmin

Sau đó, bạn có thể chạy

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

Thông thường nó yêu cầu sudo.

Nếu bạn muốn tránh nhập tên người dùng và mật khẩu của mình, bạn có thể sử dụng cấu hình

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

Tất cả điều đó với giả định rằng bạn có tệp ** /var/lib/rabbitmq/.rabbitmqadmin.conf** và có tối thiểu

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

CHỈNH SỬA: Theo nhận xét từ @ user299709, có thể hữu ích khi chỉ ra rằng người dùng phải được gắn thẻ là 'quản trị viên' trong thỏ. ( https://www.rabbitmq.com/management.html )


điều này trả về `Không thể kết nối: [Errno 111] Kết nối bị từ chối` cho tôi bất kỳ cách nào để gỡ lỗi xem điều gì đang xảy ra?
user299709

Kiểm tra auth các bản ghi, bản ghi thỏ ... tài khoản có thể không có quyền làm việc trên vhost ... Quit khó để nói bắt đầu từ đâu
Lukino

giải pháp đang đặt người dùng với thẻ 'quản trị viên'
user299709

16

Một bản tóm tắt ngắn để xóa hàng đợi nhanh chóng với tất cả các giá trị mặc định từ máy chủ đang chạy máy chủ RMQ:

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

Để xóa tất cả các hàng đợi khớp với một mẫu trong một vhost đã cho (ví dụ: chứa 'amq.gen' trong vhost gốc):

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

15

Bạn khẳng định rằng hàng đợi tồn tại (và tạo hàng đợi nếu không) bằng cách sử dụng queue.declare . Nếu ban đầu bạn đặt tự động xóa thành false, việc gọi lại queue.declare với autodelete true sẽ dẫn đến lỗi mềm và nhà môi giới sẽ đóng kênh.

Bạn cần sử dụng queue.delete ngay bây giờ để xóa nó.

Xem tài liệu API để biết chi tiết:

Nếu bạn sử dụng một ứng dụng khách khác, bạn sẽ cần tìm phương pháp tương đương. Vì nó là một phần của giao thức, nên nó sẽ ở đó, và nó có thể là một phần của Channel hoặc tương đương.

Bạn cũng có thể muốn xem phần còn lại của tài liệu, đặc biệt là phần Bắt đầu sử dụng bao gồm nhiều trường hợp sử dụng phổ biến.

Cuối cùng, nếu bạn có một câu hỏi và không thể tìm thấy câu trả lời ở nơi khác, bạn nên thử đăng lên danh sách gửi thư của RabbitMQ Discuss . Các nhà phát triển cố gắng hết sức để trả lời tất cả các câu hỏi được hỏi ở đó.


10

Một tùy chọn khác là kích hoạt management_plugin và kết nối với nó qua trình duyệt. Bạn có thể xem tất cả các hàng đợi và thông tin về chúng. Có thể và đơn giản để xóa hàng đợi khỏi giao diện này.


Tôi đã làm điều này nhưng management_plugin của tôi là ở tiểu bang khác hơn giao diện dòng lệnh của tôi
Ngọt Chilly Philly

9

Tôi đã khái quát phương thức JavaScript / jQuery của Piotr Stapp xa hơn một chút, gói nó thành một hàm và tổng quát hóa nó một chút.

Hàm này sử dụng API RabbitMQ HTTP để truy vấn các hàng đợi có sẵn trong một hàng nhất định vhost, sau đó xóa chúng dựa trên một tùy chọn 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)}
                });
            });
        }
    });
};

Sau khi bạn dán hàm này vào bảng điều khiển JavaScript của trình duyệt khi ở trên trang quản lý RabbitMQ, bạn có thể sử dụng nó như sau:

Xóa tất cả hàng đợi trong '/' vhost

deleteQueues('/');

Xóa tất cả các hàng đợi trong '/' vhost bắt đầu bằng 'test'

deleteQueues('/', 'test');

Xóa tất cả các hàng đợi trong 'dev' vhost bắt đầu bằng 'foo'

deleteQueues('dev', 'foo');

Vui lòng sử dụng điều này có nguy cơ của riêng bạn!


1
Điều này hoạt động hoàn hảo để loại bỏ một số lượng lớn các hàng đợi có cùng tiền tố chỉ sử dụng quản trị viên web. Cảm ơn!
espenoh 29/02/16

6

Plugin quản lý (giao diện web) cung cấp cho bạn một liên kết đến một tập lệnh python. Bạn có thể sử dụng nó để xóa hàng đợi. Tôi đã sử dụng mẫu này để loại bỏ rất nhiều hàng đợi:

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

Tôi sử dụng bí danh này trong .profile:

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

nơi qclean.pycó mã sau:

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

Về cơ bản, đây là phiên bản lặp đi lặp lại của mã Shweta B. Patil.


5

Tải về

$ sudo rabbitmq-plugins enable rabbitmq_management

và truy cập http: // localhost: 15672 / # / queues nếu bạn đang sử dụng localhost. mật khẩu mặc định sẽ là username: guest, password: guest và chuyển đến tab hàng đợi và xóa hàng đợi.


Người đàn ông ... cảm ơn rất nhiều. Tôi thấy câu trả lời của bạn rất hữu ích.
bereket gebredingle

5

Hy vọng rằng nó có thể giúp một ai đó.

Tôi đã thử các đoạn mã trên nhưng tôi không thực hiện bất kỳ luồng nào.

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

Tôi tạo một tệp chứa tất cả các tên hàng đợi và lặp qua nó từng dòng một để xóa chúng. Đối với các vòng lặp,while read ... không làm điều đó cho tôi. Nó luôn dừng lại ở tên hàng đợi đầu tiên.

Ngoài ra, nếu bạn muốn xóa một hàng đợi duy nhất, các giải pháp trên sẽ hữu ích (python, Java ...) và cả do sudo rabbitmqctl delete_queue queue_name. Tôi đang sử dụng rabbitmqctlthay vì rabbitmqadmin.


4

Với plugin Rabbitmq_management được cài đặt, bạn có thể chạy nó để xóa tất cả các hàng đợi không mong muốn:

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

Hãy chia nhỏ lệnh:

rabbitmqctl list_queues -p vhost_name sẽ liệt kê tất cả các hàng đợi và chúng hiện có bao nhiêu nhiệm vụ.

grep -v "fast\|medium\|slow"sẽ lọc các hàng đợi bạn không muốn xóa, giả sử chúng tôi muốn xóa mọi hàng đợi mà không có các từ nhanh , trung bình hoặc chậm .

tr "[:blank:]" " " sẽ bình thường hóa dấu phân cách trên Rabbitmqctl giữa tên của hàng đợi và số lượng nhiệm vụ có

cut -d " " -f 1sẽ chia từng dòng theo khoảng trắng và chọn cột đầu tiên (tên hàng đợi)

xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{}sẽ chọn tên hàng đợi và sẽ đặt nó thành nơi chúng tôi đặt {}ký tự xóa tất cả hàng đợi không được lọc trong quy trình.

Đảm bảo rằng người dùng được sử dụng có quyền của quản trị viên.


Cảm ơn @phriscage vì đã truyền cảm hứng :)
Hassek

2

Tôi đã làm theo cách khác, vì tôi chỉ có quyền truy cập vào trang web quản lý. Tôi đã tạo "đoạn mã" đơn giản để xóa hàng đợi trong Javascript. Nó đây:

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

Tất cả hàng đợi của tôi có định dạng: PREFIX_0001 đến PREFIX_0XXX

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.