文章目錄
1. 引言
rabbit mq常用基礎概念知識
2. 啓動服務
# 後臺運行,服務默認端口號5672
rabbitmq-server -detached
# 查看集羣信息
rabbitmqctl cluster_status
# 新增用戶
rabbitmqctl add_user username password
# 設置用戶權限
rabbitmqctl set_permissions -p / root ".*" ".*" ".*"
# 設置管理員角色
rabbitmqctl set_user_tags username administrator
# 啓用web界面,服務默認端口號15672
rabbitmq-plugins enable rabbitmq_management
# 獲取插件列表
rabbitmq-plugins list
3. 相關概念
3.1 整體模型
3.2 生產者和消費者
- 生產者:生產消息然後發送(Basic.Publish)到RabbitMQ中,消息一般包含兩個部分:消息體(payload)和標籤(Label)
- 消費者:消息接收方,只消費消息(Basic.Consume/Basic.Get)的消息體(payload),消息路由的過程中,消息的標籤會丟棄。
- Broker:消息中間件的服務節點,可以簡單的看作一個RabbitMQ服務節點。
3.3 隊列
RabbitMQ中消息都只能存儲在隊列中,多個消費者可以訂閱同一個隊列,這時隊列中的消息會被平均分攤。隊列跟交換器共享某些屬性,但是隊列也有一些另外的屬性。
- Name
- Durable(消息代理重啓後,隊列依舊存在)
- Exclusive(只被一個連接(connection)使用,而且當連接關閉後隊列即被刪除)
- Auto-delete(當最後一個消費者退訂後即被刪除)
- Arguments(一些消息代理用他來完成類似與 TTL 的某些額外功能)
3.4 綁定鍵、路由鍵、交換器
3.4.1 綁定鍵
BindingKey:綁定鍵。RabbitMQ中通過綁定將交換器與隊列關聯起來,生產者發送消息給交換器時,需要一個RoutingKey,當傳入消息的RoutingKey與BindingKey相匹配時,消息會被路由到對應的隊列中。
3.4.2 路由鍵
RoutingKey:路由鍵。用來指定這個消息的路由規則。其實BindingKey也是路由鍵的一種,大多數時候官方文檔和RabbitMQ API都把BindingKey和RoutingKey看作RoutingKey,可以這樣理解在綁定的時候路由鍵是BindingKey,如:channel.exchangeBind,channel.queueBind。在發送消息的時候,其中需要的路由鍵是RoutingKey,涉及的客戶端方法如:channel.basciPublish。
在topic交換器類型下,RoutingKey和BindingKey之間需要進行模糊匹配,兩者是不同的。簡而言之BingdingKey是位於交換器上的RoutingKey,位於生產者發送的消息中的RoutingKey將會與交換器的BindingKey匹配,並根據匹配結果放入相應隊列。
3.4.3 交換器類型
常用的交換器類型有四種:fanout、direct、topic、headers
- fanout:會把所有發送到該交換器的消息路由到所有與該交換器綁定的隊列中。
- direct:會把消息路由到RoutingKey和BindingKey完全匹配的隊列中。
- topic: 類似正則匹配,他規定:
- RoutingKey爲一個點號".“分隔的字符串,如"com.rabbitmq.client”
- BindingKey也是用點號".“分隔的字符串,但是可以存在兩種特殊字符”*“和”#","*“用於匹配一個單詞,”#“用於匹配0-n個單詞和”."
- headers:根據消息內容中的headers屬性進行匹配,性能較差。
4. RabbitMQ運轉流程
4.1 生產者發送消息
- 生產者連接到RabbitMQ Broker , 建立一個連接( Connection) ,開啓一個信道(Channel)
- 生產者聲明一個交換器,並設置相關屬性,比如交換機類型、是否持久化等
- 生產者聲明一個隊列井設置相關屬性,比如是否排他、是否持久化、是否自動刪除等
- 生產者通過路由鍵將交換器和隊列綁定起來
- 生產者發送消息至RabbitMQ Broker,其中包含路由鍵、交換器等信息
- 相應的交換器根據接收到的路由鍵查找相匹配的隊列
- 如果找到,則將從生產者發送過來的消息存入相應的隊列中
- 如果沒有找到,則根據生產者配置的屬性選擇丟棄還是回退給生產者
- 關閉信道
- 關閉連接
4.2 消費者接收消息的過程:
- 消費者連接到RabbitMQ Broker,建立一個連接(Connection),開啓一個信道(Channel)
- 消費者向RabbitMQ Broker請求消費相應隊列中的消息,可能會設置相應的回調函數,
以及做一些準備工作 - 等待RabbitMQ Broker 迴應並投遞相應隊列中的消息,消費者接收消息
- 消費者確認(ack) 接收到的消息
- RabbitMQ 從隊列中刪除相應己經被確認的消息
- 關閉信道
- 關閉連接