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" : [ ]
},
.
.
.
它正在运作。但我只收到网络队列的消息。我不知道有没有其他消息,但它看起来有。我对吗?或者出了什么问题?还有其他消息,我怎样才能得到它们?
答案 0 :(得分:0)
这个代码在这个开发周期中正在经历一些积极的变化,但是现在我断言你看起来有点深刻了。对于大多数nova组件,队列接口在这些组件使用的RPC公共库下面被抽象出来,并选择主题和队列。
特别是,当RPC代码要将消息发送到特定的计算,网络或存储主机时,主题也可以是特定于主机的。您将在上面看到的唯一消息是一般广播消息,实际上通常会请求有关浮动IP地址的信息
如果你想要一个能够阻止队列中所有消息的例子,你一定要看看Ceilometer,它就是为了做到这一点,并利用同样嵌入到nova和相关组件中的通知系统。它不会为你提供拦截和解释新星,网络和煤渣信息的同样的东西 - 如果它有用的话,这取决于你的整体目标。
答案 1 :(得分:0)
在queues_params的routing_key中,您指定了“网络”,这就是您只接收网络消息的原因。您可以使用通配符routing_key“#”来捕获与相应主题交换关联的所有消息。如果愿意的话,你可以看到我的note。