AMQP協議

 


AMQP介紹

AMQP是什麼

AMQP(高級消息隊列協議)是一個網絡協議。rabbitmq是基於AMQP標準開發的。算法

AMQP模型簡介

AMQP的工做過程以下圖:消息(message)被髮布者(publisher)發送給交換機(exchange),交換機經常被比喻成郵局或者郵箱。而後交換機將收到的消息根據路由規則分發給綁定的隊列(queue)。最後AMQP代理會將消息投遞給訂閱了此隊列的消費者,或者消費者按照需求自行獲取。網絡

交換機和交換機類型

交換機是用來發送消息的AMQP實體。交換機拿到一個消息以後將它路由給一個或零個隊列。它使用哪一種路由算法是由交換機類型和被稱做綁定(bindings)的規則所決定的。AMQP的代理提供了四種交換機架構

Name(交換機類型) Default pre-declared names(預聲明的默認名稱)
Direct exchange(直連交換機) (Empty string) and amq.direct
Fanout exchange(扇型交換機) amq.fanout
Topic exchange(主題交換機) amq.topic
Headers exchange(頭交換機) amq.match (and amq.headers in RabbitMQ)

直連交換機

直連型交換機(direct exchange)是根據消息攜帶的路由鍵(routing key)將消息投遞給對應隊列的。直連交換機用來處理消息的單播路由(能夠處理多播路由)app

工做過程:負載均衡

  • 將一個隊列綁定到某個交換機上,同時賦予該綁定一個路由鍵(routing key)
  • 當一個攜帶着路由鍵爲R的消息被髮送給直連交換機的時候,交換機會把它路由給綁定值爲一樣爲R的隊列。

直連交換機常常用來循環分發任務給多個工做者。這樣作的時候,咱們須要明白一點,在AMQP中,消息的負載均衡是發生在消費者之間的,而不是隊列之間。分佈式

扇形交換機

扇形交換機(funout exchange)將消息路由給綁定到他身上的全部隊列,而不理會綁定的路由鍵。若是N個隊列綁定到某個扇形交換機上,當有消息發送給此扇形交換機時,交換機會將消息的拷貝分別發送給全部隊列。扇形交換機用來處理信息的廣播路由。網站

由於扇型交換機投遞消息的拷貝到全部綁定到它的隊列,因此他的應用案例都極其類似:代理

  • 大規模多用戶在線(MMO)遊戲可使用它來處理排行榜更新等全局事件
  • 體育新聞網站能夠用它來近乎實時地將比分更新分發給移動客戶端
  • 分發系統使用它來廣播各類狀態和配置更新
  • 在羣聊的時候,它被用來分發消息給參與羣聊的用戶。(AMQP沒有內置presence的概念,所以XMPP可能會是個更好的選擇)

主題交換機

主題交換機(topic exchanges)經過對消息的路由鍵和隊列到交換機的綁定模式之間的匹配,將消息路由給一個或多個隊列。主題交換機常常用來實現各類分發/訂閱模式及其變種。主題交換機一般用來實現消息的多播路由。blog

主題交換機擁有很是普遍的用戶案例。不管什麼時候,當一個問題涉及到那些想要有針對性的選擇須要接收消息的 多消費者/多應用(multiple consumers/applications) 的時候,主題交換機均可以被列入考慮範圍。rabbitmq

使用案例:

  • 分發有關於特定地理位置的數據,例如銷售點
  • 由多個工做者(workers)完成的後臺任務,每一個工做者負責處理某些特定的任務
  • 股票價格更新(以及其餘類型的金融數據更新)
  • 涉及到分類或者標籤的新聞更新(例如,針對特定的運動項目或者隊伍)
  • 雲端的不一樣種類服務的協調
  • 分佈式架構/基於系統的軟件封裝,其中每一個構建者僅能處理一個特定的架構或者系統。

頭交換機

有時候信息的路由鍵會涉及到多個屬性,此時用消息頭就比用路由鍵更容易表達。頭交換機(headers exchange)就是爲此而生的。頭交換機使用多個消息屬性來代替路由鍵創建路由規則。經過判斷頭的值可否與指定的綁定相匹配來肯定路有規則。

有時消息的路由操做會涉及到多個屬性,此時使用消息頭就比用路由鍵更容易表達,頭交換機(headers exchange)就是爲此而生的。頭交換機使用多個消息屬性來代替路由鍵創建路由規則。經過判斷消息頭的值可否與指定的綁定相匹配來確立路由規則。

咱們能夠綁定一個隊列到頭交換機上,並給他們之間的綁定使用多個用於匹配的頭(header)。這個案例中,消息代理得從應用開發者那兒取到更多一段信息,換句話說,它須要考慮某條消息(message)是須要部分匹配仍是所有匹配。上邊說的「更多一段消息」就是"x-match"參數。當"x-match"設置爲「any」時,消息頭的任意一個值被匹配就能夠知足條件,而當"x-match"設置爲「all」的時候,就須要消息頭的全部值都匹配成功。

頭交換機能夠視爲直連交換機的另外一種表現形式。頭交換機可以像直連交換機同樣工做,不一樣之處在於頭交換機的路由規則是創建在頭屬性值之上,而不是路由鍵。路由鍵必須是一個字符串,而頭屬性值則沒有這個約束,它們甚至能夠是整數或者哈希值(字典)等。

 

綁定

綁定是交換機將消息路由給隊列所需遵循的規則。若是要指示交換機"E"將消息路由給隊列"Q",那麼"Q"就須要與"E"進行綁定。綁定操做須要定義一個可選的路由鍵屬性給某些類型的交換機。路由鍵的意義在於從發送給交換機的衆多消息中選擇出某些消息,將其路由給特定的隊列。

相關文章
相關標籤/搜索