amqp筆記

一、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創建連接時,能夠指定本身的命名空間。

相關文章
相關標籤/搜索