rocketmq重試機制止潘。
producer端推送消息到broker失敗重試:
有很多種情況會影響生產(chǎn)端重試發(fā)送消息呈驶。
1,網(wǎng)絡(luò)不可達造成的重試:如果在生產(chǎn)者發(fā)送消息到broker或者broker向生產(chǎn)者發(fā)送結(jié)果時,因為網(wǎng)絡(luò)原因,生產(chǎn)者沒有獲取成功響應(yīng)狡刘,在這中情況下享潜,生產(chǎn)者會無限次重試困鸥。
2,broker存儲過程中出現(xiàn)異常剑按,會導(dǎo)致生產(chǎn)者重試疾就。consumer端消費消息失敗重試。
1艺蝴,網(wǎng)絡(luò)不可達猬腰,這種情況和生產(chǎn)者一樣,不可達造成的重試(相當(dāng)于瀏覽器訪問一個請求沒有返回200響應(yīng)碼猜敢,都算網(wǎng)絡(luò)不可達)會是無限次的姑荷。
2,由于業(yè)務(wù)業(yè)務(wù)處理的原因?qū)е庐惓5某霈F(xiàn)缩擂,導(dǎo)致給broker的響應(yīng)不是成功的結(jié)果(相當(dāng)于瀏覽器請求返回200鼠冕,成功結(jié)果,但是業(yè)務(wù)code是非成功的code)胯盯,這種失敗時有次數(shù)限時的重試懈费,每次重試會延遲發(fā)送消費信息,避免短時間內(nèi)消費端沒有解決bug或者服務(wù)沒有啟動博脑,所以有個延遲重試憎乙。
rocket的集群模式
1票罐,單機模式:在測試環(huán)境的時候,由于資源的限制泞边,可以選擇單機该押,執(zhí)行或者學(xué)習(xí)rocketmq的功能。
2阵谚,多master沈善;只有master沒有salve;rocketmq每個master之間是互不通信椭蹄,所以闻牡,如果某個mater宕機,該臺機器上的數(shù)據(jù)是無法被消費的绳矩,只有等到master重新啟動才可以被消費端消費罩润。如果宕機的master磁盤有問題,且無法恢復(fù)翼馆,會導(dǎo)致master的數(shù)據(jù)丟失割以,即消息丟失。
3应媚,多master多slave严沥;這種模式即每個master至少會有slave(master和slave的集群名稱和接單名稱一樣,只是節(jié)點的id不同中姜,而且master的id必須為0消玄,slave的id大于0,可以是一臺也可以多臺slave丢胚,1翩瓜,2,3携龟,4兔跌,5標(biāo)示不同的slave)。這種方式雖然需要的資源比較多峡蟋,但是可以保證在master掛掉的時候坟桅,不影響消費者的消費,可以減小對消費端的影響蕊蝗。master和slave之間是有聯(lián)系的仅乓,在配置的時候,master和slave可以配置不同的數(shù)據(jù)同步模式匿又,可以異步復(fù)制方灾,也可以同步雙寫;異步復(fù)制效率更高,但是如果master掛掉裕偿,磁盤損壞的情況下洞慎,會有少量數(shù)據(jù)丟失,但是不會想多master模式下嘿棘,master掛掉并且磁盤順壞導(dǎo)致這個節(jié)點下的所有的數(shù)據(jù)丟失劲腿。同步雙寫,是說producer發(fā)送消息的時候鸟妙,只有master和slave都保存成功的時候焦人,才告訴producer發(fā)送成功,這樣即使master掛掉重父,slave也有完整的數(shù)據(jù)花椭,可以保證消息不丟失,但是效率較異步復(fù)制差房午,這種情況一般適用于和錢相關(guān)的矿辽,不能允許丟消息的情況。
rocketmq的發(fā)布-訂閱
rocketmq支持廣播和發(fā)布-訂閱兩種消息模式郭厌。發(fā)布-訂閱模式袋倔,嚴(yán)格意義上說必須是先啟動consumer端,再啟動producer端。如果先啟動生產(chǎn)端并生產(chǎn)消息,之后在啟動消費端妙色,會有一些意想不到的結(jié)果【醣牵可能會導(dǎo)致大量的重復(fù)消費的情況。
rocketmq消費端冪等性設(shè)計。
集群模式下,生產(chǎn)端如果消息發(fā)送失敗嘱根,生產(chǎn)端會重試。但是有時候巷懈,生產(chǎn)端發(fā)送消息broker保存成功,但是在向producer反饋的時候慌洪,網(wǎng)絡(luò)異常顶燕,導(dǎo)致生產(chǎn)端誤以為失敗。重復(fù)發(fā)送消息冈爹∮抗ィ或者在消費端,消費成功频伤,但是網(wǎng)絡(luò)原因ack的時候失敗恳谎。導(dǎo)致broker重復(fù)發(fā)送消息到消費端。或者剛啟動的consumer因痛,會消費到另一個consumer正在消費婚苹,但是還沒有反饋給broker結(jié)果的消息。等等情況都會導(dǎo)致消費端消費的重復(fù)的消息鸵膏。
這個時候膊升,為了保證數(shù)據(jù)的一致性,必須在消費端要保證消費的冪等性谭企。即廓译,如果有重復(fù)的消息,直接反饋上一次消費成功的結(jié)果债查。如果沒有消費成功非区,再繼續(xù)消費№锿ⅲ總之院仿,消息只能被成功消費一次。
如何保證rocketmq消費的冪等性
在生產(chǎn)端發(fā)送消息的時候速和,message可以傳遞key歹垫,這個key必須是全局唯一的(可以是時間毫秒數(shù)),這樣消費端在消費的時候可以看是否有改key的成功消費結(jié)果颠放。如果有直接反饋成功結(jié)果給broker排惨,如果沒有繼續(xù)消費∨鲂祝或者在消息中有唯一性的業(yè)務(wù)主鍵暮芭,這樣可以使用業(yè)務(wù)主鍵而不使用key來保證不重復(fù)消費。