RabbitMQ原理RabbitMQ各组件作用RabbitMQ使用场景
生活随笔
收集整理的這篇文章主要介紹了
RabbitMQ原理RabbitMQ各组件作用RabbitMQ使用场景
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
RabbitMQ原理
RabbitMQ介紹
- MQ全稱為Message Queue, 是一種分布式應用程序的的通信方法,它是消費-生產者模型的一個典型的代表
- producer往消息隊列中不斷寫入消息,而另一端consumer則可以讀取或者訂閱隊列中的消息
- RabbitMQ是一個遵循AMQP協議的消息中間件,它從生產者接受消息并傳遞給消費者,在這和過程中,根據路由規則就行路由、緩存和持久化
- 業務上,可以實現服務提供者和消費者之間的數據解耦,提供高可用性的消息傳輸機制,在實際生產中應用相當廣泛
Rabbitmq系統最核心的組件:Exchange和Queue
- clientA生產消息,發送給服務器端的Exchange1
- Exchange1收到消息,根據ROUTINKEY,將消息轉發給匹配的Queue1
- Queue1收到消息,將消息發送給訂閱者Client1
- Client1收到消息,發送ACK給隊列確認收到消息
- Queue1收到ACK,刪除隊列中緩存的此條消息
RabbitMQ各組件作用:
# 1、Publisher:是Message的生產者,Publisher這個Clients產生了一些Message。# 2、Consumer:Message的消費者,Publisher產生的Message,最終要到達Consumer這個Clients,進行消費。# 3、Exchange:指定消息按什么規則,路由到哪個Queue,Message消息先要到達Exchange,在Server中承擔著從Produce接收Message的責任。# 4、Queue:到達Exchange的消息,根據制定的規則(Routing key)到達對應的Queue, # 在Server中承擔著裝載Message,是Message的容器,等待被消費出去。# 5、Routing key:在Exchange和Queue之間隱藏有一條黑線,可以將這條黑線看成是Routing key, # Exchange就是根據這些定義好的Routing key,將Message送到對應的Queue中去,是Exchange和Queue之間的橋梁。# 6、Broker:之前一直不理解這個Broker,其實Broker就是接收和分發消息的應用,也就是說RabbitMQ Server就是Message Broker。# 7、VirtualHost:虛擬主機,一個Broker里可以開有多個VirtualHost,它的作用是用作不同用戶的權限分離。 # 8、Connection:是Publisher/Consumer和Broker之間的TCP連接。 # 斷開連接的操作只會在Publisher/Consumer端進行,Broker不會斷開連接,除非出現網絡故障或者Broker服務出現問題,Broker服務宕了。# 9、Connection: Channel: 如果每一次訪問RabbitMQ就建立一個Connection,那在消息量大的時候建立TCP Connection的開銷就會很大, # 導致的后果就是效率低下。Queue(組件1)
- 消息隊列,提供了FIFO的處理機制,具有緩存消息的能力,rabbitmq中,隊列消息可以設置為持久化,臨時或者自動刪除
- 設置為持久化的隊列,queue中的消息會在server本地硬盤存儲一份,防止系統crash,數據丟失
- 設置為臨時隊列,queue中的數據在系統重啟之后就會丟失
- 設置為自動刪除的隊列,當不存在用戶連接到server,隊列中的數據會被自動刪除
Exchange(組件2)
- Exchange類似于數據通信網絡中的交換機,提供消息路由策略
- rabbitmq中,producer不是通過信道直接將消息發送給queue,而是先發送給Exchange
- 一個Exchange可以和多個Queue進行綁定,producer在傳遞消息的時候,會傳遞一個ROUTING_KEY
- Exchange會根據這個ROUTING_KEY按照特定的路由算法,將消息路由給指定的queue
- 和Queue一樣,Exchange也可設置為持久化,臨時或者自動刪除
RabbitMQ使用場景
1、異步處理
- 在注冊服務的時候,如果同步串行化的方式處理,讓存儲數據、郵件通知等挨著完成,延遲較大
- 采用消息隊列,可以將郵件服務分離開來,將郵件任務之間放入消息隊列中,之間返回,減少了延遲,提高了用戶體驗
2、應用解耦
- 電商里面,在訂單與庫存系統的中間添加一個消息隊列服務器,在用戶下單后,訂單系統將數據先進行持久化處理
- 然后將消息寫入消息隊列,直接返回訂單創建成功,然后庫存系統使用拉/推的方式,獲取訂單信息再進行庫存操作
3、流量削鋒
- 秒殺活動中,一般會因為流量過大,導致流量暴增,應用掛掉。為解決這個問題,一般需要在應用前端加入消息隊列
- 服務器在接收到用戶請求后,首先寫入消息隊列,這時如果消息隊列中消息數量超過最大數量,則直接拒絕用戶請求或返回跳轉到錯誤頁面
- 秒殺業務根據秒殺規則讀取消息隊列中的請求信息,進行后續處理
4、日志處理:Kalfka消息中間件
RabbitMQ如何保證可靠消費
確認種類
1)一種是消息發送確認
- 這種是用來確認生產者將消息發送給交換器,交換器傳遞給隊列的過程中,消息是否成功投遞
- 發送確認分為兩步,一是確認是否到達交換器,二是確認是否到達隊列
2)第二種是消費接收確認
- 這種是確認消費者是否成功消費了隊列中的消息
消息發送確認(第一種)
- 如果設置了Mandatory屬性則當消息不能被正確路由到隊列中去時將會觸發ReturnCallback
- 是否到達交換器
- 是否到達隊列
1)ReturnCallback接口當消息從交換器發送到對應隊列失敗時觸發(比如根據發送消息時指定的routingKey找不到隊列時會觸發)
2)一旦消息被投遞到所有匹配的隊列之后Broker就會發送一個確認給生產者(包含消息的唯一ID),這就使得生產者知道消息已經正確到達目的隊列了
消費接收確(確認)
- 一旦發布一條消息生產者應用程序就可以在等信道返回確認的同時繼續發送下一條消息
- 當消息最終得到確認之后,生產者應用可以通過回調ACK方法來處理該確認消息
- 如果RabbitMQ因為自身內部錯誤導致消息丟失,生產者應用可以通過回調NACK方法來處理該確認消息
總結
以上是生活随笔為你收集整理的RabbitMQ原理RabbitMQ各组件作用RabbitMQ使用场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RabbitMQ面试题及答案
- 下一篇: MongoDB常见面试题及答案模板