最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中RabbitMQ的使用小結(jié)

 更新時(shí)間:2025年12月17日 11:25:14   作者:wangnaisheng  
RabbitMQ是一個(gè)開源的消息隊(duì)列中間件,用于實(shí)現(xiàn)應(yīng)用程序之間的異步通信,本文主要介紹了C#中RabbitMQ的使用小結(jié),具有一定的參考價(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: 可能原因:

  1. 隊(duì)列沒有持久化
  2. 沒有正確綁定交換機(jī)和隊(duì)列
  3. 消費(fèi)者沒有正確訂閱
  4. 交換機(jī)類型不匹配(如用direct交換機(jī)但用fanout方式發(fā)送)

Q: 如何監(jiān)控RabbitMQ? A: 用Web管理界面(http://localhost:15672),或者用RabbitMQ的API進(jìn)行監(jiān)控。

八、其他類似中間件對(duì)比總結(jié)表

九、選擇建議

  1. 如果你需要低延遲、簡(jiǎn)單路由 → 選RabbitMQ
  2. 如果你處理海量數(shù)據(jù)、日志收集 → 選Kafka
  3. 如果你需要順序消息、電商場(chǎng)景 → 選RocketMQ
  4. 如果你需要多協(xié)議支持、復(fù)雜路由 → 選ActiveMQ
  5. 如果你追求極致速度、不關(guān)心數(shù)據(jù)丟失 → 選ZeroMQ
  6. 如果你做云原生應(yīng)用、需要長(zhǎng)期存儲(chǔ) → 選Pulsar

到此這篇關(guān)于C#中RabbitMQ的使用小結(jié)的文章就介紹到這了,更多相關(guān)C# RabbitMQ使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

通渭县| 万源市| 黎城县| 枞阳县| 武城县| 班玛县| 宁城县| 青浦区| 阿尔山市| 曲阜市| 西和县| 德钦县| 星座| 黄平县| 宿松县| 中宁县| 安达市| 九江市| 台湾省| 廉江市| 漠河县| 镇雄县| 商丘市| 金平| 高淳县| 台江县| 泉州市| 西宁市| 灯塔市| 西昌市| 古交市| 峨眉山市| 靖江市| 汉寿县| 玉树县| 女性| 诸暨市| 吴江市| 兴业县| 彭州市| 安陆市|