【Fifty Project - D31】

結束了一個超級消耗周末,滿安排之健身+梅溪湖游泳+做飯喝酒+羽毛球賽
完全力竭了,久久不能恢復過來,暫停健身安排了 端午后再繼續

今日完成記錄

TimePlan完成情況
7:30 - 8:10有氧爬坡
9:00 - 11:00RabbitMQ學習
12:00 - 14:30繼續RabbitMQ學習
14:30 - 17:30小論文2

RabbitMQ

整體架構以及核心概念

rabbitmq由消息生產者publisher、消息消費者consumer以及消息代理server broker構成,生產者生產消息,消息代理根據規則將消息放在消息隊列中,消費者從消息隊列消費消息。

什么是rabbitmq server broker?

rabbitmq server broker是一種消息代理(message broker),它由exchange交換機、queue消息隊列和binding路由規則組成,規定了消息如何傳遞。

為什么需要broker?(broker的好處)

  1. 解耦生產者和消費者,實現異步通信!
  2. 提供靈活的路由策略(一對一【直連】,一對多【主題、扇出】)
  3. 支持消息持久化、重試等高級功能

什么是virtual host?

(簡稱vhost)
vhost是RabbitMQ的邏輯隔離機制,類似于文件系統中的目錄或者數據庫中的schema。它允許在同一個rabbitmq server上創建多個獨立環境,每個vhost有自己的exchange、queue、binding和權限,彼此互不干擾。

vhost和集群的關系?

  1. vhost是邏輯隔離,集群式物理部署
  2. 集群中所有節點都會同步vhost定義,但隊列數據默認只存儲在創建它的節點上(除非配置鏡像隊列)

vhost能跨服務器共享嗎?

  • 不能。vhost是單服務器內的邏輯概念,不同mq server之間vhost完全獨立。

Rabbit MQ架構

快速實戰(Java)

這里直接使用spring提供的基于RabbitMQ的消息收發模板:SpringAMQP

maven依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

環境配置

基本配置如下,部署rabbitmq的主機ip、端口、業務對應虛擬主機、用戶名、密碼

spring:rabbitmq:host: 192.168.4.144port: 5672virtual-host: /hmallusername: hmallpassword: 123321

發送信息

@Autowired
RabbitMQTemplate rt;String queueName = "hello.queue";
String msg = "hello mq";
// 使用
rt.convertAndSend(queueName, msg);

消費消息

@RabbitListener(queues = "hello.queue")
public void ListenSimpleQueue(String msg){System.out.println(msg);
}

上面兩部分中的消息,并非一定是String類型,任意類型都可以,SpringAMQP會自動進行類型轉換。

WorkQueues模型

任務模型,就是讓多個消費者綁定到同一個隊列,共同消費隊列中的消息。
(1)接下來代碼實現兩個消費者綁定在同一個隊列上以每秒50條消息的速度消費消息,并且由一個生產者以每秒鐘50條消息的速度生產消息。

生產者

@SpringBootTest
public class MQTest {@Autowiredprivate RabbitTemplate rt;@Testvoid testSendMQHello() throws InterruptedException {for(int i = 0; i < 50; i ++ ) {Thread.sleep(20);rt.convertAndSend("hello.queue", "hello, dame mq + " + i + " 號消息");}}
}

消費者

@Slf4j
@Component
public class MyMQListener {@RabbitListener(queues = "hello.queue")public void listenSimpleQueue1(String msg){System.out.println("消費者1收到了simple.queue的消息                :【" + msg +"】");try {Thread.sleep(20);}   catch (InterruptedException e) {}}@RabbitListener(queues = "hello.queue")public void listenSimpleQueue2(String msg){System.out.println("消費者2收到了simple.queue的消息:【" + msg +"】");try {Thread.sleep(20);}   catch (InterruptedException e) {}}
}

結果如下:兩個消費者依次消費生產者產生的消息
在這里插入圖片描述

(2)實際上部署在不同設備上的代碼執行速度會因為設備性能而表現有所差異,因此接下來修改消費者代碼,將一個消費者消費速度改為5個消息一秒鐘,觀察一下結果

@RabbitListener(queues = "hello.queue")public void listenSimpleQueue2(String msg){System.out.println("消費者2收到了simple.queue的消息:【" + msg +"】");try {Thread.sleep(200);}   catch (InterruptedException e) {}}

結果如下,我們發現消費者2消費速度下降了以后,它們消費的編號依舊沒有區別,也就是隊列分配給不同性能的消費者相同的消息量,不考慮消費者的實際消費能力,這樣會導致性能差的機器持續阻塞很多消息,而性能好的機器空閑。
在這里插入圖片描述
(3)SpringAMQP中提供了prefetch的設置,可以限制消費者獲取消息隊列中消息的數量

spring:rabbitmq:listener:simple:prefetch: 1

