目錄html
AMQP協議是Message Queue消息隊列的一種協議,RabbitMQ 是基於AMQP協議實現的一種消息隊列框架。
掌握RabbitMQ,必需要對AMQP的協議有所瞭解,才能使用的駕輕就熟。
本文主要介紹AMQP協議和RabbitMQ的基本概念和架構,詳細協議介紹能夠參考AMQP的官方協議文檔。http://www.amqp.org/編程
消息隊列(Message queue)是一種進程間通訊或同一進程的不一樣線程間的通訊方式。消息的發送者和接收者不須要同時與消息隊列交互。消息會保存在隊列中,直到接收者取回它。緩存
消息隊列是分佈式系統中重要的組件。服務器
producer/publisher: 消息的生產者、發佈者
consumer/subscriber: 消息的消費者、訂閱者
queue: 消息的緩存者
message: 消息實體
exchange:消息的交換機 (不是必備的)架構
一、解耦:經過消息隊列中間件的引入,下降各模塊之間的複雜度,達到解耦的目的。
二、異步:消息異步投遞,經過消息隊列的引入,有更加靈活的處理方式(主動拉取,服務推送),而且能夠堆疊消費者進行並行處理消息。
三、限流:同一時間大規模的消息生成,經過消息中間件進行負載均衡,達到限流的目的。併發
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:事務操做,支持一組消息的發送,和消費,支持回滾操做
RabbitMQ是實現了高級消息隊列協議(AMQP)的開源消息代理軟件(亦稱面向消息的中間件)。RabbitMQ服務器是用Erlang語言編寫的,而羣集和故障轉移是構建在開放電信平臺框架上的。全部主要的編程語言均有與代理接口通信的客戶端庫。
RabbitMQ官網有6種使用例子,其餘具體場景須要根據本身的業務進行組合取捨
一、hello word
P產生一個hello word的消息,到消息隊列,由C消費,這裏用了默認的Exchange
二、work queues
P產生一些消息投遞到消息隊列,由C1, C2分別消費,這裏使用了默認的Exchange (direct), C1消費過的消息,不會被C2消費
三、 Publish/Subscribe
發佈訂閱,使用fanout類型的Exchange, P投遞消息到X,X是fanout的類型,分別與兩個queue綁定,C1和C2消費同樣的消息
四、Routing
靈活的路由,這裏使用了direct類型的Exchange,按需binding,按需消費
五、Topic
topic類型的Exchange,組合了具備幾個特徵集合的消息,進行路由,匹配規則更加靈活
六、Rpc
兩個消息隊列提供Rpc的功能,客戶端投遞消息時,須要設置Server端消息投遞時須要的Routing key,這樣,Server收到消息後,處理完畢,投遞返回消息到reply 隊列對應的Exchange,而後被Client從reply消費,進而實現Rpc的調用
奈何官方沒有C/C++實現,後面我會分享出來我實現上述例子的Demo。
一、持久化、投遞確認,消費確認,高可用
二、消息路由靈活,接口使用簡單方便
三、集羣部署
四、管理方便,有管理後臺
五、Erlang編寫,高併發支持
https://en.wikipedia.org/wiki/Message_queue
http://www.amqp.org/
http://www.rabbitmq.com/getstarted.html