日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.Net使用RabbitMQ详解

發布時間:2024/9/20 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .Net使用RabbitMQ详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

序言

這里原來有一句話,觸犯啦天條,被閹割!!!!

首先不去討論我的日志組件怎么樣。因為有些日志需要走網絡,有的又不需要走網路,也是有性能與業務場景的多般變化在其中,就把他拋開,我們只談消息RabbitMQ。

那么什么是RabbitMQ,它是用來解決什么問題的,性能如何,又怎么用?我會在下面一一闡述,如有錯誤,不到之處,還望大家不吝賜教。

RabbitMQ簡介

必須一提的是rabbitmq是由LShift提供的一個消息隊列協議(AMQP)的開源實現,由以高性能、健壯以及可伸縮性出名的Erlang寫成(因此也是繼承了這些優點)。

百度百科對RabbitMQ闡述也非常明確,建議去看下,還有amqp協議。

RabbitMQ官網:http://www.rabbitmq.com/?如果你要下載安裝,那么必須先把Erlang語言裝上。

RabbitMQ的.net客戶端,可以在nuget中輸入rabbitmq輕松獲得。

RabbitMQ與其他消息隊列的對比,早有仙人給寫出來。?Message Queue Shootout

這篇文章中的測試案例為:1百萬條1k的消息,每秒種的收發情況如下圖。

如果你安裝好啦,rabbitmq,他會提供一個操作監控頁面,頁面如下,他幾乎提供啦,對rabbitmq的所有操作,與監控,所以,你裝上后,自己多看看,多操作下。

?

RabbitMQ中的一些名詞闡述與消息從投遞到消費的整個過程

從上圖的標題中可以看到一些陌生的英文單詞,讓我們感覺一無所知,更無從操作,那么我給大家弄啦一個圖片大家可以看下,或許對您理解這些新鮮的單詞有所幫助。

看過這些名詞,之后,或許你還毫無頭緒,那么我把消息從生產到消費的整個流程給大家說一下,或許會更深入一點,其中Exchange,與Queue都是可以設置相關屬性,隊列的持久化,交換器類型制定。

Note:首先這個過程走分三個部分,1、客戶端(生產消息隊列),2、RabbitMQ服務端(負責路由規則的綁定與消息的分發),3、客戶端(消費消息隊列中的消息)

Note:由圖可以看出,一個消息可以走一次網絡卻被分發到不同的消息隊列中,然后被多個的客戶端消費,那么這個過程就是RabbitMQ的核心機制,RabbitMQ的路由類型與消費模式。

RabbitMQ中Exchange的類型

類型有4種,direct,fanout,topic,headers。其中headers不常用,本篇不做介紹,其他三種類型,會做詳細介紹。

那么這些類型是什么意思呢?就是Exchange與隊列進行綁定后,消息根據exchang的類型,按照不同的綁定規則分發消息到消息隊列中,可以是一個消息被分發給多個消息隊列,也可以是一個消息分發到一個消息隊列。具體請看下文。

介紹之初還要說下RoutingKey,這是個什么玩意呢?他是exchange與消息隊列綁定中的一個標識。有些路由類型會按照標識對應消息隊列,有些路由類型忽略routingkey。具體看下文。

1、Exchange類型direct

他是根據交換器名稱與routingkey來找隊列的。

Note:消息從client發出,傳送給交換器ChangeA,RoutingKey為routingkey.ZLH,那么不管你發送給Queue1,還是Queue2一個消息都會保存在Queue1,Queue2,Queue3,三個隊列中。這就是交換器的direct類型的路由規則。只要找到路由器與routingkey綁定的隊列,那么他有多少隊列,他就分發給多少隊列。

2、Exchange類型fanout

這個類型忽略Routingkey,他為廣播模式。

Note:消息從客戶端發出,只要queue與exchange有綁定,那么他不管你的Routingkey是什么他都會將消息分發給所有與該exchang綁定的隊列中。

3、Exchange類型topic

這個類型的路由規則如果你掌握啦,那是相當的好用,與靈活。他是根據RoutingKey的設置,來做匹配的,其中這里還有兩個通配符為:

*,代表任意的一個詞。例如topic.zlh.*,他能夠匹配到,topic.zlh.one ,topic.zlh.two ,topic.zlh.abc, ....

#,代表任意多個詞。例如topic.#,他能夠匹配到,topic.zlh.one ,topic.zlh.two ,topic.zlh.abc, ....

Note:這個圖看上去很亂,但是他是根據匹配符做匹配的,這里我建議你自己做下消息隊列的具體操作。

具體操作如下

