RabbitMQ 消息隊列編程

安裝與配置

安裝 RabbitMQ

讀者可以在 RabbitMQ 官方文檔中找到完整的安裝教程:Downloading and Installing RabbitMQ — RabbitMQ

本文使用 Docker 的方式部署。

RabbitMQ 社區鏡像列表:https://hub.docker.com/_/rabbitmq

創建目錄用于映射存儲卷:

mkdir -p /opt/lib/rabbitmq

部署容器:

docker run -itd --name rabbitmq -p 5672:5672 -p 15672:15672 \
-v /opt/lib/rabbitmq:/var/lib/rabbitmq \
rabbitmq:3.12.8-management

部署時占用兩個端口。5672 是 MQ 通訊端口,15672 是 Management UI 工具端口。

打開 15672 端口,會進入 Web 登錄頁面,默認賬號密碼都是 guest。

image-20231114142145244

image-20231114142240075

關于 RabbitMQ Management UI 的使用方法,后續再介紹。

打開管理界面后會,在?Exchanges?菜單中,可以看到如下圖表格。這些是默認的交換器。現在可以不需要了解這些東西,后面會有介紹。

Virtual hostNameTypeFeatures
/(AMQP default)directD
/amq.directdirectD
/amq.fanoutfanoutD
/amq.headersheadersD
/amq.matchheadersD
/amq.rabbitmq.tracetopicD I
/amq.topictopicD

image-20231114142616280

發布與訂閱模型

使用 C# 開發 RabbitMQ,需要使用 nuget 引入 RabbitMQ.Client,官網文檔地址:.NET/C# RabbitMQ Client Library — RabbitMQ

在繼續閱讀文章之前,請先創建一個控制臺程序。

生產者、消費者、交換器、隊列

為了便于理解,本文制作了幾十張圖片,約定一些圖形表示的含義:

對應生產者,使用如下圖表示:

p

對于消費者,使用如下圖表示:

C

對于消息隊列,使用如下圖表示:

Q

對于交換器,使用如下圖表示:

X

在 RabbitMQ 中,生產者發布的消息是不會直接進入到隊列中,而是經過交換器(Exchange) 分發到各個隊列中。前面提到,部署 RabbitMQ 后,默認有 七個交換器,如?(AMQP default)amq.direct?等。

當然,對于現在來說,我們不需要了解交換器,所以,在本節的教程中,會使用默認交換器完成實驗。

忽略交換器存在的情況下,我們可以將生產和消費的流程簡化如下圖所示:

s1

請一定要注意,圖中省略了交換器的存在,因為使用的是默認的交換器。但是生產者推送消息必須是推送到交換器,而不是隊列,這一句一定要弄清楚。

對于消費者來說,要使用隊列,必須確保隊列已經存在。


