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

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

 更新時間:2025年12月17日 11:25:14   作者:wangnaisheng  
RabbitMQ是一個開源的消息隊列中間件,用于實現(xiàn)應(yīng)用程序之間的異步通信,本文主要介紹了C#中RabbitMQ的使用小結(jié),具有一定的參考價值,感興趣的可以了解一下

一、RabbitMQ是什么?

RabbitMQ是一個開源的消息代理軟件,實現(xiàn)了AMQP(高級消息隊列協(xié)議),用來實現(xiàn)應(yīng)用程序之間的異步通信。簡單說,它就像一個"消息郵局",生產(chǎn)者把消息投遞到"郵局",消費者從"郵局"取走消息。

RabbitMQ:企業(yè)級消息中間件

RabbitMQ是一個開源的消息隊列中間件,作用是:

? 系統(tǒng)解耦:不同應(yīng)用間通過消息傳遞通信,無需直接依賴 ? 異步處理:將耗時操作放入隊列,提升系統(tǒng)響應(yīng)速度 ? 流量削峰:在高并發(fā)場景下緩沖請求,避免系統(tǒng)崩潰 ? 高可用:支持鏡像隊列和仲裁隊列,保證服務(wù)可用性

典型應(yīng)用:電商平臺用戶注冊后,通過RabbitMQ異步發(fā)送注冊郵件和短信;電商大促時,用消息隊列緩沖訂單,避免下游系統(tǒng)被壓垮。

RabbitMQ是用Erlang語言寫的,但C#有很好的客戶端庫支持,特別適合企業(yè)級應(yīng)用。

二、環(huán)境準(zhǔn)備

2.1. 安裝RabbitMQ服務(wù)器

  • Windows:下載安裝RabbitMQ(官網(wǎng)下載),安裝時記得同時安裝Erlang
  • Linux:使用yum或apt安裝,或者用Docker

重要提示:安裝完成后,啟用Web管理插件(rabbitmq-plugins enable rabbitmq_management),然后訪問http://localhost:15672/,默認(rèn)賬號guest/guest

2.2. 安裝C#客戶端庫

# 使用NuGet安裝RabbitMQ.Client(官方客戶端)
Install-Package RabbitMQ.Client
 
# 如果喜歡更簡單的封裝,可以安裝EasyNetQ(基于RabbitMQ.Client)
Install-Package EasyNetQ

三、基礎(chǔ)使用示例

3.1. 簡單發(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())
        {
            // 聲明交換機(使用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())
        {
            // 聲明相同交換機
            channel.ExchangeDeclare(exchange: "logs", type: "fanout");
            
            // 創(chuàng)建臨時隊列(會自動刪除)
            var queueName = channel.QueueDeclare().QueueName;
            
            // 綁定隊列到交換機
            channel.QueueBind(queue: queueName,
                             exchange: "logs",
                             routingKey: "");
            
            // 創(chuàng)建消費者
            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();
        }
    }
}

四、高級特性

4.1. 持久化消息(確保消息不丟失)

重要:必須同時設(shè)置交換機、隊列、消息為持久化,才能保證消息不丟失

// 發(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簡化代碼

EasyNetQ是RabbitMQ.Client的封裝,讓代碼更簡潔:

// 安裝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();
    }
}

五、實際應(yī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ù)(消費者)
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ù)(消費者)
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())
{
    // 用同一個連接創(chuàng)建多個channel
    using (var channel = connection.CreateModel())
    {
        // ...
    }
}
  • 錯誤處理:不要只檢查連接狀態(tài),要處理所有可能的異常
try
{
    // 消息處理邏輯
}
catch (Exception ex)
{
    // 記錄錯誤并重試
    Console.WriteLine($"處理消息失敗: {ex.Message}");
}
  • 隊列持久化:生產(chǎn)環(huán)境中,幾乎所有的隊列都應(yīng)該是持久化的
channel.QueueDeclare(queue: "my-queue", 
                   durable: true, 
                   exclusive: false, 
                   autoDelete: false);
  • 消息確認(rèn):使用手動確認(rèn)(manual acknowledgment)確保消息被正確處理
channel.BasicConsume(queue: "my-queue",
                   autoAck: false, // 關(guān)鍵!設(shè)置為false
                   consumer: consumer);

