web-dev-qa-db-ja.com

Pikaでキューサイズを取得する(AMQP Python)

簡単な質問ですが、GoogleやPikaのオープンソースコードは役に立ちませんでした。 Pikaの現在のキューサイズ(アイテムカウンター)を照会する方法はありますか?

27
Sebastian

AMQPプロトコルでキューサイズを取得する方法は2つあります。 Queue.DeclareまたはBasic.Getのいずれかを使用できます。

Basic.Consumeを使用して到着したメッセージを消費している場合は、切断(タイムアウト)してキューを再宣言しない限り、この情報を取得できません。そうでない場合は、1つのメッセージを取得しますが、それを確認しないでください。 AMQPの新しいバージョンでは、メッセージをアクティブに再キューイングできます。

Pikaについては、詳細はわかりませんが、Python AMQPのクライアントは私の側のとげでした。必要な情報を取得するために、クラスにモンキーパッチを適用する必要があります。キューコンシューマーがタイムアウトできるようにして、レコード統計などの定期的な間隔で他のことを実行したり、キューにあるメッセージの数を調べたりできるようにします。

これを回避する別の方法は、あきらめて、Pipeクラスを使用してSudo rabbitmqctl list_queues -p my_vhostを実行することです。次に、出力を解析して、すべてのキューのサイズを見つけます。これを行う場合は、通常のSudoパスワードを要求しないように/etc/sudoersを構成する必要があります。

ピカの経験が豊富な人が、私が言ったすべてのことをどのように行うことができるかを指摘することでこれに答えることを祈ります。その場合、私はピカをダウンロードしてタイヤを蹴ります。しかし、それが起こらず、Pikaコードにモンキーパッチを適用するのが難しい場合は、haighaをご覧ください。それらのコードは、AMQPプロトコルに近いため、他のPython AMQPクライアントライブラリよりもはるかに単純であることがわかりました。

4
Michael Dillon

この質問は少し古いことは知っていますが、これはpikaでこれを行う例です。

AMQPとRabbitMQに関しては、すでにキューを宣言している場合は、 パッシブフラグ をオンにして、他のすべてのキューパラメータを同一に保ちながらキューを再宣言できます。この宣言への応答 declare-ok には、キュー内のメッセージの数が含まれます。

これがpika0.9.5の例です。

import pika

def on_callback(msg):
    print msg

params = pika.ConnectionParameters(
        Host='localhost',
        port=5672,
        credentials=pika.credentials.PlainCredentials('guest', 'guest'),
    )

# Open a connection to RabbitMQ on localhost using all default parameters
connection = pika.BlockingConnection(parameters=params)

# Open the channel
channel = connection.channel()

# Declare the queue
channel.queue_declare(
        callback=on_callback,
        queue="test",
        durable=True,
        exclusive=False,
        auto_delete=False
    )

# ...

# Re-declare the queue with passive flag
res = channel.queue_declare(
        callback=on_callback,
        queue="test",
        durable=True,
        exclusive=False,
        auto_delete=False,
        passive=True
    )
print 'Messages in queue %d' % res.method.message_count

これにより、以下が出力されます。

<Method(['frame_type=1', 'channel_number=1', "method=<Queue.DeclareOk(['queue=test', 'message_count=0', 'consumer_count=0'])>"])>
<Method(['frame_type=1', 'channel_number=1', "method=<Queue.DeclareOk(['queue=test', 'message_count=0', 'consumer_count=0'])>"])>
Messages in queue 0

message_countメンバーからメッセージの数を取得します。

34
mike

Pikaを使用してキューの長さを取得する方法は次のとおりです(ローカルホストでデフォルトのユーザーとパスワードを使用していることを考慮)q_nameをキュー名に置き換えます。

import pika
connection = pika.BlockingConnection()
channel = connection.channel()
q = channel.queue_declare(q_name)
q_len = q.method.message_count
11
Satty

PyRabbit を試しましたか?それはあなたが探しているもののように聞こえるget_queue_depth()method を持っています。

6
urschrei