1.概念
Broker:簡單來說就是消息隊列服務器實體。
Exchange:消息交換機,它指定消息按什麼規則,路由到哪個隊列。
Queue:消息隊列載體,每個消息都會被投入到一個或多個隊列。
Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。
vhost:虛擬主機,一個broker裏可以開設多個vhost,用作不同用戶的權限分離。
producer:消息生產者,就是投遞消息的程序。
consumer:消息消費者,就是接受消息的程序。
channel:消息通道,在客戶端的每個連接裏,可建立多個channel,每個channel代表一個會話任務.
2. RabbitMQ的應用場景以及基本原理
https://blog.csdn.net/whoamiyang/article/details/54954780
3. RabbitMQ C 客戶端收發數據源碼實例解析
https://blog.csdn.net/lijinqi1987/article/details/79037130
4. 環境搭建部署
https://www.cnblogs.com/xieyulin/p/7050595.html
5. Windows環境下RabbitMQ的啓動和停止命令
https://blog.csdn.net/zxl646801924/article/details/80435231
linux環境部署
http://www.cnblogs.com/Lijcyy/p/9045957.html
RabbitMQ-C 客戶端接口使用說明
https://www.cnblogs.com/yorkyang/p/6294049.html
RabbitMq、ActiveMq、ZeroMq、kafka之間的比較
https://blog.csdn.net/qq_35873847/article/details/78737796
6. 生產流程
1) 建立鏈接(Connection)
2) 在鏈接(Connection)上開啓一個信道(Channel)
3) 聲明一個交換機(Exchange)
4) 聲明一個隊列(Queue)
5) 使用路由鍵(RoutingKey)將隊列(Queue)和交換機(Exchange)綁定起來
6) 根據路由鍵(RoutingKey)發送消息到交換機(Exchange)
7) [MQ]根據交換機(Exchange)和路由鍵(RoutingKey),將消息或存放到隊列(Queue),或丟棄,或退回給生產者
8) 關閉信道(Channel)
9) 關閉鏈接(Connection)
7. 消費流程
1) 建立鏈接(Connection)
2) 在鏈接(Connection)上開啓一個信道(Channel)
3) 請求消費指定隊列(Queue)的消息,並設置回調函數(onMessage)
4) [MQ]將消息推送給消費者
5) 消費者發送消息確定(Ack[acknowledge])
6) [MQ]刪除被確認的消息
7) 關閉信道(Channel)
8) 關閉鏈接(Connection)
8. 任務分發機制
1) 循環分發:門爲併發程序設計的,如果現在load加重,只需要創建更多的Consumer來進行任務處理。
2) 消息確認:爲了保證數據不丟,保證數據能被正確處理而不僅僅是被Consumer收到,不能採用no-ack,而應該是在處理完數據之後發送ack。
3) 消息持久化:要持久化隊列queue的持久化需要在聲明隊列時指定durable=True;
消息持久化包括3部分:exchange持久化、queue持久化、消息持久化,在投遞時指定delivery_mode=2(1是非持久化)。
如果exchange和queue都是持久化的,那麼它們之間的binding也是持久化的,如果exchange和queue兩者之間有一個持久化,一個非持久化,則不允許建立綁定.
注意:一旦創建了隊列和交換機,就不能修改其標誌了,
例如,創建了一個non-durable的隊列,然後想把它改變成durable的,唯一的辦法就是刪除這個隊列然後重現創建.
9. 公平分發機制
通過basic.qos方法設置prefetch_count=1,這樣RabbitMQ就會使得每個Consumer在同一個時間點最多處理一個Message,
換句話說,在接收到該Consumer的ack前,它不會將新的Message分發給它,channel.basic_qos(prefetch_count=1)
注意,這種方法可能會導致queue滿。當然,這種情況下你可能需要添加更多的Consumer,或者創建更多的virtualHost來細化你的設計
10. 交換機路由的幾種類型
Direct Exchange:直接匹配,通過Exchange名稱+RountingKey來發送與接收消息.
Fanout Exchange:廣播訂閱,向所有的消費者發佈消息,但是隻有消費者將隊列綁定到該路由器才能收到消息,忽略Routing Key.
Topic Exchange:主題匹配訂閱,這裏的主題指的是RoutingKey可採用通配符,如:*或#,RoutingKey命名採用.來分隔多個詞,只有消息這將隊列綁定到該路由器且指定RoutingKey符合匹配規則時才能收到消息;
Headers Exchange:消息頭訂閱,消息發佈前,爲消息定義一個或多個鍵值對的消息頭,然後消費者接收消息同時需要定義類似的鍵值對請求頭:(如:x-mactch=all或者x_match=any),只有請求頭與消息頭匹配,才能接收消息,忽略RoutingKey
默認的exchange:如果用空字符串去聲明一個exchange,那麼系統就會使用”amq.direct”這個exchange
11. 消息序列化
RabbitMQ使用ProtoBuf序列化消息,它可作爲RabbitMQ的Message的數據格式進行傳輸,由於是結構化的數據,這樣就極大的方便了Consumer的數據高效處理,當然也可以使用XML,與XML相比,ProtoBuf有以下優勢:
1).簡單
2).size小了3-10倍
3).速度快了20-100倍
4).易於編程
5).減少了語義的歧義. ProtoBuf具有速度和空間的優勢