設置后測試,結果如下:可見消費能力強的消費者1不再是固定地消費編號為02468的消息,而是消費了02345678,也就是每個消費者每次只能取一條消息,消費完成后再取下一個消息。
在這里插入圖片描述

交換機類型

交換機沒有存儲消息的能力,只負責轉發消息,因此如果沒有任何隊列和交換機綁定,或者沒有符合路由規則的隊列,那么消息會丟失。
交換機一共有四種:

  • Fanout:扇出型,廣播給所有綁定到交換機的隊列
  • Direct:訂閱型,基于RouteKey發送給訂閱了消息的隊列
  • Topic:主題訂閱,根據通配符匹配RoutingKey進行轉發
  • Headers:頭匹配

Fanout交換機

Fanout交換機
如圖,fanout交換機接收到生產者的消息會將其路由給所有綁定的消息隊列,消息會在每個消息隊列中被消費一次

Direct交換機

direct exchange
如圖,direct exchange會根據消息的routing key 匹配相同的key發送到消息隊列中

Topic交換機

Topic Exchange
如圖,Topic Exchange也是使用routing key匹配binding key,但是允許bindingkey使用通配符。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84536.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84536.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84536.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

信息學奧賽一本通 1547:【 例 1】區間和

【題目鏈接】 ybt 1547&#xff1a;【 例 1】區間和 【題目考點】 1. 線段樹 2. 樹狀數組 【解題思路】 本題要求維護區間和&#xff0c;實現單點修改、區間查詢。 解法1&#xff1a;線段樹 線段樹原理&#xff0c;及實現方法見&#xff1a;洛谷 P3374 【模板】樹狀數組…

力扣面試150題--求根節點到葉節點數字之和

Day 48 題目描述 思路 我們利用sum這個全局變量來保存總和值&#xff0c;遞歸函數sum來計算每個根到葉子節點路徑所代表的數&#xff0c;由于我們需要遍歷到每條根到葉子節點的路徑&#xff0c;所有我采取了前序遍歷&#xff0c;如果不是葉子節點&#xff0c;就計算到該節點代…

DJI上云API官方demo學習

1、websocket&#xff0c;所在位置如下圖&#xff0c;調用的可以用//websocket搜索 2、用到的http客戶端&#xff0c;axios 3、很多和后端交互都是走的http請求

uniapp開發小程序,如何根據權限動態配置按鈕或頁面內容

前言 寫了好幾個項目&#xff0c;發現小程序對權限控制非常麻煩&#xff0c;于是有了這個想法&#xff0c;但是網上找了一圈沒有一個比較完善的講解&#xff0c;因為小程序不支持自定義指令&#xff0c;所以不能像后臺那樣方便&#xff0c;于是就將幾個博主的想法結合。 思路就…

LSTM+Transformer混合模型架構文檔

LSTMTransformer混合模型架構文檔 模型概述 本項目實現了一個LSTMTransformer混合模型&#xff0c;用于超臨界機組協調控制系統的數據驅動建模。該模型結合了LSTM的時序建模能力和Transformer的自注意力機制&#xff0c;能夠有效捕捉時間序列數據中的長期依賴關系和變量間的復…

測量尺子:多功能測量工具,科技改變生活

測量尺子是一款專業的測距儀測量萬能工具箱類型手機APP&#xff0c;旨在為用戶提供最貼心的測量助手。它擁有和現實測量儀器一樣的測量標準&#xff0c;更簡單便捷且精準的測量方式&#xff0c;最新AR科技測量更是大大拓寬了可以被測量的高度和深度。無論是日常使用、學習還是工…

結課作業01. 用戶空間 MPU6050 體感鼠標驅動程序

目錄 一. qt界面實現 二. 虛擬設備模擬模擬鼠標實現體感鼠標 2.1 函數聲明 2.2 虛擬鼠標實現 2.2.1 虛擬鼠標創建函數 2.2.2 鼠標移動函數 2.2.3 鼠標點擊函數 2.3 mpu6050相關函數實現 2.3.1 i2c設備初始化 2.3.2 mpu6050寄存器寫入 2.3.3 mpu6050寄存器讀取 2.3.…

深入淺出 Python Testcontainers:用容器優雅地編寫集成測試

在現代軟件開發中&#xff0c;自動化測試已成為敏捷開發與持續集成中的關鍵環節。單元測試可以快速驗證函數或類的行為是否符合預期&#xff0c;而集成測試則確保多個模塊協同工作時依然正確。問題是&#xff1a;如何讓集成測試可靠、可重復且易于維護&#xff1f; 這時&#…

JVM 的垃圾回收器

新生代回收器 通性 會觸發StW&#xff0c;暫停所有應用線程復制算法 Serial 單線程回收適合單線程系統 ParNew 多線程回收優先保證響應速度&#xff0c;降低 STW&#xff08;STW 越大&#xff0c;執行垃圾回收的時間越長&#xff0c;回收的垃圾越多&#xff0c;減少垃圾回…

