Rabbitmq知識點總結

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具有速度和空間的優勢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章