學習過activemq的同學可能會理解起RabbitMQ的相關概念會比較快!慢慢來!
什麼 是RabbitMQ:
RabbitMQ 是一個由 Erlang 語言開發的 AMQP 的開源實現。
AMQP :Advanced Message Queue,高級消息隊列協議。它是應用層協議的一個開放
標準,爲面向消息的中間件設計,基於此協議的客戶端與消息中間件可傳遞消息,並不
受產品、開發語言等條件的限制。
RabbitMQ 用於在分佈式系統中存儲轉發消息,在易用性、擴展
性、高可用性等方面表現不俗。具體特點包括:
1.可靠性
Rabbitmq使用一些機制來保證,可靠性,比如持久化,傳輸協議,發佈確認。
2.路由靈活
在消息進入隊列之前,通過 Exchange 來路由消息的。對於典型的路由功能,RabbitMQ
已經提供了一些內置的 Exchange 來實現。針對更復雜的路由功能,可以將多個
Exchange 綁定在一起,也通過插件機制實現自己的 Exchange
3.消息集羣
多個rabbitma服務器可以組成一個集羣,形成一個邏輯Broker(經紀人)
4.高可用
隊列可以在集羣中的機器上面進行鏡像,使得在部分節點出問題的時候還是可以用的。
5.多語言客戶端
rabbitmq幾乎支持所有常用語言,比如java,.net還有啥呢,www.baidu.com
6.跟蹤機制
假如消息有異常,mq可以去跟蹤異常。
RabbitMQ的主要概念:
RabbitMQ Server: 它是一種傳輸服務,他的作用就是維護一條生產到消費的路線,保證數據的傳輸。
Producer: 消息生產者,如圖A、B、C,數據的發送方。消息生產者連接RabbitMQ服
務器然後將消息投遞到Exchange。
Consumer:消息消費者,如圖1、2、3,數據的接收方。消息消費者訂閱隊列,
RabbitMQ將Queue中的消息發送到消息消費者。
Exchange:生產者將消息發送到Exchange(交換器),由Exchange將消息路由到一個
或多個Queue中(或者丟棄)。Exchange並不存儲消息。RabbitMQ中的Exchange有
direct、fanout、topic、headers四種類型,每種類型對應不同的路由規則。
Queue:(隊列)是RabbitMQ的內部對象,用於存儲消息。
消息消費者就是通過訂閱隊列來獲取消息的,
RabbitMQ中的消息都只能存儲在Queue中,生產者生產消息並最終
投遞到Queue中,消費者可以從Queue中獲取消息並消費。多個消費者可以訂閱同一個
Queue,這時Queue中的消息會被平均分攤給多個消費者進行處理,而不是每個消費者
都收到所有的消息並處理。
RoutingKey(關鍵詞):生產者在將消息發送給Exchange的時候,一般會指定一個routing key,
來指定這個消息的路由規則,而這個routing key需要與Exchange Type及binding key聯
合使用才能最終生效。在Exchange Type與binding key固定的情況下(在正常使用時一
般這些內容都是固定配置好的),我們的生產者就可以在發送消息給Exchange時,通過
指定routing key來決定消息流向哪裏。RabbitMQ爲routing key設定的長度限制爲255
bytes。
Connection: (連接):Producer和Consumer都是通過TCP連接到RabbitMQ Server
的。以後我們可以看到,程序的起始處就是建立這個TCP連接。
Channels: (信道):它建立在上述的TCP連接中。數據流動都是在Channel中進行
的。也就是說,一般情況是程序起始建立TCP連接,第二步就是建立這個Channel
VirtualHost:權限控制的基本單位,一個VirtualHost裏面有若干Exchange和
MessageQueue,以及指定被哪些user使用
關於安裝教程:https://www.cnblogs.com/ericli-ericli/p/5902270.html
默認的用戶:guest密碼:guest
上面幾個大分類分別是:概覽、連接、信道、交換器、隊列、用戶管理
RabbitMq的幾種模式:這幾種模式跟路由密切關聯:
直接模式(Direct)
通俗的講就是2個傻吊一個密室聊天其他人不知道他們在聊啥!
任何發送到Direct Exchange的消息都會被轉發到RouteKey中指定的Queue。這句話上面意思呢,就是任何發送的直接路由都會根據關鍵字也就是隊列的名字。在消費的時候指定了隊列名的類會被觸發!這句話等下看代碼就理解了!
1.一般情況可以使用rabbitMQ自帶的Exchange:”"(該Exchange的名字爲空字符串,下
文稱其爲default Exchange)。
2.這種模式下不需要將Exchange進行任何綁定(binding)操作
3.消息傳遞時需要一個“RouteKey”,可以簡單的理解爲要發送到的隊列名字。
4.如果vhost中不存在RouteKey中指定的隊列名,則該消息會被拋棄。
來一波手動創建隊列:
Durability:是否做持久化 Durable(持久) transient(臨時)
Auto delete : 是否自動刪除
代碼實現消息的生產和消費,這個是我的碼雲地址:https://gitee.com/xiaosuhao/rabbitmq
還有一木有完善!