AMQP(高級消息隊列協議)是一個網絡協議。rabbitmq是基於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
工做過程:負載均衡
直連交換機常常用來循環分發任務給多個工做者。這樣作的時候,咱們須要明白一點,在AMQP中,消息的負載均衡是發生在消費者之間的,而不是隊列之間。分佈式
扇形交換機(funout exchange)將消息路由給綁定到他身上的全部隊列,而不理會綁定的路由鍵。若是N個隊列綁定到某個扇形交換機上,當有消息發送給此扇形交換機時,交換機會將消息的拷貝分別發送給全部隊列。扇形交換機用來處理信息的廣播路由。網站
由於扇型交換機投遞消息的拷貝到全部綁定到它的隊列,因此他的應用案例都極其類似:代理
主題交換機(topic exchanges)經過對消息的路由鍵和隊列到交換機的綁定模式之間的匹配,將消息路由給一個或多個隊列。主題交換機常常用來實現各類分發/訂閱模式及其變種。主題交換機一般用來實現消息的多播路由。blog
主題交換機擁有很是普遍的用戶案例。不管什麼時候,當一個問題涉及到那些想要有針對性的選擇須要接收消息的 多消費者/多應用(multiple consumers/applications) 的時候,主題交換機均可以被列入考慮範圍。rabbitmq
使用案例:
有時候信息的路由鍵會涉及到多個屬性,此時用消息頭就比用路由鍵更容易表達。頭交換機(headers exchange)就是爲此而生的。頭交換機使用多個消息屬性來代替路由鍵創建路由規則。經過判斷頭的值可否與指定的綁定相匹配來肯定路有規則。
有時消息的路由操做會涉及到多個屬性,此時使用消息頭就比用路由鍵更容易表達,頭交換機(headers exchange)就是爲此而生的。頭交換機使用多個消息屬性來代替路由鍵創建路由規則。經過判斷消息頭的值可否與指定的綁定相匹配來確立路由規則。
咱們能夠綁定一個隊列到頭交換機上,並給他們之間的綁定使用多個用於匹配的頭(header)。這個案例中,消息代理得從應用開發者那兒取到更多一段信息,換句話說,它須要考慮某條消息(message)是須要部分匹配仍是所有匹配。上邊說的「更多一段消息」就是"x-match"參數。當"x-match"設置爲「any」時,消息頭的任意一個值被匹配就能夠知足條件,而當"x-match"設置爲「all」的時候,就須要消息頭的全部值都匹配成功。
頭交換機能夠視爲直連交換機的另外一種表現形式。頭交換機可以像直連交換機同樣工做,不一樣之處在於頭交換機的路由規則是創建在頭屬性值之上,而不是路由鍵。路由鍵必須是一個字符串,而頭屬性值則沒有這個約束,它們甚至能夠是整數或者哈希值(字典)等。
綁定是交換機將消息路由給隊列所需遵循的規則。若是要指示交換機"E"將消息路由給隊列"Q",那麼"Q"就須要與"E"進行綁定。綁定操做須要定義一個可選的路由鍵屬性給某些類型的交換機。路由鍵的意義在於從發送給交換機的衆多消息中選擇出某些消息,將其路由給特定的隊列。