RabbitMQ AMQP (高階訊息佇列協議)
目錄
RabbitMQ AMQP (高階訊息佇列協議)
AMQP協議是Message Queue訊息佇列的一種協議,RabbitMQ 是基於AMQP協議實現的一種訊息佇列框架。
掌握RabbitMQ,必須要對AMQP的協議有所瞭解,才能使用的得心應手。
本文主要介紹AMQP協議和RabbitMQ的基本概念和架構,詳細協議介紹可以參考AMQP的官方協議文件。 ofollow,noindex" target="_blank">http://www.amqp.org/
Message Queue 簡介
概念
訊息佇列(Message queue)是一種程序間通訊或同一程序的不同執行緒間的通訊方式。訊息的傳送者和接收者不需要同時與訊息佇列互動。訊息會儲存在佇列中,直到接收者取回它。
訊息佇列是分散式系統中重要的元件。
基本組成
producer/publisher: 訊息的生產者、釋出者
consumer/subscriber: 訊息的消費者、訂閱者
queue: 訊息的快取者
message: 訊息實體
exchange:訊息的交換機 (不是必備的)
場景及作用
1、解耦:通過訊息佇列中介軟體的引入,降低各模組之間的複雜度,達到解耦的目的。
2、非同步:訊息非同步投遞,通過訊息佇列的引入,有更加靈活的處理方式(主動拉取,服務推送),並且可以堆疊消費者進行並行處理訊息。
3、限流:同一時間大規模的訊息生成,通過訊息中介軟體進行負載均衡,達到限流的目的。
AMQP簡介
Amqp是一個提供統一訊息服務的應用層標準高階訊息佇列協議,是應用層協議的一個開放標準,為面向訊息的中介軟體設計。基於此協議的客戶端與訊息中介軟體可傳遞訊息,並不受客戶端/中介軟體同產品,不同的開發語言等條件的限制。
模型架構
Amq model:

Publisher 和 Consumer與Server保持連線, Publiser那一側,只需要與Exchange進行保持連線。Publisher 和 Consumer登入時,需要指定virtual host,virtual host 類似C++的名稱空間一樣,Exchange和 Message Queue被包含在Virtual host的作用域範圍之內。
訊息投遞:

當Publisher 有訊息投遞時,需要攜帶Exchange進行binding需要的routingkey,並且指定message投遞到具體Exchange名字。這也就意味著Pushlisher並不直接和Message Queue有關聯,訊息投遞時,只需要跟Exchange那一側互動即可。 相關投遞細節還有訊息的持久化,訊息投遞的確認機制,訊息投遞的事務的操作等,後續文章會有C的程式碼實現。
交換機和佇列繫結:

交換機與佇列通過binding key進行binding, binding key就是路由到具體佇列的匹配規則,當有訊息進入Exchange時,Exchange會根據訊息攜帶的routing key進行binding, routing key如果符合 binding key的匹配規則,那麼訊息就會投遞到具有binding規則的佇列。可以這樣理解,routing key是跟訊息關聯的,binding key是與佇列關聯的,exchange就是比較這兩者的元件。exchange有四種類似:direct topic fanout header
訊息消費:

Consumer 通常會建立具體的queue和exchange,然後將其binding,根據不同的業務消費不同的訊息。具體其他細節還有消費確認,Qos操作,Cancel,事務操作等。
基礎元件
Server
Connection
Channel
Virtual Host
Exchange
Message
Binding
Routing Key
Binding Key
Message Queue
Exchange Type (direct topic fanout)
Producer- Consumer
Publisher- Subscriber (topic Exchange Type)
特性:
Persistent:持久化,需要同時message、 exchange、 queue 支援持久化才能達到持久化的操作
Confirm:傳送確認
Quality of Service:消費者可以指定Qos操作,操作預取,節省頻寬
Acknowledgements:消費確認
Transaction:事務操作,支援一組訊息的傳送,和消費,支援回滾操作
AMQP-RabbitMQ
簡介
RabbitMQ是實現了高階訊息佇列協議(AMQP)的開源訊息代理軟體(亦稱面向訊息的中介軟體)。RabbitMQ伺服器是用Erlang語言編寫的,而群集和故障轉移是構建在開放電信平臺框架上的。所有主要的程式語言均有與代理介面通訊的客戶端庫。
模型
RabbitMQ官網有6種使用例子,其他具體場景需要根據自己的業務進行組合取捨
1、hello word

P產生一個hello word的訊息,到訊息佇列,由C消費,這裡用了預設的Exchange
2、work queues

P產生一些訊息投遞到訊息佇列,由C1, C2分別消費,這裡使用了預設的Exchange (direct), C1消費過的訊息,不會被C2消費
3、 Publish/Subscribe

釋出訂閱,使用fanout型別的Exchange, P投遞訊息到X,X是fanout的型別,分別與兩個queue繫結,C1和C2消費一樣的訊息
4、Routing

靈活的路由,這裡使用了direct型別的Exchange,按需binding,按需消費
5、Topic

topic型別的Exchange,組合了具有幾個特徵集合的訊息,進行路由,匹配規則更加靈活
6、Rpc

兩個訊息佇列提供Rpc的功能,客戶端投遞訊息時,需要設定Server端訊息投遞時需要的Routing key,這樣,Server收到訊息後,處理完畢,投遞返回訊息到reply 佇列對應的Exchange,然後被Client從reply消費,進而實現Rpc的呼叫
奈何官方沒有C/C++實現,後面我會分享出來我實現上述例子的Demo。
特性
1、持久化、投遞確認,消費確認,高可用
2、訊息路由靈活,介面使用簡單方便
3、叢集部署
4、管理方便,有管理後臺
5、Erlang編寫,高併發支援