最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【朝夕專刊】RabbitMQ生產(chǎn)者/消費(fèi)者消息確認(rèn)

2020-04-29 12:31 作者:朝夕教育  | 我要投稿


歡迎大家閱讀《朝夕Net社區(qū)技術(shù)???br/>

我們致力于.NetCore的推廣和落地,為更好的幫助大家學(xué)習(xí),方便分享干貨,特創(chuàng)此刊!很高興你能成為忠實(shí)讀者,文末福利不要錯過哦!

上篇文章介紹了RabbitMQ使用中的四種路由;這篇文章給大家介紹一下關(guān)于RabbitMQ的消息確認(rèn)。

如果出現(xiàn)圖片不清晰的,請關(guān)注朝夕教育公眾號可獲取關(guān)于RabbitMQ的視頻錄播學(xué)習(xí);本周我們學(xué)習(xí)的內(nèi)容是消息確認(rèn):

生產(chǎn)者端消息確認(rèn)(tx機(jī)制和Confirm模式)

消費(fèi)者端消息確認(rèn)(自動確認(rèn)和顯示確認(rèn))


1.為什么要消息確認(rèn)

在一些場合,如轉(zhuǎn)賬、付費(fèi)時每一條消息都必須保證成功的被處理。AMQP是金融級的消息隊(duì)列協(xié)議,有很高的可靠性,這里介紹在使用RabbitMQ時怎么保證消息被成功處理的。

消息確認(rèn)可以分為兩種:一種是生產(chǎn)者發(fā)送消息到Broke時,Broker給生產(chǎn)者發(fā)送確認(rèn)回執(zhí),用于告訴生產(chǎn)者消息已被成功發(fā)送到Broker;

一種是消費(fèi)者接收到Broker發(fā)送的消息時,消費(fèi)者給Broker發(fā)送確認(rèn)回執(zhí),用于通知消息已成功被消費(fèi)者接收。下邊分別介紹生產(chǎn)者端和消費(fèi)者端的消息確認(rèn)。

2.生產(chǎn)者端消息確認(rèn)

生產(chǎn)者端的消息確認(rèn):當(dāng)生產(chǎn)者將消息發(fā)送給Broker,Broker接收到消息給生產(chǎn)者發(fā)送確認(rèn)回執(zhí)。生產(chǎn)者端的消息確認(rèn)有兩種方式:tx機(jī)制和Confirm模式。

1.?Tx機(jī)制模式

tx機(jī)制可以叫事務(wù)機(jī)制,RabbitMQ中有三個與tx機(jī)制的方法:txSelect,txcommit和txRollback。channe.txSelect用于將當(dāng)前channel設(shè)置成一個transaction模式,channe.txCommit提交事務(wù),channel.txRollback回滾事務(wù)。

使用tx機(jī)制,我們首先要通過txSelect方法開啟事務(wù),然后發(fā)布消息給broker服務(wù)器,如果txCommit提交成功了,則說明消息成功被broker接受了;

如果txCommit執(zhí)行之前broker異常崩潰或者由于其他原因拋出異常,這個時候我們可以捕獲異常,通過txRollback回滾事務(wù)。

準(zhǔn)備工作:

看一個tx機(jī)制的簡單實(shí)現(xiàn):

執(zhí)行結(jié)果如下

2.Confirm模式

C#的RabbitMQ API中,有三個與Confirm相關(guān)的方法:ConfirmSelect,WaitForCnofirms和WaitForCnofirmOrDie。channel.ConfirmSelect表示開啟Confirm模式。channel.WaitForConfirms等待所有消息確認(rèn),如果所有的消息都被服務(wù)端成功接收返回true,只要有一條沒有被成功接收就返回false。

channel.WaitForConfirmsOrDie和WaitForConfirms作用類型,也是等待所有消息確認(rèn),區(qū)別在于該方法沒有返回值(Void)。如果有任意一條消息沒有被成功接收,該方法會立即拋出一個OperationInterrupedException類型異常.

下面看一個簡單的案例:

