这两天研究了一下,OpenStack的工作原理,并着重调研了一下RabbitMQ在OpenStack中扮演的角色。
首先,OpenStack中模块Volume Control、Network Controller、ComputeController以及Scheduler之间的通信是通过AMQP协议实现,消息由RabbitMQ作为中间件转发,以一种RPC(Remote Process Call)的方式进行的。具体可见图
其中用户在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中实现的核心思想,具体图示如下:
其中Invoker可以看做Nova.api,发出指令,这里TopicConsumer会以一个subscriber的身份注册到相应队列上,当队列有消息过来时,会及时Push给Consumer,当Worker处理完成,则会返回结果,以Direct方式(即双方Routing Key相同且唯一)回复给Invoker,完成RPC全部流程。
其实针对于OpenStack而言,RabbitMQ并不是唯一选择,任何基于AMQP协议的消息队列都可以作为该中间件存在于OpenStack之中。
由于上文提到了以Topic方式进行消息分配(exchange),这里就对RabbitMQ的消息分配模式进行简单介绍:
1、Direct Exchange queue绑定到exchange上,发送与接收方(订阅该Queue)必须使用一个完全相同的Routing Key才行
2、Fanout Exchange 不关心Routingkey是什么,只要Queue与该exchange绑定,接收方(订阅该Queue)就会收到该消息。
3、Topic Exchange 对Routing key进行加工,引入了两个符号* #,*匹配任意一个词,#可匹配一个或多个词,这样queues以一个高级的Routing Key命名方式与exchange绑定,针对自己感兴趣的Topic进行订阅。
这样我们就明白了为何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 可以看到友善的管理界面...
来源:oschina
链接:https://my.oschina.net/u/138210/blog/157249