ActiveMQ(五)消息的可靠性

消息發(fā)送成功后,接收端接收到了消息。然后進(jìn)行處理蚀乔,但是可能由于某種原因崔步,高并發(fā)也好,IO阻塞也好娱俺,反正這條消息在接收端處理失敗了稍味。而點(diǎn)對(duì)點(diǎn)的特性是一條消息,只會(huì)被一個(gè)接收端給接收荠卷,只要接收端A接收成功了模庐,接收端B,就不可能接收到這條消息油宜,如果是一些普通的消息還好掂碱,但是如果是一些很重要的消息怜姿,比如說用戶的支付訂單,用戶的退款疼燥,這些與金錢相關(guān)的沧卢,是必須保證成功的,那么這個(gè)時(shí)候要怎么處理呢醉者?必須要保證消息的可靠性但狭,除了消息的持久化,還包括兩個(gè)方面湃交,一是生產(chǎn)者發(fā)送的消息可以被ActiveMQ收到熟空,二是消費(fèi)者收到了ActiveMQ發(fā)送的消息。
生產(chǎn)者
send方法
在生產(chǎn)者端息罗,我們會(huì)使用send() 方法向ActiveMQ發(fā)送消息,默認(rèn)情況下才沧,持久化消息以同步方式發(fā)送迈喉,send() 方法會(huì)被阻塞温圆,直到 broker 發(fā)送一個(gè)確認(rèn)消息給生產(chǎn)者岁歉,這個(gè)確認(rèn)消息表示broker已經(jīng)成功接收到消息锅移,并且持久化消息已經(jīng)把消息保存到二級(jí)存儲(chǔ)中非剃。

事務(wù)消息
事務(wù)中消息(無論是否持久化),會(huì)進(jìn)行異步發(fā)送备绽,send() 方法不會(huì)被阻塞券坞。但是commit 方法會(huì)被阻塞,直到收到確認(rèn)消息肺素,表示broker已經(jīng)成功接收到消息恨锚,并且持久化消息已經(jīng)把消息保存到二級(jí)存儲(chǔ)中。

總結(jié)
非持久化又不在事務(wù)中的消息倍靡,可能會(huì)有消息的丟失眠冈。為保證消息可以被ActiveMQ收到,我們應(yīng)該采用事務(wù)消息或持久化消息。
消費(fèi)者
對(duì)消息的確認(rèn)有4種機(jī)制
1蜗顽、 AUTO_ACKNOWLEDGE = 1 自動(dòng)確認(rèn)
2布卡、 CLIENT_ACKNOWLEDGE = 2 客戶端手動(dòng)確認(rèn)
3、 DUPS_OK_ACKNOWLEDGE = 3 自動(dòng)批量確認(rèn)
4雇盖、 SESSION_TRANSACTED = 0 事務(wù)提交并確認(rèn)

ACK_MODE描述了Consumer與broker確認(rèn)消息的方式(時(shí)機(jī)),比如當(dāng)消息被Consumer接收之后,Consumer將在何時(shí)確認(rèn)消息忿等。所以ack_mode描述的不是producer于broker之間的關(guān)系,而是customer于broker之間的關(guān)系崔挖。
對(duì)于broker而言贸街,只有接收到ACK指令,才會(huì)認(rèn)為消息被正確的接收或者處理成功了,通過ACK,可以在consumer與Broker之間建立一種簡(jiǎn)單的“擔(dān)崩晗啵”機(jī)制.
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
第一個(gè)參數(shù):是否支持事務(wù)薛匪,如果為true,則會(huì)忽略第二個(gè)參數(shù)脓鹃,自動(dòng)被jms服務(wù)器設(shè)置為SESSION_TRANSACTED

AUTO_ACKNOWLEDGE
自動(dòng)確認(rèn)
“同步”(receive)方法返回message給消息時(shí)會(huì)立即確認(rèn)逸尖。
在"異步"(messageListener)方式中,將會(huì)首先調(diào)用listener.onMessage(message),如果onMessage方法正常結(jié)束,消息將會(huì)正常確認(rèn)瘸右。如果onMessage方法異常娇跟,將導(dǎo)致消費(fèi)者要求ActiveMQ重發(fā)消息。此外需要注意太颤,消息的重發(fā)次數(shù)是有限制的苞俘,每條消息中都會(huì)包含“redeliveryCounter”計(jì)數(shù)器,用來表示此消息已經(jīng)被重發(fā)的次數(shù)龄章,如果重發(fā)次數(shù)達(dá)到閥值吃谣,將導(dǎo)致broker端認(rèn)為此消息無法消費(fèi),此消息將會(huì)被刪除或者遷移到"dead letter"通道中。
因此當(dāng)我們使用messageListener方式消費(fèi)消息時(shí)做裙,可以在onMessage方法中使用try-catch,這樣可以在處理消息出錯(cuò)時(shí)記錄一些信息岗憋,而不是讓consumer不斷去重發(fā)消息;如果你沒有使用try-catch,就有可能會(huì)因?yàn)楫惓6鴮?dǎo)致消息重復(fù)接收的問題,需要注意onMessage方法中邏輯是否能夠兼容對(duì)重復(fù)消息的判斷

