一、exchangejson
message的生產者能夠將消息發送給exchange,而後由exchange路由到不一樣的queue中。數組
exchange有4種類型:多線程
direct exchange:msg只會路由到一個queue上。當有多個queue以相同到routing key接入到direct exchange時,將產生round robin的效果。app
fanout exchange:msg在exchange中會自動複製,並分發至全部接入到exchange中的queue上,達到廣播的效果。tcp
topic exchange:性能
header exchange:fetch
此外,exchange還有多個重要的屬性:優化
name編碼
durability:可選值爲[durable,transient],當設置爲durable時,exchange重啓後,將自動恢復。spa
auto-deleting:當最後一個bond在exchange上的queue解綁時,將自動刪除exchange。
在特殊狀況下,一個message能夠被返還給publisher、丟棄或轉到「dead letter queue」中,這取決於生產者在publish message時的配置。
二、queue
queue有一些重要的特性:
name:queue的名稱,最大長度255byte
durable:在服務重啓後,queue是否恢復
autodelete:當最後一個subscriber消失後,是否自動刪除queue?
其餘參數:例如msg是否帶有ttl超時時間、隊列長度是否設限等。
queue在使用前須要先聲明。聲明一個queue時,若是該queue還沒有存在,則amqp建立之。若queue已經存在,且全部配置均與聲明的相同,則不作操做;若queue存在,但參數配置卻不相同,則報PRECONDITION_FAILED錯誤。
2.1 queue name
應用程序能夠爲queue指定一個名字,也能夠申請broker幫忙分配一個名字,名字的長度最大爲255byte,可使用utf-8字符。
如果申請broker幫忙分配名字,那麼名字將攜帶在declare的response中返回給應用程序。
有「amq.」前綴的名字默認爲amqp內部使用,若用戶聲明的queue帶有這樣的名稱,則會收到ACCESS_REFUSED錯誤。
2.2 queue durabilty
設置爲durability的queue會持久化到磁盤,當broker重啓後,會從新加載進來。可是並不是每條存放在durability queue中message都會持久化,而是隻有persistent message纔會持久化。
3. bindings
binding是exchange將message路由到queue中的規則。若想讓exchange中的message能夠路由到某個queue,則queue必須先bond到queue上。對於一些類型的exchange,它使用routing key做爲路由的依據,相似filter功能。
當一條消息沒法被路由到任何一個queue時,該消息能夠被返還給publisher或直接銷燬(採用那種行爲取決與publisher的設置)。
4. consumers
消息須要被consumer消費纔有意義。
consumer有兩種方式來消費message。
push方式:由broker推送給訂閱了queue的consumer。
pull方式:由consumer本身到queue中拉取message。
當使用push方式時,咱們稱consumer被「註冊」(registe)到了queue上。一個queue能夠被多個consumer註冊。此外,consumer也能夠以exclusive的方式來註冊,此時,consumer是排他的,當本身在消費時,其餘consumer不能從queue中消費。
每一個consumer都有一個本身的tag(稱爲consumer tag),能夠用來從queue上unsubscribe。
5. message ack
amqp定義了兩種ack模式,自動ack和顯式ack。
自動ack指的是當message被從queue中消費後,自動從queue中刪除。(發生在basic.deliver或basic.get_ok後)
顯式ack指的是,只有當application發送ack消息後,消息纔會從queue中刪除。(發生在basic.ack後)
6. rejecting message
當consumer處理一個message失敗後,它能夠經過丟棄或重入queue的方式來reject這個message。
7.nack
8.prefetching messages
amqp能夠設定在下個ack到來以前,一次性索取多條message,如此能夠優化系統的throughput。
9.message‘s attribute and payload
9.1 message attribute
在amqp中,message能夠有不少屬性,例如:
content type
content encodeing
routing key
delivery mode(persistent or not)
message priority
message publishing timestamp
expiration period:超時時間
publisher application id
message的屬性能夠被broker使用,也能夠被consumer使用。
當message以persistent方式發佈時,broker將會把它們持久化到磁盤中。當系統重啓的時候,broker保證已收到的persistent類型的數據不丟失。將數據的persistent標誌設爲true會致使必定的性能降低(由於須要作持久化動做)。
9.2 message payload
payload是message攜帶的內容,它能夠爲空。payload以byte數組的方式被傳遞。broker不會查看和檢查payload的內容。
可使用場景的編碼協議來構造payload中的內容,例如json、thrift、protobuf等。
amqp的生產者和消費者一般使用content type和content encoding屬性來判斷payload中消息內容的編碼方式。
10.connection
amqp使用長連接,而且支持tls。
當一個應用再也不與amqp連接時,應該顯示釋放 amqp的connection,而不是直接斷開它底層的tcp連接。
11.channels
有一些程序須要與多個queue相連,此時,不須要創建多個長連接。
amqp使用channel來實現connection長連接的複用。對於使用多線程的應用而言,應每一個線程一個channel,而不是多個線程共享同一個channel。
12. virtual host
amqp還定義了virtual host概念,用來將user、exchange、queue劃分到不一樣的namespace中。
應用程序在與amqp創建連接時,能夠指定本身的命名空間。