rabbitmq使用筆記

2022-08-12 08:36:22 字數 3016 閱讀 7880

1、connection和channel

生產者/消費者都需要和rabbitmq broker建立連線,每個連線都是一條tcp連線,也就是connection。

一旦tcp連線建立起來後,客戶端就建立乙個amqp通道(channel),每個通道都會被指派乙個唯一的id。channel是建立在connection之上的虛擬連線,rabbitmq處理的每條amqp指令都是通過通道完成的。

我們完全可以使用 connection 就能完成客戶端和rabbitmq的通訊,為什麼還要引入通道呢?

因為,在通常的應用場景下,可能會有多個執行緒(生產者/消費者)需要同時和rabbitmq通訊,那麼必然會建立多個connection,也就是多個tcp連線。但建立和銷毀tcp連線都會有很大的系統開銷。

所以,rabbitmq 採用類似nio(non-blocking i/o)的方法,選擇tcp連線復用。在connection上建立channel,不僅可以減少效能開銷,同時也便於管理。

每個執行緒把持乙個通道,所以通道復用了 connection 的 tcp 連線。同時 rabbitmq 可以確保每個執行緒的私密性,就像擁有獨立的連線一樣。當每個通道的流量不是很大時,復用單一的 connection 可以在產生效能瓶頸的情況下有效地節省 tcp 連線資源。但是通道本身的流量很大時,多個通道繼續復用乙個 connection 的話就會產生效能瓶頸。此時,就需要開闢多個 connection,將這些通道平均分配到這些 connection 中,至於這些相關的調優策略需要根據業務自身的實際情況進行調節。

通道在 amqp 中是乙個很重要的概念,大多數操作都是在通道這個層面展開的。

比如 channel.exchangedeclare、channel.queuedeclare、channel.basicpublish、channel.basicconsume 等方法。

rabbitmq 相關的 api 與 amqp 緊密相連,比如 channel.basicpublish 對應 amqp 的 basic.publish 命令。

2、exchange、queue、route

broker:就是訊息佇列伺服器實體,指rabbitmq例項。

channel:訊息通道,在客戶端的每個連線connection上,可建立多個channel,每個channel代表乙個會話任務。

exchange:訊息交換機,它指定訊息按什麼規則路由到哪個佇列。

queue:訊息佇列載體,存放訊息的地方,每個訊息都會被投入到乙個或多個佇列中。

binding:繫結,它的作用就是把exchange和queue按照路由規則繫結起來。

routing key:路由關鍵字,exchange根據這個關鍵字進行訊息投遞。

vhost:虛擬主機,乙個broker裡可以開設多個vhost,用作不同使用者的許可權分離。

producer:訊息生產者,生產投遞訊息的程式。

consumer:訊息消費者,接受處理訊息的程式。

rabbitmq 的 tracing能跟蹤rabbitmq中訊息的流入流出情況。rabbitmq_tracing外掛程式會對流入流出的訊息做封裝,然後將封裝後的訊息日誌存入相應的trace檔案之中。

可以使用 rabbitmq-plugins enable rabbitmq_tracing 命令來啟動rabbitmq_tracing外掛程式。如果是使用docker部署的,先進入docker環境,再開啟。

在rabbitmq 的gui 管理介面 「admin」 選項右側原本只有 」users」、」virtual hosts」和 」policies「 三項,在新增rabbitmq_tracing 外掛程式之後,會多出」tracing」選項。

name:自定義日誌名稱,建議標準點容易區分。

format:表示輸出的訊息日誌格式,有text和json兩種,text格式的日誌方便人類閱讀,json的方便程式解析。text相比json格式占用空間稍大點。

json格式的payload(訊息體)缺省會採用base64進行編碼。

max payload bytes:表示每條訊息的最大限制,單位為b。比如設定了了此值為10,那麼當有超過10b的訊息經過rabbit mq時會被截斷。如訊息「trace test payload.」會被截斷成「trace test」。

pattern:用來設定匹配模式,如「#」 匹配所有訊息流入流出的情況,即當有客戶端生產訊息或消費訊息的時候,都會把相應的訊息日誌記錄下來。「publish.#」 匹配所有訊息流入的情況;「deliver.#」 匹配所有訊息流出的情況;「publish.exchange.b2b.gms.ass」只匹配傳送者(exchanges)為exchange.b2b.gms.ass的所有訊息流入的情況。

rabbitmq預設是不持久exchange、queue、binding以及佇列中訊息的,這意味著一旦mq伺服器重啟,所有已宣告的佇列,exchange,binding以及佇列中的訊息都會丟失。為了防止丟失,需要實現持久化。但持久化會對rabbitmq的效能造成很大的影響,可能會下降10倍不止。所以,為了提高rabbitmq的效能,沒有必要持久化的可以不用設定為持久化。

1、exchange 和 queue 持久化

把exchange 和 queue 的durable 屬性置為true,可以實現queue 和exchange 的持久化。但這裡需要注意的是,只有exchange 和queues 的durable都為true 時才能繫結,否則在繫結時,rabbitmq會報錯的。也就是說,

2、message 持久化

訊息的持久化需要在訊息投遞的時候設定delivery mode值為2。訊息持久化必須同時要求exchange和queue也是持久化的。

持久化的代價就是效能損失,磁碟io遠遠慢於ram(使用ssd會顯著提高訊息持久化的效能) , 持久化會大大降低rabbitmq每秒可處理的訊息.兩者的效能差距可能在10倍以上。

- exchange持久化,在宣告時指定durable => 1

- queue持久化,在宣告時指定durable => 1

- 訊息持久化,在投遞時指定delivery_mode => 2(1是非持久化)

Vim 使用筆記

set hlsearch set nohlsearch 搜尋後清除上次的加亮 nohl nohlsearch 拷貝 很有用的一句話,規定了格式選項,讓它換行不自動空格 set formatoptions tcrqn set fo r set noautoindent 再 shift insert 正...

xemacs使用筆記

xemacs使用筆記 xemacs emacs的下一代,由lucid原創 from debian參考手冊.由於不知道什麼時候刪掉了emacs的乙個重要檔案.每次都沒法安裝好.突然發現了xemacs,於是決定使用看看.本人還是菜鳥,僅供交流 我使用的ubuntu系統,所以就直接apt get inst...

TreeView使用筆記

treeview由節點構成,建樹通過對treeview.items屬性進行操作。items是乙個ttreenodes物件,這是乙個ttreenode集。一 針對ttreenodes,也就是 treeview.items,有這些屬性 1 count,節點個數。2 item index 通過index得...