RabbitMQ

来源:http://www.cnblogs.com/liqingwen/archive/2017/02/25/6412089.html
-Advertisement-
Play Games

簡介 RabbitMQ:一個消息系統,基於 AMQP 系統協議,由 erlang 語言開發。 優點:健壯、使用簡單、開源和支持各種流行的語言等。 MQ(Message Queue):消息隊列的簡稱,是一種應用程式之間的通信機制。 作用:將部分無需立即回調獲取結果,並且耗時的操作,使用非同步處理的方式提 ...


 

簡介

  RabbitMQ:一個消息系統,基於 AMQP 系統協議,由 erlang 語言開發。

  優點:健壯、使用簡單、開源和支持各種流行的語言等。

 

  MQ(Message Queue):消息隊列的簡稱,是一種應用程式之間的通信機制。

  作用:將部分無需立即回調獲取結果,並且耗時的操作,使用非同步處理的方式提高伺服器的吞吐量及性能。

 

     簡單的通信方式: 圖1 簡單的通信方式      演變,加入 MQ(隊列):           

圖2 加入 MQ 的通信方式

       A 端:生產者將消息寫(插)入隊列;      MQ(隊列) :中間件,消息的載體;      B 端:消費者從隊列讀(取)出消息。     MQ 特點:消費者 - 生產者模型的一種表現形式。  

環境搭建

  1.先上官網下載安裝包:http://www.rabbitmq.com/ ;

  2.安裝時會提示你下載 Erlang 語言環境;

  3.啟動安裝完的服務:RabbitMQ;

  4.在 cmd 中指向 sbin 目錄,並輸入以下命令,才能打開 WEB 管理界面:

rabbitmq-plugins enable rabbitmq_management

  5.預設路徑:http://localhost:15672/#/

 

名詞解析:

  Exchange:交換機,制定路由規則,控制消息的傳輸;   Queue:消息隊列,消息的載體。   Channel:消息通道 ,進行消息讀寫的通道,在客戶端的每個連接里,可建立多個channel,每個channel代表一個會話任務;   Bind:根據路由規則綁定 Queue 和 Exchange,意即為符合什麼樣路由規則的消息,將會進入哪一個 Queue;   Broker:MQ 伺服器實體。   Exchange:消息交換機,它指定消息按什麼規則,路由到哪個隊列。   Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。   Producer:生產者,消息投放者。   Consumer:消費者,消息接收者。  