執(zhí)行結(jié)果如下:

3.消費(fèi)者端消息確認(rèn)

生產(chǎn)者端的消息確認(rèn):從Broke發(fā)送到消費(fèi)者時,RabbitMQ提供了兩種消息確認(rèn)的方式:自動確認(rèn)和顯示確認(rèn)。

??自動確認(rèn)

??顯示確認(rèn)

1、自動確認(rèn):

當(dāng)RabbbitMQ將消息發(fā)送給消費(fèi)者后,消費(fèi)者端接收到消息后,不等待消息處理結(jié)束,立即自動回送一個確認(rèn)回執(zhí)。自動確認(rèn)的用法十分簡單,設(shè)置消費(fèi)方法的參數(shù)autoAck為true即可;如下內(nèi)容:channel.BasicConsume(queue:"myqueue",autoAck: true, consumer: consumer);

?注意:Broker會在接收到確認(rèn)回執(zhí)時刪除消息,如果消費(fèi)者接收到消息并返回了確認(rèn)回執(zhí),然后這個消費(fèi)者在處理消息時掛了,那么這條消息就再也找不回來了。

2、顯示確認(rèn)

我們知道自動確認(rèn)可能會出現(xiàn)消息丟失的問題,我們不免會想到:Broker收到回執(zhí)后才刪除消息,如果可以讓消費(fèi)者在接收消息時不立即返回確認(rèn)回執(zhí),等到消息處理完成后(或者完成一部分的邏輯)再返回確認(rèn)回執(zhí),這樣就保證消費(fèi)端不會丟失消息了!這正是顯式確認(rèn)的思路。使用顯示確認(rèn)也比較簡單,首先將Resume方法的參數(shù)autoAck設(shè)置為false,在消費(fèi)端使用代碼?channel.BasicAck/BasicReject等方法?來確認(rèn)和拒絕消息。

?生產(chǎn)者代碼:

消費(fèi)者代碼如下:

介紹一下代碼中標(biāo)紅的兩個方法:

channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple:?false);?方法用于確認(rèn)消息,deliveryTag參數(shù)是分發(fā)的標(biāo)記,multiple表示是否確認(rèn)多條。channel.BasicReject(deliveryTag: ea.DeliveryTag, requeue:?false);?方法用于拒絕消息,deliveryTag也是指分發(fā)的標(biāo)記,requeue表示消息被拒絕后是否重新放回queue中,true表示放回queue中,false表示直接丟棄

嘗試運(yùn)行:如下圖


一些意外的情況:使用顯式確認(rèn)時,如果消費(fèi)者處理完消息不發(fā)送確認(rèn)回執(zhí),那么消息不會被刪除,消息的狀態(tài)一直是Unacked,這條消息也不會再發(fā)送給其他消費(fèi)者。如果一個消費(fèi)者在處理消息時尚未發(fā)送確認(rèn)回執(zhí)的情況下掛掉了,那么消息會被重新放入隊(duì)列(狀態(tài)從Unacked變成Ready),有其他消費(fèi)者存時,消息會發(fā)送給其他消費(fèi)者。OK,很感謝大家的觀看,本片文章就介紹到這里,下一篇文章我們繼續(xù)探討RabbitMQ;


【朝夕??縍abbitMQ生產(chǎn)者/消費(fèi)者消息確認(rèn)的評論 (共 條)

分享到微博請遵守國家法律
宁化县| 江门市| 花垣县| 阿巴嘎旗| 涪陵区| 庄浪县| 双桥区| 高清| 兴安盟| 同心县| 武义县| 贡山| 天门市| 察哈| 丽水市| 修武县| 山阳县| 临安市| 汶川县| 台北县| 山阴县| 吴川市| 年辖:市辖区| 资中县| 湖北省| 高邑县| 聂拉木县| 吉安市| 碌曲县| 安吉县| 仙游县| 太康县| 西青区| 扶沟县| 武鸣县| 广河县| 高淳县| 万山特区| 沂源县| 西和县| 专栏|