public static void Producer(int value){try{var qName = "lhtest1";var exchangeName = "fanoutchange1";var exchangeType = "fanout";//topic、fanoutvar routingKey = "*";var uri = new Uri("amqp://192.168.10.121:5672/");var factory = new ConnectionFactory{UserName = "123",Password = "123",RequestedHeartbeat = 0,Endpoint = new AmqpTcpEndpoint(uri)};using (var connection = factory.CreateConnection()){using (var channel = connection.CreateModel()){//設置交換器的類型channel.ExchangeDeclare(exchangeName, exchangeType);//聲明一個隊列,設置隊列是否持久化,排他性,與自動刪除channel.QueueDeclare(qName, true, false, false, null);//綁定消息隊列,交換器,routingkeychannel.QueueBind(qName, exchangeName, routingKey);var properties = channel.CreateBasicProperties();//隊列持久化properties.Persistent = true;var m = new QMessage(DateTime.Now, value+"");var body = Encoding.UTF8.GetBytes(DoJson.ModelToJson<QMessage>(m));//發送信息channel.BasicPublish(exchangeName, routingKey, properties, body);}}}catch (Exception ex){Console.WriteLine(ex.Message);}}

消息隊列的消費與消息確認Ack

1、消息隊列的消費

Note:如果一個消息隊列中有大量消息等待操作時,我們可以用多個客戶端來處理消息,這里的分發機制是采用負載均衡算法中的輪詢。第一個消息給A,下一個消息給B,下下一個消息給A,下下下一個消息給B......以此類推。

2、為啦保證消息的安全性,保證此消息被正確處理后才能在服務端的消息隊列中刪除。那么rabbitmq提供啦ack應答機制,來實現這一功能。

ack應答有兩種方式:1、自動應答,2、手動應答。具體實現如下。

public static void Consumer(){try{var qName = "lhtest1";var exchangeName = "fanoutchange1";var exchangeType = "fanout";//topic、fanoutvar routingKey = "*";var uri = new Uri("amqp://192.168.10.121:5672/");var factory = new ConnectionFactory{UserName = "123",Password = "123",RequestedHeartbeat = 0,Endpoint = new AmqpTcpEndpoint(uri)};using (var connection = factory.CreateConnection()){using (var channel = connection.CreateModel()){channel.ExchangeDeclare(exchangeName, exchangeType);channel.QueueDeclare(qName, true, false, false, null);channel.QueueBind(qName, exchangeName, routingKey);//定義這個隊列的消費者QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);//false為手動應答,true為自動應答channel.BasicConsume(qName, false, consumer);while (true){BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue(); byte[] bytes = ea.Body;var messageStr = Encoding.UTF8.GetString(bytes);var message = DoJson.JsonToModel<QMessage>(messageStr);Console.WriteLine("Receive a Message, DateTime:" + message.DateTime.ToString("yyyy-MM-dd HH:mm:ss") + " Title:" + message.Title);//如果是自動應答,下下面這句代碼不用寫啦。if ((Convert.ToInt32(message.Title) % 2) == 1){channel.BasicAck(ea.DeliveryTag, false);}}}}}catch (Exception ex){Console.WriteLine(ex.Message);}}

轉:http://www.cnblogs.com/knowledgesea/p/5296008.html

總結

以上是生活随笔為你收集整理的.Net使用RabbitMQ详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲欧美日韩精品久久亚洲区 | 激情五月综合网 | 亚洲一区不卡 | 丁香花电影高清在线阅读免费 | 久久国产精品免费观看 | 中文字幕福利 | 大尺度做爰呻吟舌吻网站 | 欧美精品一二三 | 欧美男人的天堂 | 亚洲区国产区 | 亚洲视频二区 | caoporen在线 | av手机在线播放 | 91精品国产色综合久久不卡粉嫩 | 国产成人无码精品久久久久 | 中文字幕国产综合 | 精品人妻一区二 | 欧美三级电影在线观看 | 久久国产精品国语对白 | 吃奶摸下的激烈视频 | 国产一级黄色片子 | 欧美日韩高清免费 | 丝袜美腿亚洲一区二区图片 | 日韩久久久久 | 热热热av| av网址网站 | 阿v天堂2018| 日本一本一道 | 中文字幕在线观看的网站 | 天天艹日日艹 | 成人综合站| 国产日韩一区二区三区在线观看 | 精品1区2区3区 | 美女久久久久久久 | 田中瞳av | 亚洲一区二区三区色 | 精品处破女学生 | 全部孕妇毛片丰满孕妇孕交 | 亚洲欧美在线成人 | 天天躁狠狠躁狠狠躁夜夜躁68 | 玖玖在线免费视频 | 久久丝袜美腿 | aⅴ天堂网| 欧美性xxxxxxxxx | 久久婷婷伊人 | 怡春院一区二区 | 蜜臀av一区二区三区激情综合 | 男女啪啪在线观看 | 日韩三级黄色 | 午夜之声l性8电台lx8电台 | 射精一区二区 | 日本精品免费一区二区三区 | 精品女同一区 | 国模丫头1000人体 | 久久久无码人妻精品无码 | 日本美女三级 | 亚洲一区二区三区无码久久 | 亚洲性少妇| 色哟哟一区二区 | 亚洲成人另类 | 91蝌蚪在线观看 | 国产成人亚洲精品自产在线 | 一区一区三区产品乱码 | 一区二区在线视频 | 成人午夜福利视频 | 亚洲精品97久久中文字幕 | 九九九国产视频 | 日本久久片 | 国产调教视频在线观看 | 中文字幕一区二区三区在线观看 | 欧美综合网站 | 91精品亚洲| 一本视频在线 | 成人a区| 熟妇五十路六十路息与子 | 精品国产一区一区二区三亚瑟 | 午夜视频1000 | 欧美视频免费看欧美视频 | 色视频一区 | 日本黄大片在线观看 | 99资源网 | 东北少妇bbbb搡bbb搡 | 在线观看av的网址 | 五月天堂婷婷 | 中文字幕精品一区二区精品 | 日韩精品一级 | 日韩精品中文字幕一区二区三区 | 女生扒开尿口让男生桶 | 国产视频一二区 | 性xxxx欧美老肥妇牲乱 | 免费人成网 | 蜜桃成熟时李丽珍国语 | mm视频在线观看 | 国产成年人视频网站 | 手机成人免费视频 | 91在线中文| 啪啪资源| 欧美色综合网站 | 91爽爽|