一、簡介:
rabbitmq 是實現了高階訊息佇列協議(amqp)的開源訊息**中介軟體。訊息佇列是一種應用程式對應用程式的通行方式,應用程式通過寫訊息,將訊息傳遞於佇列,由另一應用程式讀取 完成通訊。而作為中介軟體的 rabbitmq 無疑是目前最流行的訊息佇列之一。
rabbitmq 應用場景廣泛:
系統的高可用:日常生活當中各種**秒殺,高流量,高併發的場景。當伺服器接收到如此大量請求處理業務時,有宕機的風險。某些業務可能極其複雜,但這部分不是高時效性,不需要立即反饋給使用者,我們可以將這部分處理請求拋給佇列,讓程式後置去處理,減輕伺服器在高併發場景下的壓力。
分布式系統,整合系統,子系統之間的對接,以及架構設計中常常需要考慮訊息佇列的應用。
二、rabbitmq 生產和消費
生產者(producter):佇列訊息的產生者,負責生產訊息,並將訊息傳入佇列
消費者(consumer):佇列訊息的接收者,負責 接收並處理 訊息佇列中的訊息
三、rabbitmq 持久化
mq預設建立的是臨時 queue 和 exchange,如果不宣告持久化,一旦 rabbitmq 掛掉,queue、exchange 將會全部丟失。所以我們一般在建立 queue 或者 exchange 的時候會宣告 持久化。
1.queue 宣告持久化
# 宣告訊息佇列,訊息將在這個佇列傳遞,如不存在,則建立。durable = true 代表訊息佇列持久化儲存,false 非持久化儲存result = channel.queue_declare(queue ='python-test',durable = true)
2.exchange 宣告持久化
# 宣告exchange,由exchange指定訊息在哪個佇列傳遞,如不存在,則建立.durable = true 代表exchange持久化儲存,false 非持久化儲存channel.exchange_declare(exchange ='python-test', durable = true)
注意:如果已存在乙個非持久化的 queue 或 exchange ,執行上述**會報錯,因為當前狀態不能更改 queue 或 exchange 儲存屬性,需要刪除重建。如果 queue 和 exchange 中乙個宣告了持久化,另乙個沒有宣告持久化,則不允許繫結。
3.訊息持久化
雖然 exchange 和 queue 都申明了持久化,但如果訊息只存在記憶體裡,rabbitmq 重啟後,記憶體裡的東西還是會丟失。所以必須宣告訊息也是持久化,從記憶體轉存到硬碟。
4.acknowledgement 訊息不丟失
消費者(consumer)呼叫callback函式時,會存在處理訊息失敗的風險,如果處理失敗,則訊息丟失。但是也可以選擇消費者處理失敗時,將訊息回退給 rabbitmq ,重新再被消費者消費,這個時候需要設定確認標識。
三、rabbitmq 發布與訂閱
rabbitmq 的發布與訂閱要借助交換機(exchange)的原理實現:
exchange 一共有三種工作模式:fanout, direct, topicd
模式一:fanout
這種模式下,傳遞到 exchange 的訊息將會**到所有與其繫結的 queue 上。
不需要指定 routing_key ,即使指定了也是無效。
需要提前將 exchange 和 queue 繫結,乙個 exchange 可以繫結多個 queue,乙個queue可以繫結多個exchange。
需要先啟動訂閱者,此模式下的佇列是 consumer 隨機生成的,發布者僅僅發布訊息到 exchange ,由 exchange **訊息至 queue。
發布者:
訂閱者:
模式二:direct
這種工作模式的原理是 訊息傳送至 exchange,exchange 根據路由鍵(routing_key)**到相對應的 queue 上。
可以使用預設 exchange =' ' ,也可以自定義 exchange
這種模式下不需要將 exchange 和 任何進行繫結,當然繫結也是可以的。可以將 exchange 和 queue ,routing_key 和 queue 進行繫結
傳遞或接受訊息時 需要指定 routing_key
需要先啟動訂閱者,此模式下的佇列是 consumer 隨機生成的,發布者僅僅發布訊息到 exchange ,由 exchange **訊息至 queue。
發布者:
消費者:
模式三:topicd
這種模式和第二種模式差不多,exchange 也是通過 路由鍵 routing_key 來**訊息到指定的 queue 。 不同點是routing_key 使用正規表示式支援模糊匹配,但匹配規則又與常規的正規表示式不同,比如『』#『』是匹配全部,「*」是匹配乙個詞。
舉例:routing_key =「#orderid#」,意思是將訊息**至所有 routing_key 包含 「orderid」 字元的佇列中。**和模式二 類似,就不貼出來了。
erlang jcl遠端除錯 rabbitmq
job control mode jcl in which jobs can be started,stopped,detached or connected.only the current job can communicate with the shell.通過jcl,我們可以遠端接入乙個er...
mac 使用docker 安裝 rabbitmq
專案要用到rabbitmq 官網說brew install 但是brew update就半天都不成功,突然想起了docker,以前用過一點點,就試著來了一下 docker search rabbitmq management docker pull rabbitmq management docke...
RabbitMQ實戰 什麼是RabbitMQ
mq 首先我們說下mq,mq全稱為message queue,即訊息佇列,是一種應用程式對應用程式的通訊方法。其特點就是一端往訊息佇列中不斷寫入訊息,而另一端則可以讀取或者訂閱佇列中的訊息。訊息 message brokers 從發布者 publishers 亦稱生產者 producers 那兒接受...