簡單的 Hello World

 

  P(Producer):生產者,意味著發送;

  Queue:隊列,本質上是一個無限的緩衝區,可以儲存儘可能多的信息;

  C(Consumer):消費者,等待並接收消息。

  【備註】生產者和消費者不需要駐留在同一臺伺服器上。

 

  Producer.cs

 1     public class Producer  
 2     {
 3         public static void Send()
 4         {
 5             var factory = new ConnectionFactory { HostName = "localhost" };
 6 
 7             //創建連接對象,基於 Socket
 8             using (var connection = factory.CreateConnection())
 9             {
10                 //創建新的渠道、會話
11                 using (var channel = connection.CreateModel())
12                 {
13                     //聲明隊列
14                     channel.QueueDeclare(queue: "hello",    //隊列名
15                         durable: false,     //持久性
16                         exclusive: false,   //排他性
17                         autoDelete: false,  //自動刪除
18                         arguments: null);
19 
20                     const string message = "Hello World!";
21                     var body = Encoding.UTF8.GetBytes(message);
22 
23                     channel.BasicPublish(exchange: "",  //交換機名
24                         routingKey: "hello",    //路由鍵
25                         basicProperties: null,
26                         body: body);
27                 }
28             }
29         }
30     }

  【備註】隊列名如果已存在,將不會重覆創建。假設隊列已存在,修改 channel.QueueDeclare() 方法內的參數後啟動會出現異常。

  【備註】消息內容是一個位元組數組。

    Consumer.cs
 1     class Consumer
 2     {
 3         public static void Receive()
 4         {
 5             var factory = new ConnectionFactory() { HostName = "localhost" };
 6 
 7             using (var connection = factory.CreateConnection())
 8             {
 9                 using (var channel = connection.CreateModel())
10                 {
11                     channel.QueueDeclare(queue: "hello",
12                                          durable: false,
13                                          exclusive: false,
14                                          autoDelete: false,
15                                          arguments: null);
16 
17                     //創建基於該隊列的消費者,綁定事件
18                     var consumer = new EventingBasicConsumer(channel);
19                     consumer.Received += (model, ea) =>
20                     {
21                         var body = ea.Body;     //消息主體
22                         var message = Encoding.UTF8.GetString(body);
23                         Console.WriteLine(" [x] Received {0}", message);
24                     };
25 
26                     //啟動消費者
27                     channel.BasicConsume(queue: "hello",    //隊列名
28                                          noAck: true,   //false:手動應答;true:自動應答
29                                          consumer: consumer);
30 
31                     Console.Read();
32                 }
33             }
34         }
35     }

  在消費者的類裡面為什麼會再次聲明隊列(channel.QueueDeclare)呢?因為接收方可能會在發送方啟動前啟動,這是出於保險起見。

      【博主】反骨仔 【原文】http://www.cnblogs.com/liqingwen/p/6412089.html 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在linux進行連接windows下的ftp伺服器 ftp://192.168.2.71 輸入用戶名和密碼登陸成功 當使用get把文件下載後,然後unzip進行解壓時,出現了問題 error [10201_database_linux32.zip]: start of central directo ...
  • 第一步:搭建apache伺服器,這在上篇博客中已經完成 http://www.cnblogs.com/sangmu/p/6422238.html 第二步:安裝ssl yum install mod_ssl -y iptables -I INPUT 1 -p tcp --dport 443 -j AC ...
  • 昨天Boss在公司微信群發了此張圖片,"哪個水槽先灌滿",Insus.NET今天早上才有時間來研究一下: 如果你對此話題有興趣,你可以繼續討論和補充...... ...
  • 前述: 對資料庫操作的封裝,相信網路上已經有一大堆,ORM框架,或者是.NET本身的EF,都很好的支持資料庫操作。這篇文章是分享自己所思考的,對資料庫操作的簡單封裝。我對於這篇文章,認為被瀏覽者所關註重點的是怎麼分析設計資料庫操作封裝,代碼是其次。而且,這是我第一篇文章,為了想好怎麼實現花了些天,代 ...
  • 年前經常聊天的大佬群里有人寫了窗體的倒計時來計算下班時間和放假時間:) 簡直就是在嘲諷我這種沒有工作的人,哈哈哈 窗體的倒計時相當的沒有技術含量,主要是不夠炫酷,不能夠體現我們程式員的身份。 那什麼才叫炫酷?必須是控制台啊! 電視劇上黑客噼里啪啦噼里啪啦滾屏的畫面多炫酷! 所以,研究了一下怎麼樣在控 ...
  • 適用Zero版本:ASP.NET Core & Angular 2+ (aspnet-zero-core-3.1.0)。 該版本官方有兩個solution文件夾:Angular(前端) 和 aspnet-core(後臺服務)。 在開始以下步驟之前需要能夠成功發佈程式,對於後臺服務只要能運行即可,如有 ...
  • 註釋,是代碼中的一些“說明性文字”。註釋本身不會參與程式的編譯和運行,僅僅供程式員閱讀。 註釋分為:單行註釋、多行註釋、文檔註釋。 單行註釋的符號是2條斜線“//”,2條斜線右側的內容就是註釋,左側的代碼不會受影響。 多行註釋以“/*”開始,以“*/”結束,之間的內容就是註釋,可以包含多行。 文檔註 ...
  • OSS最新進度,包括OSS.Social,OSS.Http,新增微信支付項目OSS.PayCenter。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...