RabbitMQ的應用場景以及基本原理介紹


異步處理

應用解耦

流量削峰

      

                        系統架構

Broker:它提供一種傳輸服務,它的角色就是維護一條從生產者到消費者的路線,保證數據能按照指定的方式進行傳輸, 
Exchange:消息交換機,它指定消息按什么規則,路由到哪個隊列。 
Queue:消息的載體,每個消息都會被投到一個或多個隊列。 
Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來. 
Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。 
vhost:虛擬主機,一個broker里可以有多個vhost,用作不同用戶的權限分離。 
Producer:消息生產者,就是投遞消息的程序. 
Consumer:消息消費者,就是接受消息的程序. 
Channel:消息通道,在客戶端的每個連接里,可建立多個channel.

Fair dispath 公平分發

RabbitMQ就會使得每個Consumer在同一個時間點最多處理一個Message,換句話說,在接收到該Consumer的ack前,它不會將新的Message分發給它

 

分發到多個Consumer

Direct exchange

Exchange和兩個隊列綁定在一起,Q1的bindingkey是orange,Q2的binding key是black和green. 
當Producer publish key是orange時,exchange會把它放到Q1上,如果是black或green就會到Q2上,其余的Message被丟棄.

Multiple bindings

 多個queue綁定同一個key也是可以的,對於下圖的例子,Q1和Q2都綁定了black,對於routing key是black的Message,會被deliver到Q1和Q2,其余的Message都會被丟棄. 

Topic exchange

Producer發送消息時需要設置routing_key,routing_key包含三個單詞和連個點號o,第一個key描述了celerity(靈巧),第二個是color(色彩),第三個是物種: 
在這里我們創建了兩個綁定: Q1 的binding key 是”.orange.“; Q2 是 “..rabbit” 和 “lazy.#”:

    • Q1感興趣所有orange顏色的動物
    • Q2感興趣所有rabbits和所有的lazy的. 
      例子:rounting_key 為 “quick.orange.rabbit”將會發送到Q1和Q2中 
      rounting_key 為”lazy.orange.rabbit.hujj.ddd”會被投遞到Q2中,#匹配0個或多個單詞。

 

消息序列化

RabbitMQ使用ProtoBuf序列化消息,它可作為RabbitMQ的Message的數據格式進行傳輸,由於是結構化的數據,這樣就極大的方便了Consumer的數據高效處理,當然也可以使用XML,與XML相比,ProtoBuf有以下優勢: 
1.簡單 
2.size小了3-10倍 
3.速度快了20-100倍 
4.易於編程 
6.減少了語義的歧義. 
,ProtoBuf具有速度和空間的優勢,使得它現在應用非常廣泛

 

參考:http://blog.csdn.net/whoamiyang/article/details/54954780

https://www.cnblogs.com/jun-ma/p/4840869.html

 

rabbitMQ中consumer通過建立到queue的連接,創建channel對象,通過channel通道獲取message,
Consumer可以聲明式的以API輪詢poll的方式主動從queue的獲取消息,也可以通過訂閱的方式被動的從Queue中消費消息,

1、訂閱方式其實是向queue注冊consumer,通過rpc向queue server發送注冊consumer的消息,rabbitMQ Server在收到消息后,根據消息的內容類型判斷這是一個訂閱消息,這樣當MQ 中queue有消息時,會自動把消息通過該socket(長連接)通道發送出去。創建Connection后,會啟動MainLoop后台線程,循環從socket(FrameHandler)中獲取數據包(Frame) 每個Consumer都有一個BlockQueue,用於緩存從socket中獲取的消息。接下來,Consumer對象就可以調用api來從客戶端緩存的_queue中依次獲取消息,進行消費,參見QueueingConsumer.nextDelivery()

2、poll API方式
ChannelN:
GetResponse basicGet(String queue, boolean autoAck)
這種方式比較簡單,直接通過RPC從MQ Server端獲取隊列中的消息

 

 

Kafka、RabbitMQ、RocketMQ比較

 

Kafka:追求高吞吐量,不支持事務,對消息的重復、丟失、錯誤沒有嚴格要求,適合產生大量數據的互聯網服務的數據收集業務。

 

RabbitMQ:對數據一致性、穩定性和可靠性要求很高的場景,對性能和吞吐量的要求還在其次。

 

RocketMQ:具有高吞吐量、高可用性、適合大規模分布式系統應用的特點。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM