这两天研究了一下,OpenStack的工做原理,并着重调研了一下RabbitMQ在OpenStack中扮演的角色。 html
首先,OpenStack中模块Volume Control、Network Controller、ComputeController以及Scheduler之间的通讯是经过AMQP协议实现,消息由RabbitMQ做为中间件转发,以一种RPC(Remote Process Call)的方式进行的。具体可见图 api
其中用户在dashboard中进行的操做经过Nova.api、Glance.api等调用Volume、Network、ComputeController等模块,上图中是一个逻辑结构,能够看出这种基于RPC的松耦合调用能够不用关心某些模块是否在本机,Openstack的多个模块间能够轻易以分布式的方式解决。 分布式
以Nova为例,每个Nova服务都会在初期创建两个队列,两个队列同时与相同的exchange(名称叫作Nova、类型为Topic)绑定,可是两者的RoutingKey不一样也就是Topic不一样,格式分别为NODE-TYPE.NODE-ID以及NODE-TYPE,其两者功能也有所不一样,而且因为采用RPC结构,因此当操做完成,结果会以Direct的方式回复给服务调用方。该流程是RabbitMQ在Openstack中实现的核心思想,具体图示以下: server
其中Invoker能够看作Nova.api,发出指令,这里TopicConsumer会以一个subscriber的身份注册到相应队列上,当队列有消息过来时,会及时Push给Consumer,当Worker处理完成,则会返回结果,以Direct方式(即双方Routing Key相同且惟一)回复给Invoker,完成RPC所有流程。 htm
其实针对于OpenStack而言,RabbitMQ并非惟一选择,任何基于AMQP协议的消息队列均可以做为该中间件存在于OpenStack之中。 中间件
因为上文提到了以Topic方式进行消息分配(exchange),这里就对RabbitMQ的消息分配模式进行简单介绍: blog
一、Direct Exchange queue绑定到exchange上,发送与接收方(订阅该Queue)必须使用一个彻底相同的Routing Key才行 rabbitmq
二、Fanout Exchange 不关心Routingkey是什么,只要Queue与该exchange绑定,接收方(订阅该Queue)就会收到该消息。 队列
三、Topic Exchange 对Routing key进行加工,引入了两个符号* #,*匹配任意一个词,#可匹配一个或多个词,这样queues以一个高级的Routing Key命名方式与exchange绑定,针对本身感兴趣的Topic进行订阅。 ip
这样咱们就明白了为什么Openstack中用topic模式的缘由,拿Exchange Nova为例,这上面有六个queue与之绑定,分别是Network、Network.xxx、queue经过这些不一样的RoutingKey来获取不一样Topic的消息。
最后还要澄清几个概念
Connection:链接,是针对于RabbitMQ的AMQP客户端与之创建的,相似于一个DB的connection
Channel:在Connection基础上的轻量级的信道
Exchange、Queue、RoutingKey,下图很好的解释了三个名词的概念,这里以一个RoutingKey将Queue Binding到一个Exchange上,一个Exchange与一个Routingkey共同肯定了一个到达queue上的route。
rabbitmq的命令能够参考http://www.2cto.com/os/201206/137847.html?fw_key=20EAF9E5E8BB84D5
参考资料:
http://docs.openstack.org/developer/nova/devref/rpc.html
http://www.rabbitmq.com/getstarted.html
http://www.infoq.com/articles/AMQP-RabbitMQ
http://wenku.baidu.com/view/800285ea0975f46527d3e19b.html
http://en.wikipedia.org/wiki/RabbitMQ
http://sunjun041640.blog.163.com/blog/static/25626832201031822459205/
http://zhb1208.iteye.com/blog/1330658
代码:http://sillycat.iteye.com/blog/1579464
PS:
RabbitMQ的管理界面能够经过下面命令安装
/usr/lib/rabbitmq/lib/rabbitmq_server-2.7.1/sbin/rabbitmq-plugins enable rabbitmq-management
以后重启rabbitmq,登陆 http://server-name:55672 能够看到友善的管理界面