RocketMQ:消息重試

消息的發(fā)送和消費并不是百分百成功的拜银,在出現(xiàn)消息推送失敗時柿扣,RocketMQ有何補償方式來進(jìn)行消息重試呢咽白?這是我們今天要一起學(xué)習(xí)的點。

1. 順序消息的重試

對于順序消息篓足,當(dāng)消費者消費消息失敗后段誊,消息隊列 RocketMQ 會自動不斷進(jìn)行消息重試(每次間隔時間為 1 秒),這時栈拖,應(yīng)用會出現(xiàn)消息消費被阻塞的情況枕扫。因此,在使用順序消息時辱魁,務(wù)必保證應(yīng)用能夠及時監(jiān)控并處理消費失敗的情況,避免阻塞現(xiàn)象的發(fā)生诗鸭。

2. 無序消息的重試

對于無序消息(普通染簇、定時、延時强岸、事務(wù)消息)锻弓,當(dāng)消費者消費消息失敗時,您可以通過設(shè)置返回狀態(tài)達(dá)到消息重試的結(jié)果蝌箍。

注意:無序消息的重試只針對集群消費方式生效青灼;廣播方式不提供失敗重試特性,即消費失敗后妓盲,失敗消息不再重試杂拨,繼續(xù)消費新的消息。

2.1 重試次數(shù)

消息隊列 RocketMQ 默認(rèn)允許每條消息最多重試 16 次悯衬,每次重試的間隔時間如下:

第幾次重試 與上次重試的間隔時間 第幾次重試 與上次重試的間隔時間
1 10 秒 9 7 分鐘
2 30 秒 10 8 分鐘
3 1 分鐘 11 9 分鐘
4 2 分鐘 12 10 分鐘
5 3 分鐘 13 20 分鐘
6 4 分鐘 14 30 分鐘
7 5 分鐘 15 1 小時
8 6 分鐘 16 2 小時

如果消息重試 16 次后仍然失敗弹沽,消息將不再投遞。如果嚴(yán)格按照上述重試時間間隔計算筋粗,某條消息在一直消費失敗的前提下策橘,將會在接下來的 4 小時 46 分鐘之內(nèi)進(jìn)行 16 次重試,超過這個時間范圍消息將不再重試投遞娜亿。

注意: 一條消息無論重試多少次丽已,這些重試消息的 Message ID 不會改變。

2.2 配置方式

2.2.1 消費失敗后买决,重試配置方式

集群消費方式下沛婴,消息消費失敗后期望消息重試吼畏,需要在消息監(jiān)聽器接口的實現(xiàn)中明確進(jìn)行配置(三種方式任選一種):

  • 返回 Action.ReconsumeLater (推薦)
  • 返回 Null
  • 拋出異常
public class MessageListenerImpl implements MessageListener {
    @Override
    public Action consume(Message message, ConsumeContext context) {
        //處理消息
        doConsumeMessage(message);
        //方式1:返回 Action.ReconsumeLater,消息將重試
        return Action.ReconsumeLater;
        //方式2:返回 null瘸味,消息將重試
        return null;
        //方式3:直接拋出異常宫仗, 消息將重試
        throw new RuntimeException("Consumer Message exceotion");
    }
}

2.2.2 消費失敗后,不重試配置方式

集群消費方式下旁仿,消息失敗后期望消息不重試藕夫,需要捕獲消費邏輯中可能拋出的異常,最終返回 Action.CommitMessage枯冈,此后這條消息將不會再重試毅贮。

public class MessageListenerImpl implements MessageListener {
    @Override
    public Action consume(Message message, ConsumeContext context) {
        try {
            doConsumeMessage(message);
        } catch (Throwable e) {
            //捕獲消費邏輯中的所有異常,并返回 Action.CommitMessage;
            return Action.CommitMessage;
        }
        //消息處理正常尘奏,直接返回 Action.CommitMessage;
        return Action.CommitMessage;
    }
}

2.2.3 自定義消息最大重試次數(shù)

消息隊列 RocketMQ 允許 Consumer 啟動的時候設(shè)置最大重試次數(shù)滩褥,重試時間間隔將按照如下策略:

  • 最大重試次數(shù)小于等于 16 次,則重試時間間隔同上表描述炫加。
  • 最大重試次數(shù)大于 16 次瑰煎,超過 16 次的重試時間間隔均為每次 2 小時。
Properties properties = new Properties();
//配置對應(yīng) Group ID 的最大消息重試次數(shù)為 20 次
properties.put(PropertyKeyConst.MaxReconsumeTimes, "20");
Consumer consumer =ONSFactory.createConsumer(properties);

需要注意的是:

  • 消息最大重試次數(shù)的設(shè)置對相同 Group ID 下的所有 Consumer 實例有效俗孝。
  • 如果只對相同 Group ID 下兩個 Consumer 實例中的其中一個設(shè)置了 MaxReconsumeTimes酒甸,那么該配置對兩個 Consumer 實例均生效。
  • 配置采用覆蓋的方式生效赋铝,即最后啟動的 Consumer 實例會覆蓋之前的啟動實例的配置插勤。

2.2.4 獲取消息重試次數(shù)

消費者收到消息后,可按照如下方式獲取消息的重試次數(shù):

public class MessageListenerImpl implements MessageListener {
    @Override
    public Action consume(Message message, ConsumeContext context) {
        //獲取消息的重試次數(shù)
        System.out.println(message.getReconsumeTimes());
        return Action.CommitMessage;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末革骨,一起剝皮案震驚了整個濱河市农尖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌良哲,老刑警劉巖盛卡,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異臂外,居然都是意外死亡窟扑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進(jìn)店門漏健,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嚎货,“玉大人,你說我怎么就攤上這事蔫浆≈呈簦” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵瓦盛,是天一觀的道長洗显。 經(jīng)常有香客問我外潜,道長,這世上最難降的妖魔是什么挠唆? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任处窥,我火速辦了婚禮,結(jié)果婚禮上玄组,老公的妹妹穿的比我還像新娘滔驾。我一直安慰自己,他們只是感情好俄讹,可當(dāng)我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布哆致。 她就那樣靜靜地躺著,像睡著了一般患膛。 火紅的嫁衣襯著肌膚如雪摊阀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天踪蹬,我揣著相機(jī)與錄音胞此,去河邊找鬼。 笑死跃捣,一個胖子當(dāng)著我的面吹牛豌鹤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枝缔,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蚊惯!你這毒婦竟也來了愿卸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤截型,失蹤者是張志新(化名)和其女友劉穎趴荸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宦焦,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡发钝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了波闹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酝豪。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖精堕,靈堂內(nèi)的尸體忽然破棺而出孵淘,到底是詐尸還是另有隱情,我是刑警寧澤歹篓,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布瘫证,位于F島的核電站揉阎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏背捌。R本人自食惡果不足惜毙籽,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毡庆。 院中可真熱鬧坑赡,春花似錦、人聲如沸扭仁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乖坠。三九已至搀突,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間熊泵,已是汗流浹背仰迁。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留顽分,地道東北人徐许。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像卒蘸,于是被迫代替她去往敵國和親雌隅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,982評論 2 361