RabbitMq應用一 html
RabbitMQ的具體概念,百度百科一下,我這裏說一下個人理解,若是有少或者不對的地方,歡迎糾正和補充。數據庫
一個項目架構,小的時候,通常都是傳統的單一網站系統,或者項目,三層架構,到如今的MVC架構。隨着用戶訪問量愈來愈多,系統業務愈來愈多,會出現如下問題:數組
1.修改完大量代碼後,不敢更新,由於都是集成在一塊兒,互相耦合性很是強,一處報錯,滿盤皆掛;緩存
2.整個項目文件夾,層級愈來愈多,對新來的同事很不友好,文件不可避免的會亂放,重複的過多,甚至爲了緊急更新,會把不少本來的須要編譯的代碼,挪到通常處理程序中,架構
時間越長,越會發現,整個代碼結構像一鍋粥同樣;負載均衡
3.會有不少地方須要記錄日誌,郵件,短信等等不少須要異步的操做,若是訪問量太高,會把這個系統拖垮。異步
上述問題出現必定時間後,必定會重構整個,進行業務分離,SOA架構服務化,這就涉及到多個應用相互之間的通訊,常見的方式,是經過API的方式經過JSON的方式,進行數據交互,性能
這種作法實時性很高,可是對單個業務系統的高峯期壓力仍是很是大的,須要對但業務API系統進行負載均衡,這時候,若是說把一些要求實時性相對低一些,而且特別消耗性能的請求,摘出去慢慢處理的話,消息隊列就派上用場了,引入的消息隊列就成了消息處理的緩衝區。消息隊列引入的異步通訊機制,使得發送方和接收方都不用等待對方返回成功消息,就能夠繼續執行下面的代碼,從而提升了數據處理的能力。尤爲是當訪問量和數據流量較大的狀況下,就能夠結合消息隊列與後臺任務,經過避開高峯期對大數據進行處理,就能夠有效下降數據庫和程序處理數據的負荷。學習
一 搭建環境測試
RabbitMq是由erlang語言開發,全部到先安裝erlang語言的環境,傳送門下載,而且安裝,默認安裝後會自動配置一個環境變量ERLANG_HOME ,若是沒配置的話,手動配置一下,指向erlang安裝目錄就能夠了。
安裝好erlang語言環境,咱們去下載rabbitmq服務了。地址http://www.rabbitmq.com/download.html,下載RabbitMq Server.
下載完,安裝完畢後,打開安裝目錄到sbin下
咱們右鍵CMD,用管理員身份打開,而後切到上圖這個目錄下,執行3行命令
rabbitmq-service install rabbitmq-service enable rabbitmq-service start
開啓rabbitMq的服務,這時候能夠本身查看服務是否開啓。
安裝好之後,咱們使用rabbitmqctl list_users命令,是列出當前服務用戶的列表,
這個用戶是我本身添加的,剛開始的時候是默認有一個用戶guest
咱們能夠本身添加用戶,而且設置密碼,設置權限,設置管理員操做,還能夠刪除用戶,更改密碼
rabbitmqctl add_user feige habi 添加用戶,帳號feige,密碼habi rabbitmqctl set_permissions feige ".*" ".*" ".*"給feige這個用戶設置對全部消息隊列設置和配置,讀,寫的權限 rabbitmqctl set_user_tags feige administrator給feige這個用戶設置成管理員
rabbitmqctl delete_user feige 這個是刪除用戶
rabbitmqctl change_password feige 1234修改feige的密碼
運行下面命令來啓用管理插件:rabbitmq-plugins enable rabbitmq_management
默認端口:http://localhost:15672/#/這個是能夠監控的後臺。
綜上,RabbitMq的環境已經部署完畢,一些基本命令已經熟悉了,下面開始使用
二 基本使用
在.NET中使用RabbitMQ須要下載RabbitMQ的客戶端程序集,能夠到官網下載,下載解壓後就能夠獲得RabbitMQ.Client.dll,這就是RabbitMQ的客戶端。
在使用RabitMQ以前,須要對下面的幾個基本概念說明一下:
RabbitMQ是一個消息代理。他從消息生產者(producers)那裏接收消息,而後把消息送給消息消費者(consumer)在發送和接受之間,他可以根據設置的規則進行路由,緩存和持久化。
咱們用VS2012+,能夠直接從nuget控制檯命令,添加
Install-Package RabbitMq.Client -version 3.6.5
生產(Producing)意思就是發送。發送消息的程序就是一個生產者(producer)。
隊列(queue)就是郵箱的名稱。消息經過你的應用程序和RabbitMQ進行傳輸,它們只能存儲在隊列(queue)中。 隊列(queue)容量沒有限制,你要存儲多少消息均可以——基本上是一個無限的緩衝區。多個生產者(producers)可以把消息發送給同一個隊列,一樣,多個消費者(consumers)也能從同一個隊列(queue)中獲取數據。隊列能夠畫成這樣(圖上是隊列的名稱):
消費(Consuming)和獲取消息是同樣的意思。一個消費者(consumer)就是一個等待獲取消息的程序
一般,消息生產者,消息消費者和消息代理不在同一臺機器上。
下面,咱們用.net代碼,來分別作一個製造者,發送消息的控制檯,一個消費者,接收消息的控制檯,固然,咱們在本機作一下實驗,。
/// <summary> /// 消息生產者,客戶端消息存進隊列中 /// </summary> class Program { static void Main(string[] args) { //建立連接工廠,設置目標,用戶,密碼 var factory = new ConnectionFactory(); factory.HostName = "127.0.0.1"; factory.UserName = "feiyang"; factory.Password = "123456"; //開啓當前服務設置的用戶的連接 using (var connection = factory.CreateConnection()) { //開啓一個頻道 using (var channel = connection.CreateModel()) { //建立一個隊列 channel.QueueDeclare("firstQueue",false,false,false,null); byte[] body = null; //消息是以二進制數組的形式傳輸的,因此若是消息是實體對象的話,須要序列化和而後轉化爲二進制數組。 for (int i = 0; i < 100000; i++) { body = Encoding.UTF8.GetBytes("這是第-----"+i+"-----條消息"); channel.BasicPublish("", "firstQueue", null, body); Console.Write("成功發送第-----"+i+"-----條消息!"); } Console.ReadKey(); } } } }
上述是消費者控制檯代碼,我下面那個循環時測試的10W條數據,不斷的發送和另外一個控制檯不斷的獲取消息,測試下來還不錯性能。。。這個例子發送的消息比較簡單,直接轉成二進制就能夠了,可是若是咱們
用到對象的話,就要先反序列化,再轉成二進制。
/// <summary> /// 消息消費者讀取消息隊列 /// </summary> class Program { static void Main(string[] args) { var factory = new ConnectionFactory(); factory.HostName = "127.0.0.1"; factory.UserName = "feiyang"; factory.Password = "123456"; using (var connection = factory.CreateConnection()) { using (var channel = connection.CreateModel()) { //仍是鏈接到哪一個隊列 channel.QueueDeclare("firstQueue",false,false,false,null); //定義消息接受者 var customer = new QueueingBasicConsumer(channel); //從指定隊列獲取消息 channel.BasicConsume("firstQueue",true,customer); //開始不斷循環出隊列的消息 while (true) { var ea = (BasicDeliverEventArgs)customer.Queue.Dequeue(); //將消息二進制轉回字符串 var msg = Encoding.UTF8.GetString(ea.Body); Console.WriteLine(msg); } //sw.Stop(); //Console.WriteLine("共用時" + sw.ElapsedTicks + "毫秒"); //Console.ReadKey(); } } } }
這個是消費者端。。下面咱們運行一下。
附加一句,當隊列中有數據的話,用rabbitmqctl list_queues,能夠列出全部隊列名稱,和隊列中的消息數量
運行的消息生產者客戶端後,往隊列firstQueue中發送了10W條消息,咱們再運行消費者端。
可見,隊列firstQueue中的消息正在不斷取出,並且速度很快。
這些是一些RabbitMq的一些基本使用,後面會陸續增長深刻的學習心得。