細(xì)說RabbitMQ

RabbitMQ可以做什么?

AMQP愁拭,即Advanced Message Queuing Protocol,高級消息隊列協(xié)議亏吝。是應(yīng)用層協(xié)議的一個開放標(biāo)準(zhǔn)岭埠,為面向消息的中間件設(shè)計。
消息中間件主要用于組件之間的解耦蔚鸥,消息的發(fā)送者無需知道消息使用者的存在惜论,反之亦然。

應(yīng)用場景

我們知道現(xiàn)在很多APP都可以推送止喷。在管理員選定內(nèi)容進行推送這個行為中馆类。
系統(tǒng)往往需要執(zhí)行倆個操作:推送消息;記錄是誰在什么時候推送的弹谁。
但是對于管理員來說乾巧,他只關(guān)心推送完成了沒有,而不關(guān)心是否產(chǎn)生了日志预愤。

傳統(tǒng)的做法有2種:
串行:推送消息卧抗,然后在記錄日志,在倆個操作都完成之后告訴管理員推送完成鳖粟。
并行:推送消息的同時記錄日志社裆,在倆個操作都完成之后告訴管理員推送完成。

OK向图。我們現(xiàn)在引入消息隊列泳秀。
引入消息隊列之后,我們只需要在推送榄攀,然后日志放入消息隊列中嗜傅。然后就可以告訴管理員消息推送完成。
而日志信息會存放在消息隊列之中檩赢。消息隊列的消費者會在系統(tǒng)不繁忙的時候進行處理吕嘀。

RabbitMQ術(shù)語
生產(chǎn)者:

消息發(fā)送者

消費者:

等待消息的程序

Queue:

隊列,存放消息的

Simple

RabbitMQ安裝即簡單使用

RabbitMQ四種exchange

exchange

如果發(fā)生緊急情況,我們的服務(wù)器宕掉的話,消息隊列里的信息沒了怎么辦偶房?

消息持久化

RabbitMQ為我們提供了消息持久化的手段
首先是隊列持久化趁曼,然后在是消息持久化

如果消費者在消費當(dāng)前消息的時候,突然崩掉棕洋,那么這條消息還在消息隊列中嗎挡闰?還是已經(jīng)被消費掉了?

消息響應(yīng)機制

RabbitMQ為我們提供了消息響應(yīng)機制

啰里啰唆半天掰盘,下邊是代碼摄悯。
.net版本。

//生產(chǎn)者
var factory = new ConnectionFactory(){ HostName = "localhost", UserName = "guest", Password = "" };

using (IConnection conn = factory.CreateConnection())
{
       using (IModel im = conn.CreateModel())
       {
              im.ExchangeDeclare("rabbitmq_route", ExchangeType.Direct);
              im.QueueDeclare("rabbitmq_query", true, false, false, null);//第二個參數(shù)隊列持久化
             
              im.QueueBind("rabbitmq_query", "rabbitmq_route", ExchangeType.Direct, null);
              for (int i = 0; i < 5; i++)
              {
                   var props = im.CreateBasicProperties();
                   props.SetPersistent(true);//消息持久化
                   byte[] message = Encoding.UTF8.GetBytes("Hello " + i);
                   im.BasicPublish("rabbitmq_route", ExchangeType.Direct, props, message);
                   Console.WriteLine("send:" + i);
              }
       }
}
//消費者
var factory = new ConnectionFactory(){ HostName = "localhost", UserName = "guest", Password = "" };
using (IConnection conn = factory.CreateConnection())
{
       using (IModel im = conn.CreateModel())
       {
              while (true)
              {
                        
                   BasicGetResult res = channel.BasicGet("rabbitmq_query", false);
                   if (res != null)
                   {
                        Console.WriteLine("receiver:" + UTF8Encoding.UTF8.GetString(res.Body));
                   }
                  Thread.Sleep(5000);
                  channel.BasicAck(res.DeliveryTag, true);//消息響應(yīng)
                  Console.WriteLine("basiack end");          
              }
       }
}