ConnectionFactory factory = new ConnectionFactory
{HostName = "localhost"
};// 連接
using IConnection connection = factory.CreateConnection();// 通道
using IModel channel = connection.CreateModel();channel.QueueDeclare(// 隊列名稱queue: "myqueue",// 持久化配置,隊列是否能夠在 broker 重啟后存活durable: false,// 連接關閉時被刪除該隊列exclusive: false,// 當最后一個消費者(如果有的話)退訂時,是否應該自動刪除這個隊列autoDelete: false,// 額外的參數配置arguments: null);

編寫一個消費者,消費該隊列中的消息,其完整代碼如下:

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;ConnectionFactory factory = new ConnectionFactory
{HostName = "localhost"
};using IConnection connection = factory.CreateConnection();
using IModel channel = connection.CreateModel();channel.QueueDeclare(// 隊列名稱queue: "myqueue",// 持久化配置,隊列是否能夠在 broker 重啟后存活durable: false,// 連接關閉時被刪除該隊列exclusive: false,// 當最后一個消費者(如果有的話)退訂時,是否應該自動刪除這個隊列autoDelete: false,// 額外的參數配置arguments: null);// 定義消費者
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{var message = Encoding.UTF8.GetString(ea.Body.Span);Console.WriteLine($" [x] Received {message}");
};// 開始消費
channel.BasicConsume(queue: "myqueue",autoAck: true,consumer: consumer);Console.ReadLine();

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

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

相關文章

YOLOv5 分類模型 預處理 OpenCV實現

YOLOv5 分類模型 預處理 OpenCV實現 flyfish YOLOv5 分類模型 預處理 PIL 實現 YOLOv5 分類模型 OpenCV和PIL兩者實現預處理的差異 YOLOv5 分類模型 數據集加載 1 樣本處理 YOLOv5 分類模型 數據集加載 2 切片處理 YOLOv5 分類模型 數據集加載 3 自定義類別 YOLOv5 分類模型…

Bin、Hex、ELF、AXF的區別

1.Bin Bin文件是最純粹的二進制機器代碼, 或者說是"順序格式"。按照assembly code順序翻譯成binary machine code,內部沒有地址標記。Bin是直接的內存映象表示,二進制文件大小即為文件所包含的數據的實際大小。 BIN文件就是直接的二進制文件&…

關于python 語音轉字幕,字幕轉語音大雜燴

文字轉語音 Python語音合成之第三方庫gTTs/pyttsx3/speech橫評(內附使用方法)_python_腳本之家 代碼示例 from gtts import gTTStts gTTS(你好你在哪兒!,langzh-CN)tts.save(hello.mp3)import pyttsx3engine pyttsx3.init() #創建對象"""語速"…

目前比較好用的護眼臺燈,小學生適合的護眼臺燈推薦

隨著技術的發展,燈光早已成為每家每戶都需要的東西。但是燈光不好可能會對眼睛造成傷害是很多人沒有注意到的。現在隨著護眼燈產品越來越多,市場上臺燈的選擇越來越多樣化,如何選擇一個對眼睛無傷害、無輻射的臺燈成為許多家長首先要考慮的問…

【C++初階】四、類和對象(構造函數、析構函數、拷貝構造函數、賦值運算符重載函數)

相關代碼gitee自取: C語言學習日記: 加油努力 (gitee.com) 接上期: 【C初階】三、類和對象 (面向過程、class類、類的訪問限定符和封裝、類的實例化、類對象模型、this指針) -CSDN博客 引入:類的六個默認成員函數…

如何使用springboot服務端接口公網遠程調試——實現HTTP服務監聽

🌈個人主頁:聆風吟 🔥系列專欄:網絡奇遇記、Cpolar雜談 🔖少年有夢不應止于心動,更要付諸行動。 文章目錄 📋前言一. 本地環境搭建1.1 環境參數1.2 搭建springboot服務項目 二. 內網穿透2.1 安裝…

ATA-2042高壓放大器在細胞的剪切應力傳感器研究中的應用

微流控技術是一種通過微小的通道和微型裝置對流體進行精確操控和分析的技術。它是現代醫學技術發展過程中的一種重要的生物醫學工程技術,具有廣泛的應用前景和重要性。它在高通量分析、個性化醫療、細胞篩選等方面有著巨大的潛力,Aigtek安泰電子今天就將…

.Net面試題4

1.請解釋一下泛型(Generics)在C#中的作用。 泛型是一種將數據類型參數化的機制,使得代碼可以在編譯時具有更強的類型安全性和靈活性。C#中的泛型可以用于類、接口、方法等的定義和實例化。泛型允許在編寫代碼時使用具有不同實參的類型&#x…

HR8833 雙通道H橋電機驅動芯片

HR8833為玩具、打印機和其它電機一T化應用提供一種雙通道電機驅動方案。HR8833提供兩種封裝,一種是帶有L露焊盤的TSSOP-16封裝,能改進散熱性能,且是無鉛產品,引腳框采用100%無錫電鍍。另一種封裝為SOP16,不…

智駕芯片全矩陣「曝光」,這家企業的車載品牌正式官宣

隨著汽車智能化加速,智能駕駛芯片格局逐漸清晰。 針對L0-L2,業內基本采用智能前視一體機方案;要實現高速NOA、城市NOA等更為高階的智駕功能等,則基本采用域控制器方案。從前視一體機至域控,再逐步演進到艙駕一體、中央…

python基于DETR(DEtection TRansformer)開發構建鋼鐵產業產品智能自動化檢測識別系統

在前文中我們基于經典的YOLOv5開發構建了鋼鐵產業產品智能自動化檢測識別系統,這里本文的主要目的是想要實踐應用DETR這一端到端的檢測模型來開發構建鋼鐵產業產品智能自動化檢測識別系統。 DETR (DEtection TRansformer) 是一種基于Transformer架構的端到端目標檢…

springboot項目修改項目名稱

參考該文章正確修改項目名稱:SpringBoot項目怎么重命名_springboot修改項目名稱-CSDN博客

【Lodash】 Filter 與Map 的結合使用

用Filter過濾數據之后,想給某個字段重新賦值 在使用 filter() 方法過濾數據后,如果你想給某個字段賦值,你可以使用 map() 方法來修改數組中的元素。map() 方法可以對數組中的每個元素應用一個函數,并返回一個新的數組。 以下是一…

【Django使用】10大章31模塊md文檔,第5篇:Django模板和數據庫使用

當你考慮開發現代化、高效且可擴展的網站和Web應用時,Django是一個強大的選擇。Django是一個流行的開源Python Web框架,它提供了一個堅實的基礎,幫助開發者快速構建功能豐富且高度定制的Web應用 全套Django筆記直接地址: 請移步這…

外匯天眼:多名投資者賬戶被惡意清空,遠離volofinance!

最近,外匯平臺volofinance因有多名投資者投訴,“榮幸”成為外匯天眼黑平臺榜單中的一員,那么volofinance到底做了什么導致投資者前來投訴曝光呢? 起底volofinace 在網絡搜索中,關于volofinance的信息少之又少&#xf…

成為AI產品經理——模型評估指標

目錄 一、模型評估分類 1.在線評估 2.離線評估 二、離線模型評估 1.特征評估 ① 特征自身穩定性 ② 特征來源穩定性 ③ 特征成本 2.模型評估 ① 統計性評估 覆蓋度 最大值、最小值 分布形態 ② 模型性能指標 分類問題 回歸問題 ③ 模型的穩定性 模型評估指標分…

配置mvn打包參數,不同環境使用不同的配置文件

方法一: 首先在/resource目錄下創建各自環境的配置 要在不同的環境中使用不同的配置文件進行Maven打包,可以使用Maven的profiles特性和資源過濾功能。下面是配置Maven打包參數的步驟: 在項目的pom.xml文件中,添加profiles配置…

python 負數 處理

num_negative -4 print(num_negative) num_dec_to_hex hex(num_negative) print(負數轉十六進制: num_dec_to_hex) /---------------------------------------------------------/ -4 負數轉十六進制:-0x4通過上面代碼片段可以看到,python…

第一個Mybatis項目

(一)為什么要用Mybatis? (1)Mybatis對比JDBC而言,sql(單獨寫在xml的配置文件中)和java編碼分開,功能邊界清晰,一個專注業務,一個專注數據。 (2&…

【C++】:多態

朋友們、伙計們,我們又見面了,本期來給大家解讀一下有關多態的知識點,如果看完之后對你有一定的啟發,那么請留下你的三連,祝大家心想事成! C 語 言 專 欄:C語言:從入門到精通 數據結…