【筆記】排查并解決Error in LLM call after 3 attempts: (status code: 502)

#工作記錄 一、問題描述 在部署運行部署對沖基金分析工具 ai-hedge-fund 時&#xff0c;不斷出現以下報錯&#xff0c;導致項目運行異常&#xff1a; Error in LLM call after 3 attempts: (status code: 502) Error in LLM call after 3 attempts: [WinError 10054] 遠程主…

GO 語言進階之 Template 模板使用

更多個人筆記見&#xff1a; github個人筆記倉庫 gitee 個人筆記倉庫 個人學習&#xff0c;學習過程中還會不斷補充&#xff5e; &#xff08;后續會更新在github上&#xff09; 文章目錄 Template 模板基本示例語法1. 基本輸出語法2. 控制結構3. 空白字符控制4. Must函數 Temp…

origin繪圖之【如何將多條重疊、高度重疊的點線圖、折線圖分開】

在日常的數據可視化工作中&#xff0c;Origin 作為一款功能強大的科研繪圖軟件&#xff0c;廣泛應用于實驗數據處理、結果展示與論文圖表制作等領域。然而&#xff0c;在處理多組數據、特別是繪制多條曲線的折線圖或點線圖時&#xff0c;常常會遇到這樣一個困擾&#xff1a;多條…

Java基礎 Day19

一、泛型&#xff08;JDK5引入&#xff09; 1、基本概念 在編譯階段約束操作的數據類型&#xff0c;并進行檢查 好處&#xff1a;統一數據類型&#xff0c;將運行期的錯誤提升到了編譯期 泛型的默認類型是 Object 2、泛型類 在創建類的時候寫上泛型 在創建具體對象的時候…

Gitlab-Runner安裝

文章目錄 helm方式安裝在K8S上參考gitlab CI/CD 文件變量緩存服務器K8S部署 docker鏡像mavendocker安裝docker buildx minionodehelmkubectlsonar-scanner-cli 問題清除cachehelm執行時無權限 下載鏡像失敗下載gitlab-runner鏡像失敗 Gitlab-ci中使用java前端 helm方式安裝在K8…

在 Ubuntu linux系統中設置時區的方案

查看時區 在 Ubuntu 系統中&#xff0c;可以通過以下方法查看當前時區設置&#xff1a; 1. 使用 timedatectl 命令&#xff08;推薦&#xff09; 在終端運行以下命令&#xff1a; timedatectl輸出示例&#xff1a; Local time: Sun 2025-05-25 10:30:00 CST Universal t…

YOLOv8模型剪枝筆記(DepGraph和Network Slimming網絡瘦身)

文章目錄 一、DepGraph剪枝(1)項目準備1)剪枝基礎知識2)DepGraph剪枝論文解讀12)DepGraph剪枝論文解讀23)YOLO目標檢測系列發展史4)YOLO網絡架構(2)項目實戰(YOLOv8應用DepGraph剪枝+finetune)1)安裝軟件環境(基礎環境、Pytorch、YOLOv8)Windows1)安裝軟件環境(…

MySQL:11_事務

事務 一.CURD不加控制&#xff0c;會有什么問題&#xff1f; 二.什么是事務&#xff1f; 事務就是一組DML語句組成&#xff0c;這些語句在邏輯上存在相關性&#xff0c;這一組DML語句要么全部成功&#xff0c;要么全部失敗&#xff0c;是一個整體。MySQL提供一種機制&#xf…

【notepad++如何設置成中文界面呢?】

“Notepad”是一款非常強大的文本編輯軟件&#xff0c;將其界面設置成中文的方法如下&#xff1a; 一、工具&#xff0f;原料&#xff1a; 華為 Matebook 15、Windows 10、Notepad 8.4.6。 二 、具體步驟&#xff1a; 1、找到任意一個文本文件&#xff0c;比如 txt 格式的文…

職坐標嵌入式MCU/DSP與RTOS開發精講

嵌入式系統開發作為現代智能設備與工業控制的核心技術領域&#xff0c;其架構設計與實現邏輯直接影響系統性能與可靠性。本課程以嵌入式系統架構為切入點&#xff0c;系統化梳理從硬件選型到軟件調度的全鏈路知識體系&#xff0c;重點聚焦微控制器&#xff08;MCU&#xff09;與…

雙深度Q網絡(Double DQN)基礎解析與python實例:訓練穩定倒立擺

目錄 1. 前言 2. Double DQN的核心思想 3. Double DQN 實例&#xff1a;倒立擺 4. Double DQN的關鍵改進點 5. 雙重網絡更新策略 6. 總結 1. 前言 在強化學習領域&#xff0c;深度Q網絡&#xff08;DQN&#xff09;開啟了利用深度學習解決復雜決策問題的新篇章。然而&am…