//using (IConnection conn = factory.CreateConnection())
            //{
            //    using (IModel im = conn.CreateModel())
            //    {
            //        im.ExchangeDeclare("rabbitmq_route_Fanout", ExchangeType.Fanout);// 路由
            //        int i = 0;
            //        while (true)
            //        {
            //            Thread.Sleep(1000);
            //            ++i;
            //            byte[] message = Encoding.UTF8.GetBytes(i.ToString());
            //            im.BasicPublish("rabbitmq_route_Fanout", "", null, message);
            //            Console.WriteLine("send:" + i.ToString());
            //        }
            //    }
            //}

 //using (IConnection conn = factory.CreateConnection())
            //{
            //    using (IModel im = conn.CreateModel())
            //    {
            //        im.ExchangeDeclare("rabbitmq_route_Fanout", ExchangeType.Fanout);
            //        var queueOk = im.QueueDeclare();//1
            //        im.QueueBind(queueOk.QueueName, "rabbitmq_route_Fanout", "");//2
            //        var consumer = new QueueingBasicConsumer(im);//3
            //        im.BasicConsume(queueOk.QueueName, true, consumer);//4
            //        while (true)
            //        {
            //            var _result = (BasicDeliverEventArgs)consumer.Queue.Dequeue();//5
            //            var body = _result.Body;
            //            var message = Encoding.UTF8.GetString(body);
            //            Console.WriteLine("received:{0}", message);
            //        }
            //    }
            //}

RabbitMQ.Client.dil 版本5.1.0-rc1

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愧捕,一起剝皮案震驚了整個濱河市奢驯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌次绘,老刑警劉巖瘪阁,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異断盛,居然都是意外死亡,警方通過查閱死者的電腦和手機愉舔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門钢猛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人轩缤,你說我怎么就攤上這事命迈。” “怎么了火的?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵壶愤,是天一觀的道長。 經(jīng)常有香客問我馏鹤,道長征椒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任湃累,我火速辦了婚禮勃救,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘治力。我一直安慰自己蒙秒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布宵统。 她就那樣靜靜地躺著晕讲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓢省,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天弄息,我揣著相機與錄音,去河邊找鬼净捅。 笑死疑枯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛔六。 我是一名探鬼主播荆永,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼国章!你這毒婦竟也來了具钥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤液兽,失蹤者是張志新(化名)和其女友劉穎骂删,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體四啰,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡宁玫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柑晒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欧瘪。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖匙赞,靈堂內(nèi)的尸體忽然破棺而出佛掖,到底是詐尸還是另有隱情,我是刑警寧澤涌庭,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布芥被,位于F島的核電站,受9級特大地震影響坐榆,放射性物質(zhì)發(fā)生泄漏拴魄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一席镀、第九天 我趴在偏房一處隱蔽的房頂上張望羹铅。 院中可真熱鬧,春花似錦愉昆、人聲如沸职员。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焊切。三九已至扮授,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間专肪,已是汗流浹背刹勃。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嚎尤,地道東北人荔仁。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像芽死,于是被迫代替她去往敵國和親乏梁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理关贵,服務(wù)發(fā)現(xiàn)遇骑,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 來源 RabbitMQ是用Erlang實現(xiàn)的一個高并發(fā)高可靠AMQP消息隊列服務(wù)器揖曾。支持消息的持久化落萎、事務(wù)、擁塞控...
    jiangmo閱讀 10,357評論 2 34
  • 一炭剪、前言 消息隊列中間件(簡稱消息中間件)是指利用高效可靠的消息傳遞機制進行與平臺無關(guān)的數(shù)據(jù)交流练链,并基于數(shù)據(jù)通信來...
    朱小廝閱讀 19,892評論 5 77
  • 我可不喜歡我看不慣你又干不掉你的樣子。 我戴著耳機奴拦,沐浴在藍(lán)色多瑙河的秋夜冰涼中媒鼓。 汩汩的清流撫摩過我的脊背,淡淡...
    冉耳耳閱讀 232評論 0 0
  • 國際貿(mào)易理論與實務(wù)課粱坤。你坐在我前面一排隶糕,睡的極其安穩(wěn)瓷产。長長的睫毛劃出了一個好看的弧度站玄。 我看著你的背影出了神。 從...
    柒雙閱讀 324評論 3 3