C#中RabbitMQ的使用小結(jié)
一、RabbitMQ是什么?
RabbitMQ是一個(gè)開源的消息代理軟件,實(shí)現(xiàn)了AMQP(高級(jí)消息隊(duì)列協(xié)議),用來實(shí)現(xiàn)應(yīng)用程序之間的異步通信。簡(jiǎn)單說,它就像一個(gè)"消息郵局",生產(chǎn)者把消息投遞到"郵局",消費(fèi)者從"郵局"取走消息。
RabbitMQ:企業(yè)級(jí)消息中間件
RabbitMQ是一個(gè)開源的消息隊(duì)列中間件,作用是:
? 系統(tǒng)解耦:不同應(yīng)用間通過消息傳遞通信,無需直接依賴 ? 異步處理:將耗時(shí)操作放入隊(duì)列,提升系統(tǒng)響應(yīng)速度 ? 流量削峰:在高并發(fā)場(chǎng)景下緩沖請(qǐng)求,避免系統(tǒng)崩潰 ? 高可用:支持鏡像隊(duì)列和仲裁隊(duì)列,保證服務(wù)可用性
典型應(yīng)用:電商平臺(tái)用戶注冊(cè)后,通過RabbitMQ異步發(fā)送注冊(cè)郵件和短信;電商大促時(shí),用消息隊(duì)列緩沖訂單,避免下游系統(tǒng)被壓垮。
RabbitMQ是用Erlang語言寫的,但C#有很好的客戶端庫支持,特別適合企業(yè)級(jí)應(yīng)用。
二、環(huán)境準(zhǔn)備
2.1. 安裝RabbitMQ服務(wù)器
- Windows:下載安裝RabbitMQ(官網(wǎng)下載),安裝時(shí)記得同時(shí)安裝Erlang
- Linux:使用yum或apt安裝,或者用Docker
重要提示:安裝完成后,啟用Web管理插件(rabbitmq-plugins enable rabbitmq_management),然后訪問http://localhost:15672/,默認(rèn)賬號(hào)guest/guest
2.2. 安裝C#客戶端庫
# 使用NuGet安裝RabbitMQ.Client(官方客戶端) Install-Package RabbitMQ.Client # 如果喜歡更簡(jiǎn)單的封裝,可以安裝EasyNetQ(基于RabbitMQ.Client) Install-Package EasyNetQ
三、基礎(chǔ)使用示例
3.1. 簡(jiǎn)單發(fā)布/訂閱模式(使用RabbitMQ.Client)
發(fā)布者(Publisher):
using RabbitMQ.Client;
using System.Text;
class Program
{
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
// 聲明交換機(jī)(使用fanout類型,適合廣播)
channel.ExchangeDeclare(exchange: "logs", type: "fanout");
// 發(fā)送消息
string message = "Hello RabbitMQ from C#!";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "logs",
routingKey: "",
basicProperties: null,
body: body);
Console.WriteLine($" [x] Sent '{message}'");
}
}
}訂閱者(Consumer):
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;
class Program
{
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
// 聲明相同交換機(jī)
channel.ExchangeDeclare(exchange: "logs", type: "fanout");
// 創(chuàng)建臨時(shí)隊(duì)列(會(huì)自動(dòng)刪除)
var queueName = channel.QueueDeclare().QueueName;
// 綁定隊(duì)列到交換機(jī)
channel.QueueBind(queue: queueName,
exchange: "logs",
routingKey: "");
// 創(chuàng)建消費(fèi)者
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine($" [x] Received '{message}'");
};
channel.BasicConsume(queue: queueName,
autoAck: true,
consumer: consumer);
Console.WriteLine(" [*] Waiting for messages. To exit press CTRL+C");
Console.ReadLine();
}
}
}四、高級(jí)特性
4.1. 持久化消息(確保消息不丟失)
重要:必須同時(shí)設(shè)置交換機(jī)、隊(duì)列、消息為持久化,才能保證消息不丟失
// 發(fā)布者
channel.ExchangeDeclare(exchange: "persistent", type: "direct", durable: true);
channel.QueueDeclare(queue: "persistent_queue", durable: true);
channel.QueueBind(queue: "persistent_queue", exchange: "persistent", routingKey: "key");
var message = "Persistent message";
var body = Encoding.UTF8.GetBytes(message);
var properties = channel.CreateBasicProperties();
properties.Persistent = true; // 關(guān)鍵!設(shè)置為持久化
channel.BasicPublish(exchange: "persistent",
routingKey: "key",
basicProperties: properties,
body: body);4.2. 使用EasyNetQ簡(jiǎn)化代碼
EasyNetQ是RabbitMQ.Client的封裝,讓代碼更簡(jiǎn)潔:
// 安裝EasyNetQ
// Install-Package EasyNetQ
using EasyNetQ;
using System;
class Program
{
static void Main()
{
// 創(chuàng)建連接
var bus = RabbitHutch.CreateBus("host=localhost");
// 發(fā)布消息
bus.Publish(new Message { Text = "Hello EasyNetQ!" });
// 訂閱消息
bus.Subscribe<Message>("my-queue", message =>
{
Console.WriteLine($"Received: {message.Text}");
});
Console.WriteLine("Waiting for messages...");
Console.ReadLine();
}
}五、實(shí)際應(yīng)用場(chǎng)景
5.1.電商訂單處理(解耦系統(tǒng))
// 訂單服務(wù)(生產(chǎn)者)
public void CreateOrder(Order order)
{
// 處理訂單邏輯...
// 發(fā)布訂單消息到RabbitMQ
var bus = RabbitHutch.CreateBus("host=localhost");
bus.Publish(new OrderCreatedEvent { OrderId = order.Id });
}
// 郵件服務(wù)(消費(fèi)者)
bus.Subscribe<OrderCreatedEvent>("order-events", order =>
{
// 發(fā)送確認(rèn)郵件
EmailService.SendOrderConfirmation(order.OrderId);
});5.2.日志收集系統(tǒng)
// 日志服務(wù)(生產(chǎn)者)
public void Log(string message)
{
var bus = RabbitHutch.CreateBus("host=localhost");
bus.Publish(new LogMessage { Message = message, Timestamp = DateTime.UtcNow });
}
// 日志處理服務(wù)(消費(fèi)者)
bus.Subscribe<LogMessage>("log-queue", log =>
{
// 保存到數(shù)據(jù)庫或文件
LogRepository.Save(log);
});六、專業(yè)建議
連接管理:使用連接池,避免頻繁創(chuàng)建連接
// 使用連接工廠創(chuàng)建連接
var factory = new ConnectionFactory { HostName = "localhost" };
using (var connection = factory.CreateConnection())
{
// 用同一個(gè)連接創(chuàng)建多個(gè)channel
using (var channel = connection.CreateModel())
{
// ...
}
}- 錯(cuò)誤處理:不要只檢查連接狀態(tài),要處理所有可能的異常
try
{
// 消息處理邏輯
}
catch (Exception ex)
{
// 記錄錯(cuò)誤并重試
Console.WriteLine($"處理消息失敗: {ex.Message}");
}- 隊(duì)列持久化:生產(chǎn)環(huán)境中,幾乎所有的隊(duì)列都應(yīng)該是持久化的
channel.QueueDeclare(queue: "my-queue",
durable: true,
exclusive: false,
autoDelete: false);- 消息確認(rèn):使用手動(dòng)確認(rèn)(manual acknowledgment)確保消息被正確處理
channel.BasicConsume(queue: "my-queue",
autoAck: false, // 關(guān)鍵!設(shè)置為false
consumer: consumer);七、常見問題
Q: RabbitMQ和MQTT有什么區(qū)別? A: RabbitMQ是企業(yè)級(jí)消息中間件,適合應(yīng)用間通信;MQTT是物聯(lián)網(wǎng)專用輕量級(jí)協(xié)議,適合設(shè)備間通信。兩者可以結(jié)合使用,例如用MQTT收集物聯(lián)網(wǎng)設(shè)備數(shù)據(jù),用RabbitMQ處理業(yè)務(wù)邏輯。
Q: 為什么我的消息不見了? A: 可能原因:
- 隊(duì)列沒有持久化
- 沒有正確綁定交換機(jī)和隊(duì)列
- 消費(fèi)者沒有正確訂閱
- 交換機(jī)類型不匹配(如用direct交換機(jī)但用fanout方式發(fā)送)
Q: 如何監(jiān)控RabbitMQ? A: 用Web管理界面(http://localhost:15672),或者用RabbitMQ的API進(jìn)行監(jiān)控。
八、其他類似中間件對(duì)比總結(jié)表

九、選擇建議
- 如果你需要低延遲、簡(jiǎn)單路由 → 選RabbitMQ
- 如果你處理海量數(shù)據(jù)、日志收集 → 選Kafka
- 如果你需要順序消息、電商場(chǎng)景 → 選RocketMQ
- 如果你需要多協(xié)議支持、復(fù)雜路由 → 選ActiveMQ
- 如果你追求極致速度、不關(guān)心數(shù)據(jù)丟失 → 選ZeroMQ
- 如果你做云原生應(yīng)用、需要長(zhǎng)期存儲(chǔ) → 選Pulsar
到此這篇關(guān)于C#中RabbitMQ的使用小結(jié)的文章就介紹到這了,更多相關(guān)C# RabbitMQ使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 在C# .NET中使用RabbitMQ實(shí)現(xiàn)發(fā)布/訂閱模式的方法
- C#使用RabbitMQ的詳細(xì)教程
- C#使用RabbitMQ發(fā)送和接收消息工具類的實(shí)現(xiàn)
- C#?RabbitMQ的使用詳解
- C#通過rabbitmq實(shí)現(xiàn)定時(shí)任務(wù)(延時(shí)隊(duì)列)
- C#用RabbitMQ實(shí)現(xiàn)消息訂閱與發(fā)布
- C#利用RabbitMQ實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)消息傳輸
- c# rabbitmq 簡(jiǎn)單收發(fā)消息的示例代碼
- C#操作RabbitMQ的完整實(shí)例
相關(guān)文章
C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘五 棧和隊(duì)列
這節(jié)我們討論了兩種好玩的數(shù)據(jù)結(jié)構(gòu),棧和隊(duì)列2012-11-11
桌面浮動(dòng)窗口(類似惡意廣告)的實(shí)現(xiàn)詳解
本篇文章是對(duì)桌面浮動(dòng)窗口的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
C#實(shí)現(xiàn)textbox文本多行輸出且自動(dòng)換行輸出
在WinForms中通過設(shè)置TextBox的Multiline和WordWrap屬性實(shí)現(xiàn)多行輸出且自動(dòng)換行,可以通過設(shè)計(jì)器或代碼設(shè)置以上兩個(gè)屬性,文本輸出方法包括直接賦值、追加文本和循環(huán)輸出,完整示例代碼展示了設(shè)計(jì)器設(shè)置后的代碼實(shí)現(xiàn),需要的朋友可以參考下2026-04-04
c#中WebService的介紹及調(diào)用方式小結(jié)
這篇文章主要給大家介紹了關(guān)于c#中的WebService及其調(diào)用方式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
c#實(shí)現(xiàn)繁體轉(zhuǎn)簡(jiǎn)體的示例代碼
OpenCC是一個(gè)開源的中文繁簡(jiǎn)轉(zhuǎn)換工具,支持多種語言,這篇文章主要為大家介紹了C#如何使用OpenCC實(shí)現(xiàn)繁體轉(zhuǎn)簡(jiǎn)體功能,有需要的可以了解下2025-01-01
C#使用Json.Net對(duì)JSON與對(duì)象的序列化與反序列化
這篇文章介紹了Json.Net對(duì)JSON與對(duì)象的序列化與反序列化,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05

