目錄
前言
1.什么是RabbitMQ?
2.同步調用的優缺點
3.異步調用的優缺點
3.1優點:
3.2異步調用的問題是什么?
4技術選型
4.1AMQP協議就是:
4.2kafka和RabbitMQ的使用場景
5.安裝RabitMq
6.rabitmq的整體架構?
7.RabibtMQ的快速入門
7.1小結:
8.數據隔離
9.任務模型workqueue
10.Fanout交換機
總結
前言
這是我學習RabbitMQ總結的筆記,RabbitMQ是很強大的消息隊列組件,是學習java路上不可缺少的一部分,越學越覺得自己無知,繼續加油,歡迎大家閱讀本文!!相信閱讀后大家可以對RabbitMQ有簡單的認識
1.什么是RabbitMQ?
RabbitMQ 是一個開源的消息代理軟件(有時也被稱為面向消息的中間件),它實現了高級消息隊列協議(AMQP),在分布式系統中扮演著重要的角色。可以使用mq實現異步通信
2.同步調用的優缺點
- 優點:
- 時效性強,等待到結果才會返回
- 缺點:
- 可拓展性差,每次都需要修改各個模塊的代碼
- 性能下降
- 級聯失敗問題
3.異步調用的優缺點
- 異步調用通常是基于消息通知的方式,包含三個角色:
- 消息發送者:投遞消息的人,就是原來的調用者
- 消息接收者:接收和處理消息的人,就是原來的服務提供者
- 消息代理:管理、暫存、轉發消息,你可以把它理解成微信服務器,或者是一個中轉站
- 消息發送者
- 消息代理:一般是消息隊列這里使用RabitMQ 就是broker
- 消息接收者
3.1優點:
- 解除耦合,拓展性強
- 無需等待,性能好
- 故障隔離
- 緩存消息,流量削峰填谷(常見的場景就比如抖音賣貨321開始搶單,只有在那一會并發量較大,需要處理的流量多,而其他時候流量卻很少,這時候流量就像山峰和山谷,消息隊列可以實現流量的削峰填谷,實現流量的相對平穩被服務器處理)
3.2異步調用的問題是什么?
- 不能立即得到調用結果,時效性差
- 不確定下游業務執行是否成功
- 業務安全依賴于Broker的可靠性
我們在選擇消息隊列的時候盡量要選擇安全性可靠性高的消息隊列,如果消息隊列一出現問題,那么我們的消息全部丟失,這時候如果是一些支付消息,那就很糟糕了
4技術選型
市場上有許多的消息隊列供我們選擇,這里我們分析各個消息隊列的優缺點
4.1AMQP協議就是:
AMQP(Advanced Message Queuing Protocol)協議是一個開放標準的應用層協議,專為在分布式系統中實現可靠的消息傳遞和異步通信而設計。它定義了一套詳細的規范,涵蓋了消息的創建、發布、路由、接收以及確認等各個環節,確保消息能夠在不同的應用程序或系統之間準確無誤地傳輸,并且支持多種消息傳遞模式,如點對點、發布/訂閱等,以滿足不同業務場景的需求。同時,AMQP協議還具有良好的可擴展性和互操作性,允許不同的實現之間進行無縫集成和通信。(也就是不區分編程語言)
- 消息隊列就是我們進行異步調用模型的消息代理,broker
- kafka的單機吞吐量非常之高,可以達到幾百萬每秒,適合做一些大數據處理
- RocketMq單機吞吐量可以達到10w以上
- RabbitMQ一般在10w一下
4.2kafka和RabbitMQ的使用場景
可以看一下我之前寫的csdn分析過
點我
支持鏡像集群,可用性高
5.安裝RabitMq
這里使用docker安裝更加方便
之前有寫過docker的安裝教程點我
docker run \-e RABBITMQ_DEFAULT_USER=itheima \ 用戶名-e RABBITMQ_DEFAULT_PASS=123321 \ 密碼-v mq-plugins:/plugins \ 數據卷掛載--name mq \ 容器名字--hostname mq \ 主機名字-p 15672:15672 \ 客戶端端口-p 5672:5672 \ 接受信息端口--network hm-net\ 網絡-d \rabbitmq:3.8-management
6.rabitmq的整體架構?
這里我們就可以知道消息發送者將消息發送給交換機,然后根據交換機的不同類型,不同策略去將消息發送給我們的隊列,然后再由我們的消費者去消費。
交換機有不同類型目前剛學到Fanout(廣播)
7.RabibtMQ的快速入門
在學習一門技術我們一般可以先去學習如何使用,快速入門,然后根據功能逐步擴展,這里我們選擇快速入門實踐我們的RabbitMQ
rabitmq客戶端的地址。這里是我的虛擬機地址
綁定了兩個隊列
發送消息
rabitMq的客戶端的功能相當全面,我們可以查看我們發送的消息,而不用消費者
7.1小結:
交換機只能進行路由消息無法存儲消息,如果我們沒有給交換機綁定消息隊列,那么我們的消息就會丟失,因此必須進行交換機綁定
8.數據隔離
我們在開發的時候往往希望不同的業務和項目再使用我們的mq服務時候,數據數據是隔離的,因此我們會采取給不同的業務和項目賦予不同的用戶,然后再給用戶賦予不同的虛擬主機,以此來實現數據隔離
9.任務模型workqueue
workqueue:可以加快我們消費者消費的速度,就比如在一些高并發場景下我們可以讓多個消費者去同時監聽一個隊列,可以解決消息堆積問題
可以簡單的去模擬我們的任務模型在java當中
生產者
消費者
默認采取輪詢的策略,為了實現能者多勞,我們可以修改配置,如下
workqueue任務模型
- 多個消費者綁定到一個隊列,可以加快消息處理速度
- 同一條消息只會被一個消費者處理
- 通過設置prefetch來控制消費者預取的消息數量,處理完一條再處理下一條,實現能者多勞
10.Fanout交換機
交換機的作用主要是接收發送者發送的消息,并將消息路由到與其綁定的隊列。
常見交換機的類型有以下三種:
- Fanout:廣播
- Direct:定向
- Topic:話題
fanout交換機是廣播,每一個與其綁定的queue都可以接收消息,所以也叫廣播模式
可以看一下代碼的簡單實現。
消費者
生產者
總結
RabbitMQ 是一款開源的消息代理軟件,實現了 AMQP 協議,在分布式系統異步通信中發揮關鍵作用。與同步調用相比,異步調用借助消息發送者、接收者和 RabbitMQ 這樣的消息代理,雖然犧牲了時效性、難以確定業務執行狀態且依賴代理可靠性,但具備解除耦合、提升性能、隔離故障以及流量削峰填谷等優勢。在技術選型上,RabbitMQ 單機吞吐量一般在 10w 以下,相比 Kafka 的數百萬每秒、RocketMQ 的 10w 以上,更適用于對可用性要求高的場景。通過 Docker 可便捷安裝 RabbitMQ,其架構中交換機負責消息路由,如 Fanout 交換機采用廣播模式將消息分發至所有綁定隊列。使用時,交換機必須綁定隊列以防止消息丟失,還可通過用戶和虛擬主機實現數據隔離;workqueue 任務模型支持多消費者綁定同一隊列加速消息處理,通過設置 prefetch 實現能者多勞 。