LIENT_ACKNOWLEDGE :
客戶端手動(dòng)確認(rèn)菇用,這就意味著AcitveMQ將不會(huì)“自作主張”的為你ACK任何消息澜驮,開發(fā)者需要自己擇機(jī)確認(rèn)陷揪⊥锱福可以用方法: message.acknowledge(),或session.acknowledge()悍缠;效果一樣卦绣。
如果忘記調(diào)用acknowledge方法,將會(huì)導(dǎo)致當(dāng)consumer重啟后飞蚓,會(huì)接受到重復(fù)消息滤港,因?yàn)閷?duì)于broker而言,那些尚未真正ACK的消息被視為“未消費(fèi)”。
我們可以在當(dāng)前消息處理成功之后溅漾,立即調(diào)用message.acknowledge()方法來"逐個(gè)"確認(rèn)消息山叮,這樣可以盡可能的減少因網(wǎng)絡(luò)故障而導(dǎo)致消息重發(fā)的個(gè)數(shù);當(dāng)然也可以處理多條消息之后添履,間歇性的調(diào)用acknowledge方法來一次確認(rèn)多條消息屁倔,減少ack的次數(shù)來提升consumer的效率,不過需要自行權(quán)衡暮胧。

DUPS_OK_ACKNOWLEDGE
類似于AUTO_ACK確認(rèn)機(jī)制锐借,為自動(dòng)批量確認(rèn)而生,而且具有“延遲”確認(rèn)的特點(diǎn)往衷,ActiveMQ會(huì)根據(jù)內(nèi)部算法钞翔,在收到一定數(shù)量的消息自動(dòng)進(jìn)行確認(rèn)。在此模式下席舍,可能會(huì)出現(xiàn)重復(fù)消息布轿,什么時(shí)候?當(dāng)consumer故障重啟后俺亮,那些尚未ACK的消息會(huì)重新發(fā)送過來驮捍。

SESSION_TRANSACTED
當(dāng)session使用事務(wù)時(shí),就是使用此模式脚曾。當(dāng)決定事務(wù)中的消息可以確認(rèn)時(shí)东且,必須調(diào)用session.commit()方法,commit方法將會(huì)導(dǎo)致當(dāng)前session的事務(wù)中所有消息立即被確認(rèn)本讥。在事務(wù)開始之后的任何時(shí)機(jī)調(diào)用rollback()珊泳,意味著當(dāng)前事務(wù)的結(jié)束,事務(wù)中所有的消息都將被重發(fā)拷沸。當(dāng)然在commit之前拋出異常色查,也會(huì)導(dǎo)致事務(wù)的rollback。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撞芍,一起剝皮案震驚了整個(gè)濱河市秧了,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌序无,老刑警劉巖验毡,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異帝嗡,居然都是意外死亡晶通,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門哟玷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狮辽,“玉大人,你說我怎么就攤上這事『聿保” “怎么了椰苟?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)树叽。 經(jīng)常有香客問我尊剔,道長(zhǎng),這世上最難降的妖魔是什么菱皆? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任须误,我火速辦了婚禮,結(jié)果婚禮上仇轻,老公的妹妹穿的比我還像新娘京痢。我一直安慰自己,他們只是感情好篷店,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布祭椰。 她就那樣靜靜地躺著,像睡著了一般疲陕。 火紅的嫁衣襯著肌膚如雪方淤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天蹄殃,我揣著相機(jī)與錄音携茂,去河邊找鬼。 笑死诅岩,一個(gè)胖子當(dāng)著我的面吹牛讳苦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吩谦,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼鸳谜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了式廷?” 一聲冷哼從身側(cè)響起咐扭,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滑废,沒想到半個(gè)月后蝗肪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡策严,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年穗慕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饿敲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妻导。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出倔韭,到底是詐尸還是另有隱情术浪,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布寿酌,位于F島的核電站胰苏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏醇疼。R本人自食惡果不足惜硕并,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秧荆。 院中可真熱鬧倔毙,春花似錦、人聲如沸乙濒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颁股。三九已至么库,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甘有,已是汗流浹背诉儒。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亏掀,地道東北人允睹。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像幌氮,于是被迫代替她去往敵國和親缭受。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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