在OpenStack中连接到RabbitMQ代理

时间:2013-05-27 10:39:42

标签: python queue rabbitmq messaging openstack

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”的队列使用名为“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"   : [ ]
    },
    .
    .
    .

它正在运作。但我只收到网络队列的消息。我不知道有没有其他消息,但它看起来有。我对吗?或者出了什么问题?还有其他消息,我怎样才能得到它们?

2 个答案:

答案 0 :(得分:0)

这个代码在这个开发周期中正在经历一些积极的变化,但是现在我断言你看起来有点深刻了。对于大多数nova组件,队列接口在这些组件使用的RPC公共库下面被抽象出来,并选择主题和队列。

特别是,当RPC代码要将消息发送到特定的计算,网络或存储主机时,主题也可以是特定于主机的。您将在上面看到的唯一消息是一般广播消息,实际上通常会请求有关浮动IP地址的信息

如果你想要一个能够阻止队列中所有消息的例子,你一定要看看Ceilometer,它就是为了做到这一点,并利用同样嵌入到nova和相关组件中的通知系统。它不会为你提供拦截和解释新星,网络和煤渣信息的同样的东西 - 如果它有用的话,这取决于你的整体目标。

答案 1 :(得分:0)

在queues_params的routing_key中,您指定了“网络”,这就是您只接收网络消息的原因。您可以使用通配符routing_key“#”来捕获与相应主题交换关联的所有消息。如果愿意的话,你可以看到我的note