這兩天研究了一下,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 能夠看到友善的管理界面...