猿问

连接到OpenStack中的RabbitMQ代理

OpenStack使用RabbitMQ作为消息传递系统。为此有多个交换和队列。我发现用于消息传输的名为“ topic”类型的名为“ nova”的交换。Exchange使用路由键将邮件路由到队列(http://www.rabbitmq.com/tutorials/amqp-concepts.html)。 (位于http://www.rabbitmq.com/img/tutorials/intro/hello-world-example-routing.png的有用图片-信誉不足,无法在此处发布) OpenStack中有多个队列,例如计算,证书,网络等。他们使用具有相同名称的路由密钥。因此,我使用这些路由键创建了几个新队列,以将它们与处理消息的使用者绑定在一起。例如,存在一个名为“计算”的队列,该队列使用名为“计算”的路由键。我创建了使用相同路由键的新队列“ 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

工作正常 但是我只收到网络队列的消息。我不知道还有其他消息,但看起来好像还有。我对吗?还是出了什么问题?还有其他消息,我该如何获取?


阿晨1998
浏览 182回答 2
2回答

人到中年有点甜

该代码在此开发周期中正在进行一些积极的更改,但此刻我断言您正在深入研究。对于大多数nova组件,队列接口是在这些组件使用的RPC公共库下面抽象出来的,该库选择主题和队列。特别是,当RPC代码要将消息发送到特定的计算,网络或存储主机时,主题也可以是特定于主机的。您在上面看到的唯一消息是常规广播消息,实际上,通常是对浮动IP地址信息的请求。如果您想要一个示例,将所有消息都挂在队列中,则绝对应该查看Ceilometer,它旨在实现此目的,并利用也嵌入在nova和相关组件中的通知系统。它不会像拦截和解释新星,网络和煤渣消息那样为您提供相同的东西-如果有用的话,这取决于您的总体目标。

紫衣仙女

在queues_params中的routing_key中,您指定了“ network”,这就是为什么仅接收网络消息的原因。您可以使用通配符routing_key“#”捕获与相应主题交换关联的所有消息。如果可以的话,您可以看到我的备忘。
随时随地看视频慕课网APP

相关分类

Python
我要回答