首頁>技術>

RabbitMQ 是一個非常流行的,開源的,使用Erlang語言編寫的框架,通常在電信級平臺中作為訊息中介軟體使用,RabbitMQ實現了高階的AMQP協議用於實現程序間,應用程式間,伺服器之間的訊息互動,而且它還有一個非常的特性,你可以使用自定義外掛來擴充套件RabbitMQ的功能,而且它還支援多協議,高效能,高可靠,叢集以及高可用佇列。

建立佇列的方式也多種多樣,你可以編碼建立,也可以透過管理員使用者介面,甚至透過 PowerShell 進行佇列建立。

RabbitMQ 術語

當你在用 RabbitMQ 時,你要理解下面兩個術語

用 C# 構建 RabbitMQ

現在 Erlang 和 RabbitMQ 已經成功安裝到你的windows上,如果想和 Rabbitmq Server 進行互動,你需要安裝一個 RabbitMQ .NET client , 可以用 NuGet Package Manager 控制檯去安裝 RabbitMQ Client。

在 Visual Studio 中新建一個 Console Application,然後透過 NuGet Package Manager 安裝 RabbitMQ.Client 開發包,假定 RabbitMQ Server 是執行在本機,下面的程式碼片段建立了一個和 RabbitMQ Server 互動的 Connection 連線,程式碼如下:

ConnectionFactory connectionFactory = new ConnectionFactory();IConnection connection = connectionFactory.CreateConnection();

現在再次假定 RabbitMQ 跑在遠端伺服器上,下面的方法返回了一個通往 Rabbitmq Service 的 Connection 連線。

public IConnection GetConnection(string hostName, string userName, string password)        {            ConnectionFactory connectionFactory = new ConnectionFactory();            connectionFactory.HostName = hostName;            connectionFactory.UserName = userName;            connectionFactory.Password = password;            return connectionFactory.CreateConnection();        }
傳送和接收訊息

現在 RabbitMQ Service 已經在本地正常執行,使用下面的方法向佇列傳送訊息,請注意通往 RabbitMQ Service 的 Connection 用的是預設配置。

public static void Send(string queue, string data)        {            using (IConnection connection = new ConnectionFactory().CreateConnection())            {                using (IModel channel = connection.CreateModel())                {                    channel.QueueDeclare(queue, false, false, false, null);                    channel.BasicPublish(string.Empty, queue, null, Encoding.UTF8.GetBytes(data));                }            }        }

channel 常用於和 server 進行通訊從而傳送和接收訊息,不過上面這種佇列是不持久的,為啥這麼說呢?因為我在 QueueDeclare 方法的第二個引數中設定了 false,所以送往這個 queue 的 message 只會存留於記憶體中,一旦 server 重啟,這個資料將會丟失。

下面的程式碼展示瞭如何從 queue 中消費資料。

        public static void Receive(string queue)        {            using (IConnection connection = new ConnectionFactory().CreateConnection())            {                using (IModel channel = connection.CreateModel())                {               channel.QueueDeclare(queue, false, false, false, null);               var consumer = new EventingBasicConsumer(channel);               BasicGetResult result = channel.BasicGet(queue, true);                    if (result != null)                    {                      string data =                      Encoding.UTF8.GetString(result.Body);                        Console.WriteLine(data);                    }                }            }        }

接下來的程式碼片段展示瞭如何使用 Send 和 Receive 方法進行資料的傳送和消費。

static void Main(string[] args){     Send("IDG","Hello World!");     Receive("IDG");     Console.ReadLine();}

值得一提的是:RabbitMQ 對持久化也提供了非常好的支援,有兩種模式的 queue 可供選擇:持久化和非持久化,如果採用持久化模式,訊息是存放在硬碟中的,反之非持久化的模式,資料僅僅存放於記憶體中,一旦server重啟,非持久化模式的佇列資料將會丟失,最後補充一下,持久化可以用於以下三個級別上: Queue,Exchange 和 Message。

17
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • C#工控上位機系列(7)- Modbus TCP通訊