七、常見問題

Q: RabbitMQ和MQTT有什么區(qū)別? A: RabbitMQ是企業(yè)級消息中間件,適合應(yīng)用間通信;MQTT是物聯(lián)網(wǎng)專用輕量級協(xié)議,適合設(shè)備間通信。兩者可以結(jié)合使用,例如用MQTT收集物聯(lián)網(wǎng)設(shè)備數(shù)據(jù),用RabbitMQ處理業(yè)務(wù)邏輯。

Q: 為什么我的消息不見了? A: 可能原因:

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

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

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

九、選擇建議

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

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

相關(guān)文章

  • C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘五 棧和隊列

    C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘五 棧和隊列

    這節(jié)我們討論了兩種好玩的數(shù)據(jù)結(jié)構(gòu),棧和隊列
    2012-11-11
  • 桌面浮動窗口(類似惡意廣告)的實現(xiàn)詳解

    桌面浮動窗口(類似惡意廣告)的實現(xiàn)詳解

    本篇文章是對桌面浮動窗口的實現(xiàn)方法進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • C#實現(xiàn)textbox文本多行輸出且自動換行輸出

    C#實現(xiàn)textbox文本多行輸出且自動換行輸出

    在WinForms中通過設(shè)置TextBox的Multiline和WordWrap屬性實現(xiàn)多行輸出且自動換行,可以通過設(shè)計器或代碼設(shè)置以上兩個屬性,文本輸出方法包括直接賦值、追加文本和循環(huán)輸出,完整示例代碼展示了設(shè)計器設(shè)置后的代碼實現(xiàn),需要的朋友可以參考下
    2026-04-04
  • c#中WebService的介紹及調(diào)用方式小結(jié)

    c#中WebService的介紹及調(diào)用方式小結(jié)

    這篇文章主要給大家介紹了關(guān)于c#中的WebService及其調(diào)用方式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • c#實現(xiàn)繁體轉(zhuǎn)簡體的示例代碼

    c#實現(xiàn)繁體轉(zhuǎn)簡體的示例代碼

    OpenCC是一個開源的中文繁簡轉(zhuǎn)換工具,支持多種語言,這篇文章主要為大家介紹了C#如何使用OpenCC實現(xiàn)繁體轉(zhuǎn)簡體功能,有需要的可以了解下
    2025-01-01
  • 詳解c# 協(xié)變和逆變

    詳解c# 協(xié)變和逆變

    這篇文章主要介紹了c# 協(xié)變和逆變的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2020-11-11
  • C#使用Json.Net對JSON與對象的序列化與反序列化

    C#使用Json.Net對JSON與對象的序列化與反序列化

    這篇文章介紹了Json.Net對JSON與對象的序列化與反序列化,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 解析C# 程序結(jié)構(gòu)

    解析C# 程序結(jié)構(gòu)

    在我們學(xué)習(xí) C# 編程語言的基礎(chǔ)構(gòu)件塊之前,讓我們先看一下 C# 的最小的程序結(jié)構(gòu),以便作為接下來章節(jié)的參考
    2021-07-07
  • C#列出所有物理網(wǎng)絡(luò)適配器的方法

    C#列出所有物理網(wǎng)絡(luò)適配器的方法

    這篇文章主要介紹了C#列出所有物理網(wǎng)絡(luò)適配器的方法,實例分析了C#操作網(wǎng)絡(luò)設(shè)備的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • 基于WPF實現(xiàn)面包屑效果的示例代碼

    基于WPF實現(xiàn)面包屑效果的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何基于WPF實現(xiàn)面包屑效果,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2023-04-04

最新評論

铁岭市| 高要市| 福安市| 阜宁县| 西吉县| 临颍县| 威宁| 天峨县| 西盟| 修文县| 会同县| 崇州市| 龙山县| 邹平县| 黄骅市| 兴义市| 绍兴市| 霍邱县| 梁山县| 辉南县| 万宁市| 抚远县| 邹平县| 夏河县| 定南县| 禹州市| 云阳县| 六安市| 大同县| 和龙市| 谷城县| 安平县| 阿瓦提县| 尼玛县| 宣城市| 万年县| 调兵山市| 三明市| 仁布县| 改则县| 陈巴尔虎旗|