1. 程式人生 > >OpenStack設計與實現(四)訊息匯流排(AMQP)

OpenStack設計與實現(四)訊息匯流排(AMQP)

在西方有一句諺語,叫做“Don’t Reinvent the Wheel!”。直譯過來就是不要在重新發明輪子了。也就是說我們應該避免做一些重複性的工作,如果一個東西別人已經做過了,那麼我們拿來直接用就行了,沒有必要重新制作,這一點在軟體開發裡尤為突出。所以在OpenStack的開發中也借鑑了這一思想,OpenStack利用了大量的現有庫,這加快了OpenStack的開發,使得開發人員可以集中精力研究難點。下面我們就來一起討論一下OpenStack的通用技術。

一、訊息匯流排

OpenStack的設計原則:專案之間通過RESTful API進行通訊;專案內部通過,不同服務程序之間通過訊息匯流排進行通訊。

這種設計思想保證了各個專案對外可以被不同型別的客戶端接受,同時也保證了內部專案通訊介面的可擴充套件性和可靠性,以支援大規模的部署。

軟體的開發經歷了三個階段,從最初的面向過程到面向物件,然後再到面向服務。在面向服務的軟體開發中,我們需要考慮的就是如何保持各個服務之間的通訊。這裡OpenStack借鑑了計算機硬體匯流排的思想,引入了訊息匯流排。一些服務向總線上傳送訊息,另一些服務從總線上獲取獲取訊息。

OpenStack利用開源庫實現了以下兩種型別的用於在內部服務進行之間的通訊。

(1)事件通知

某個服務程序可以把事件通知傳送到訊息總線上,該訊息總線上所有對此類事件感興趣的服務程序,都可以獲得此事件通知並進行進一步的處理,但是處理的結果不會返回給事件傳送者。

(2)遠端過程呼叫(RPC)

通過遠端呼叫,一個服務程序可以呼叫其他遠端服務程序的方法,並且有阻塞和非阻塞兩種方式。

OpenStack已經支援了一些常見的訊息匯流排,如下表。

名稱 特點
RabbitMQ 實現了AMQP的訊息中介軟體服務,支援多種協議閘道器和程式語言
Qpid Apache基金會下的頂層專案,實現了AMQP協議
ZeroMQ 開源的高效能非同步訊息庫,可以在沒有Server/Broker的情況下工作

二、AMQP的實現原理

OpenStack所支援的訊息匯流排型別中(上表),大部分是基於AMQP(Advanced Message Queuing Protocol)的,AMQP是一個非同步訊息傳遞所使用的開放的應用層協議規範,主要包括了訊息的導向、佇列、路由、可靠性和安全性。下面我們來詳細的學習一下AMQP的原理。

這裡寫圖片描述

如上圖所示,AMQP的主要參與者有以下幾個:

  • Producer:訊息的產生者
  • Comsumer:訊息的接收者
  • Exchange:交換部件,根據訊息的條件選擇不同的訊息接收者。
  • Queue:訊息佇列,暫時快取到達消費者的訊息
  • Server/Broker:實現了AMQP的中介軟體服務

訊息的傳遞過程:

1、產生

生產者伺服器程序產生訊息,訊息是由訊息頭和訊息體組成的,訊息頭指定了訊息的接收條件,即哪些接收者可以接收這條訊息。

2、交換(路由)

Exchange部件類似於網路中的路由器,負責將訊息轉發到合適的接收者那裡。在Exchange有一張表格,類似於路由表。在這張表中存放了所有的Queue的binding key,binding key的作用就是表示這個queue可以接收那些型別的訊息。同時每一個訊息頭中都攜帶著一個routing key,表示這條訊息可以被那些Queue接收。當一條訊息到達Exchange時,Exchange會遍歷這張表格,如果一個Queue的bing key與訊息的routing key相匹配,那麼就將訊息轉發到這個Queue。Exchange與路由器一樣,通過萬用字元也可以支援多播(組播)和廣播。

3、快取

Queue是接收者的快取部件,是為了防止消費者無法接收訊息,或者接收訊息的速度不夠快時訊息不會被新到的訊息覆蓋。Queue會把訊息快取在記憶體或磁碟上。

三、基於AMQPRPC的實現原理

基於AMQP的RPC實現

訊息傳送過程:

1、客戶端傳送一個請求訊息給Exchange,指定routing key為”op_queue“,同時指明一個訊息佇列名用來獲取響應,圖中為“res_queue”。

2、Exhange把此訊息轉發到訊息佇列op_queue。

3、訊息佇列op_queue把訊息推送到服務端,服務端執行此RPC呼叫對應的任務。執行結束後,服務端把響應的結果傳送給訊息佇列,指明routing key為”res_queue“。

4、Exchange把此訊息轉發到訊息佇列res_queue。

5、客戶端從訊息佇列res_queue中獲取響應。