1

OpenStack は、RabbitMQ をメッセージング システムとして使用します。この目的のために、いくつかの交換とキューがあります。「トピック」タイプの「nova」という名前の交換がメッセージ転送に使用されていることがわかりました。Exchange は、ルーティング キーを使用してメッセージをキューにルーティングします ( http://www.rabbitmq.com/tutorials/amqp-concepts.html )。 ( http://www.rabbitmq.com/img/tutorials/intro/hello-world-example-routing.pngの有用な画像- ここに投稿するには評判が不十分です) OpenStack には、compute、cert、network などのいくつかのキューがあります。同じ名前のルーティング キーを使用します。そこで、メッセージを処理するコンシューマーにバインドするために、これらのルーティング キーを使用していくつかの新しいキューを作成しました。たとえば、「compute」という名前のルーティング キーを使用する「compute」という名前のキューがあります。同じルーティング キーを使用する新しいキュー "my_compute" を作成しました。私はそれがうまくいくはずだと思うので、私はメッセージを受け取ります。

交換に接続し、キューとコンシューマーを作成するコードがいくつかあります。

def connect(params):
connection = kombu.Connection(hostname=params['host'])
exchange = kombu.entity.Exchange(name=params['exchange_name'],
                                 type=params['exchange_type'],
                                 durable=params['exchange_durable'],
                                 auto_delete=params['exchange_auto_delete'],
                                 internal=params['exchange_internal'])
queue_list = []
for queue in params['queues_params']:
queue_list.append(kombu.messaging.Queue(name=queue['name'],
                                        exchange=exchange,
                                        routing_key=queue['routing_key'],
                                        channel=connection.channel(),
                                        durable=queue['durable'],
                                        auto_delete=queue['auto_delete']))
consumer = kombu.messaging.Consumer(channel=connection.channel(),
                                    queues=queue_list, 
                                    no_ack=True,
                                    callbacks=[self._process_message])
consumer.consume()
return connection

引数「params」は、json ファイルから取得したマップです。

{
"host"                 : "xxx",
"exchange_name"        : "nova",
"exchange_type"        : "topic",
"exchange_durable"     : false,
"exchange_auto_delete" : false,
"exchange_internal"    : false,
"queues_params"        : [
    {
        "name"        : "my_compute",
        "routing_key" : "compute",
        "durable"     : false,
        "auto_delete" : false,
        "arguments"   : [ ]
    },
    {
        "name"        : "my_network",
        "routing_key" : "network",
        "durable"     : false,
        "auto_delete" : false,
        "arguments"   : [ ]
    },
    .
    .
    .

それは働いています。しかし、 network queue のメッセージしか取得しません。他にメッセージがあるかどうかはわかりませんが、あるようです。私は正しいですか?それとも何かが間違っていますか?他のメッセージはありますか?どうすれば入手できますか?

4

2 に答える 2

0

queues_params の routing_key で「ネットワーク」を指定したため、ネットワーク メッセージのみを受信して​​います。対応するトピック交換に関連付けられたすべてのメッセージをキャプチャするワイルドカード routing_key "#" を使用できます。よろしければ、これに関する私のメモをご覧ください。

于 2013-11-21T19:27:04.183 に答える
0

このコードは、この開発サイクルで積極的な変更が行われていますが、現時点では、少し詳しく調べていると思います。ほとんどの nova コンポーネントでは、キュー インターフェイスは、それらのコンポーネントが使用し、トピックとキューを選択する RPC 共通ライブラリの下で抽象化されています。

特に、RPC コードが特定のコンピューティング、ネットワーク、またはストレージ ホストにメッセージを送信する必要がある場合、トピックはホスト固有にすることもできます。上に表示される唯一のメッセージは、一般的なブロードキャスト メッセージです。実際には、多くの場合、フローティング IP アドレスに関する情報の要求になります。

キュー上のすべてのメッセージを引っ掛ける何かの例が必要な場合は、まさにそれを行うことを目的としており、nova および関連コンポーネントにも組み込まれている通知システムを活用する Ceilometer を確認する必要があります。nova、network、および cinder のメッセージを傍受して解釈するのと同じことを提供するわけではありません。それが役立つかどうかは、全体的な目標によって異なります。

于 2013-05-27T19:05:19.783 に答える