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的實現原理
訊息傳送過程:
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中獲取響應。