RabbitMq 之死信隊(duì)列-神之有用*2

DLX 徐鹤,全稱為 Dead-Letter-Exchange 阎抒,可以稱之為死信交換器沦辙,也有人稱之為死信郵箱灾炭。當(dāng) 消息在一個(gè)隊(duì)列中變成死信 (dead message) 之后茎芋,它能被重新被發(fā)送到另一個(gè)交換器中,這個(gè)交換器就是 DLX 蜈出,綁定 DLX 的隊(duì)列就稱之為死信隊(duì)列田弥。

消息變成死信 ,一般是由于以下幾種情況:
~消息被拒絕 (Basic.Reject/Basic .Nack) 铡原,井且設(shè)置 requeue 參數(shù)為 false;
~消息過期;
~隊(duì)列達(dá)到最大長度偷厦。

DLX 也是一個(gè)正常的交換器,和一般的交換器沒有區(qū)別燕刻,它能在任何的隊(duì)列上被指定 只泼,實(shí)際上就是設(shè)置某個(gè)隊(duì)列的屬性。當(dāng)這個(gè)隊(duì)列中存在死信時(shí)酌儒,RabbitMQ 就會(huì)自動(dòng)地將這個(gè)消息 新發(fā)布到設(shè)置的 DLX上去 辜妓,進(jìn)而被路由到另一個(gè)隊(duì)列,即死信隊(duì)列忌怎〖危可以監(jiān)聽這個(gè)隊(duì)列中的消 息、以進(jìn)行相應(yīng)的處理榴啸,這個(gè)特性與將消息的 TTL 設(shè)置為0 配合使用可以彌補(bǔ) imrnediate 參數(shù) 的功能孽惰。

通過在 channel.queueDeclare 方法中設(shè)置 x-dead-letter-exchange 參數(shù)來為這 個(gè)隊(duì)列添加 DLX

channel.exchangeDeclare("dlx_exchange " , "direct "); // 創(chuàng)建 DLX: dlx_exchange 
Map<String,String> args = new HashMap<String,String>(); 
args.put("x-dead-letter-exchange" , " dlx_exchange "); // 值為交換機(jī)的名字
//為隊(duì)列 myqueue 添加 DLX
channel.queueDeclare("myqueue" , false , false , false , args); 
//也可以為這個(gè) DLX 指定路由鍵,如果沒有特殊指定鸥印,則使用原隊(duì)列的路由鍵:
args.put("x-dead-letter-routing-key" , "dlx-routing-key");// 

示例:

channel.exchangeDeclare("exchange.dlx" , "direct " , true); 
channel.exchangeDeclare( "exchange.normal " , " fanout " , true);  
Map<String,String> args = new HashMap<String,String>();
args.put("x-message-ttl " , 10000);
args.put( "x-dead-letter-exchange " , " exchange.dlx"); 
args.put( "x-dead-letter-routing-key" , " routingkey");
channel.queueDeclare( "queue.normal" , true , false , false , args);  
channel.queueBind( "queue.normal " , "exchange .normal" , ""); 
channel.queueDeclare( "queue.dlx" , true , false , false , null) ; 
channel.queueBind( "queue.dlx" , "exchange.dlx " , routingkey"); 
channel.basicPublish("exchange.normal","rk",MessageProperties.PERSISTENT_TEXT_PLAIN,"dlx".getBytes());

這里創(chuàng)建了兩個(gè)交換器 exchange.normal 和 exchange.dlx 分別綁定兩個(gè)隊(duì)列 queue.normal 和 queue.dlx勋功。

生產(chǎn)者首先發(fā)送一條攜帶路由鍵為 rk 的消息,然后經(jīng)過交換器 exchange.normal 順利地存儲(chǔ)到隊(duì)列 queue.normal 中库说。由于隊(duì)列 queue.normal 設(shè)置了過期時(shí)間為 10s 在這 10s 內(nèi)沒有消費(fèi)者消費(fèi)這條消息狂鞋,那么判定這條消息為過期。由于設(shè)置了 DLX 過期 之時(shí) 消息被丟給交換器 exchange.dlx 中潜的,這時(shí)找到 與exchange.dlx 匹配的隊(duì)列 queue.dlx 最后消息被存儲(chǔ)在 queue.dlx 這個(gè)死信隊(duì)列中骚揍。


來自RabbitMq實(shí)戰(zhàn).pdf

對(duì)于 RabbitMQ 來說, DLX 是一個(gè)非常有用的特性 它可以處理異常情況下啰挪,消息不能夠 被消費(fèi)者正確消費(fèi)(消費(fèi)者調(diào)用了 Basic.Nack 或者 Basic.Reject) 而被置入死信隊(duì)列中 的情況信不,后續(xù)分析程序可以通過消費(fèi)這個(gè)死信隊(duì)列中的內(nèi)容來分析當(dāng)時(shí)所遇到的異常情況,進(jìn) 而可以改善和優(yōu)化系統(tǒng)亡呵。 DLX 配合 TTL 使用還可以實(shí)現(xiàn)延遲隊(duì)列的功能抽活。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市锰什,隨后出現(xiàn)的幾起案子下硕,更是在濱河造成了極大的恐慌丁逝,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卵牍,死亡現(xiàn)場(chǎng)離奇詭異果港,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)糊昙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門辛掠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人释牺,你說我怎么就攤上這事萝衩。” “怎么了没咙?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵乓梨,是天一觀的道長蝴乔。 經(jīng)常有香客問我吆鹤,道長丛肮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任涡驮,我火速辦了婚禮暗甥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捉捅。我一直安慰自己撤防,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布棒口。 她就那樣靜靜地躺著寄月,像睡著了一般。 火紅的嫁衣襯著肌膚如雪无牵。 梳的紋絲不亂的頭發(fā)上漾肮,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音茎毁,去河邊找鬼克懊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛充岛,可吹牛的內(nèi)容都是我干的保檐。 我是一名探鬼主播耕蝉,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼崔梗,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了垒在?” 一聲冷哼從身側(cè)響起蒜魄,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤扔亥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后谈为,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旅挤,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年伞鲫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了粘茄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秕脓,死狀恐怖柒瓣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吠架,我是刑警寧澤芙贫,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站傍药,受9級(jí)特大地震影響磺平,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拐辽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一拣挪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧薛训,春花似錦媒吗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至介袜,卻和暖如春甫何,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遇伞。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工辙喂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸠珠。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓巍耗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親渐排。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炬太,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354