RabbitMQ AMQP (高級消息隊列協議)
AMQP協議是Message Queue消息隊列的一種協議,RabbitMQ 是基於AMQP協議實現的一種消息隊列框架。
掌握RabbitMQ,必須要對AMQP的協議有所了解,才能使用的得心應手。
本文主要介紹AMQP協議和RabbitMQ的基本概念和架構,詳細協議介紹可以參考AMQP的官方協議文檔。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編寫,高並發支持
參考
https://en.wikipedia.org/wiki/Message_queue
http://www.amqp.org/
http://www.rabbitmq.com/getstarted.html
