RabbitMQ和kafka對于消費失敗處理總結(jié)

一孝常、kafka

1吕漂、kafka消息模型總結(jié)

發(fā)送消息到topic状共,每個topic可以分成多個Partition套耕,每個Partition對用一個消費者消費,屬于無狀態(tài)消息口芍,Partition每個消息對應(yīng)唯一的offset箍铲,通過zk保存信息,消費端維護offset鬓椭,持久化屬于日志型持久話默認七天刪除消息颠猴。


kafka
2、消費失敗處理方案(個人思考)

業(yè)務(wù)處理異常時小染,暫不提交offset翘瓮,利用數(shù)據(jù)庫(關(guān)系型或非關(guān)系型)保存失敗的消息記錄,根據(jù)失敗策略處理相應(yīng)消息裤翩。保存好記錄之后可以提交offset资盅。
失敗處理可以隔五分鐘再往對應(yīng)的消息隊列發(fā)送該消息(發(fā)送成功就次數(shù)+1,將消息id也傳入消息隊列踊赠,方便記錄失敗次數(shù))復(fù)雜情況可能需要記錄消息失敗的次數(shù)呵扛,到達一定次數(shù)后,改為手工處理

3筐带、保證不丟失消息處理

參考:http://www.reibang.com/p/7a6deaba34d2

一般是要求起碼設(shè)置如下4個參數(shù):
1今穿、給topic設(shè)置replication.factor參數(shù):
這個值必須大于1,要求每個partition必須有至少2個副本在kafka服務(wù)端
2伦籍、設(shè)置min.insync.replicas參數(shù):
這個值必須大于1蓝晒,這個是要求一個leader至少感知到有至少一個follower還跟自己保持聯(lián)系腮出,沒掉隊,這樣才能確保leader掛了還有一個follower吧在producer端
3芝薇、設(shè)置acks=all:
這個是要求每條數(shù)據(jù)胚嘲,必須是寫入所有replica之后,才能認為是寫成功了在producer端
4洛二、設(shè)置retries=MAX
(很大很大很大的一個值馋劈,無限次重試的意思):這個是要求一旦寫入失敗,就無限重試灭红,卡在這里了我們生產(chǎn)環(huán)境就是按照上述要求配置的侣滩,這樣配置之后,至少在kafka broker端就可以保證在leader所在broker發(fā)生故障变擒,進行l(wèi)eader切換時君珠,數(shù)據(jù)不會丟失

二、RabbitMQ

1娇斑、消費失敗處理方案
(1)相關(guān)配置
spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    listener:
      simple:
        retry:                    #拋異常會按retry策略重發(fā)(建議不在程序內(nèi)拋異常策添,記錄失敗消息,然后確認)
          enabled: true           #允許重發(fā)
          max-attempts: 5         #重發(fā)次數(shù)
          initial-interval: 30000 #重發(fā)間隔時間
        acknowledge-mode: manual  #不確認宕機重啟時會重新消費毫缆,確認失敗會一直重發(fā)
    publisher-confirms: true      # 如果消息沒有到exchange,則confirm回調(diào),ack=false唯竹,
                                  # 如果消息到達exchange,則confirm回調(diào),ack=true
    publisher-returns: true       #exchange到queue成功,則不回調(diào)return
                                  #exchange到queue失敗,則回調(diào)return(需設(shè)置mandatory=true,否則不回回調(diào),消息就丟了)

消息手動確認模式的幾點說明:
1、監(jiān)聽的方法內(nèi)部必須使用channel進行消息確認苦丁,包括消費成功或消費失敗
2浸颓、如果不手動確認,也不拋出異常旺拉,消息不會自動重新推送(包括其他消費者)产上,因為對于rabbitmq來說始終沒有接收到消息消費是否成功的確認,并且Channel是在消費端有緩存的蛾狗,沒有斷開連接
3晋涣、如果rabbitmq斷開,連接后會自動重新推送(不管是網(wǎng)絡(luò)問題還是宕機)
4沉桌、如果消費端應(yīng)用重啟柳骄,消息會自動重新推送
5压彭、如果消費端處理消息的時候宕機碍沐,消息會自動推給其他的消費者
6升略、如果監(jiān)聽消息的方法拋出異常,消息會按照listener.retry的配置進行重發(fā)蔼夜,但是重發(fā)次數(shù)完了之后還拋出異常的話松嘶,消息不會重發(fā)(也不會重發(fā)到其他消費者),只有應(yīng)用重啟后會重新推送挎扰。因為retry是消費端內(nèi)部處理的翠订,包括異常也是內(nèi)部處理,對于rabbitmq是不知道的(此場景解決方案后面有)
7遵倦、spring.rabbitmq.listener.retry配置的重發(fā)是在消費端應(yīng)用內(nèi)處理的尽超,不是rabbitqq重發(fā)

(2)方案描述

參考:https://my.oschina.net/dengfuwei/blog/1595047

消費確認機制改為manual手動確認,在消費方法中try catch中梧躺,記錄消費失敗的消息似谁,然后basicAck確認,通過自定義重試策略取出失敗的消息重新消費掠哥,失敗達到一定次數(shù)手動處理
需要注意的 basicAck 方法需要傳遞兩個參數(shù):
(1)deliveryTag(唯一標識 ID):當一個消費者向 RabbitMQ 注冊后巩踏,會建立起一個 Channel ,RabbitMQ 會用 basic.deliver 方法向消費者推送消息续搀,這個方法攜帶了一個 delivery tag塞琼, 它代表了 RabbitMQ 向該 Channel 投遞的這條消息的唯一標識 ID,是一個單調(diào)遞增的正整數(shù)禁舷,delivery tag 的范圍僅限于 Channel
(2)multiple:為了減少網(wǎng)絡(luò)流量彪杉,手動確認可以被批處理,當該參數(shù)為 true 時牵咙,則可以一次性確認 delivery_tag 小于等于傳入值的所有消息

2派近、保證消息不丟失

失敗重發(fā)參考:https://www.cnblogs.com/xujishou/p/6288623.html

1、設(shè)置消息持久化
2洁桌、利用confirm模式渴丸,發(fā)送失敗重新放送
(很多帖子說,confirm模式但是confirm回調(diào)測試沒有消息數(shù)據(jù)無法重發(fā)另凌,建議:https://www.cnblogs.com/xujishou/p/6288623.html)
3谱轨、return exchange到隊列失敗回調(diào),可以獲取到消息相關(guān)消息可重發(fā)

confirm模式 重發(fā)消息途茫,生成CorrelationData碟嘴,重新發(fā)送

private CorrelationData getCorrelationData(String exchange, String routeKey, byte[] body) {
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setReceivedExchange(exchange);
        messageProperties.setReceivedRoutingKey(routeKey);
        Message message = new Message(body, messageProperties);
        CorrelationData correlationData = new CorrelationData();
        correlationData.setReturnedMessage(message);
        return correlationData;
    }

@Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        if (ack) {
            System.out.println("confirm消息發(fā)送成功:" + cause);
        } else {
            String msg = new String(correlationData.getReturnedMessage().getBody());
            System.out.println("confirm消息發(fā)送失敗:" + msg);
            MessageProperties messageProperties = correlationData.getReturnedMessage().getMessageProperties();
            rabbitTemplate.convertAndSend(messageProperties.getReceivedExchange(),
                    messageProperties.getReceivedRoutingKey(),
                    correlationData.getReturnedMessage(),
                    correlationData);
        }
    }
publisher-confirms: true      # 如果消息沒有到exchange,則confirm回調(diào),ack=false囊卜,
                                  # 如果消息到達exchange,則confirm回調(diào),ack=true
publisher-returns: true       #exchange到queue成功,則不回調(diào)return
                                  #exchange到queue失敗,則回調(diào)return(需設(shè)置mandatory=true,否則不回回調(diào),消息就丟了)

三娜扇、疑問

發(fā)送消息時,消息發(fā)送成功栅组,業(yè)務(wù)失敗雀瓢。業(yè)務(wù)成功消息發(fā)送失敗玉掸?
保證業(yè)務(wù)處理成功后發(fā)送消息刃麸,發(fā)送失敗一直重試發(fā)送消息。

四司浪、demo

kafka:https://github.com/huangxiongbiao12/kafka.git
rabbitmq:https://github.com/huangxiongbiao12/rabbitmq-demo.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泊业,一起剝皮案震驚了整個濱河市把沼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吁伺,老刑警劉巖饮睬,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異篮奄,居然都是意外死亡捆愁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門窟却,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昼丑,“玉大人,你說我怎么就攤上這事夸赫∑械郏” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵憔足,是天一觀的道長胁附。 經(jīng)常有香客問我,道長滓彰,這世上最難降的妖魔是什么控妻? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮揭绑,結(jié)果婚禮上弓候,老公的妹妹穿的比我還像新娘。我一直安慰自己他匪,他們只是感情好菇存,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著邦蜜,像睡著了一般依鸥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悼沈,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天贱迟,我揣著相機與錄音,去河邊找鬼絮供。 笑死衣吠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的壤靶。 我是一名探鬼主播缚俏,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了忧换?” 一聲冷哼從身側(cè)響起恬惯,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎包雀,沒想到半個月后宿崭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡才写,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了奖蔓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赞草。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吆鹤,靈堂內(nèi)的尸體忽然破棺而出厨疙,到底是詐尸還是另有隱情,我是刑警寧澤疑务,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布沾凄,位于F島的核電站,受9級特大地震影響知允,放射性物質(zhì)發(fā)生泄漏撒蟀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一温鸽、第九天 我趴在偏房一處隱蔽的房頂上張望保屯。 院中可真熱鬧,春花似錦涤垫、人聲如沸姑尺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽切蟋。三九已至,卻和暖如春榆芦,著一層夾襖步出監(jiān)牢的瞬間柄粹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工歧杏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留镰惦,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓犬绒,卻偏偏與公主長得像旺入,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

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

  • 大致可以通過上述情況進行排除 1.kafka服務(wù)器問題 查看日志是否有報錯茵瘾,網(wǎng)絡(luò)訪問問題等礼华。 2. kafka p...
    生活的探路者閱讀 7,572評論 0 10
  • 一、Kafka簡介 Kafka (科技術(shù)語)拗秘。Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng)圣絮,它可以處理消費者規(guī)...
    邊學(xué)邊記閱讀 1,716評論 0 14
  • 一、入門1雕旨、簡介Kafka is a distributed,partitioned,replicated com...
    HxLiang閱讀 3,342評論 0 9
  • Kafka史上最詳細原理總結(jié)分為上下兩部分扮匠,承上啟下 Kafka史上最詳細原理總結(jié)上 Kafka史上最詳細原理總結(jié)...
    小波同學(xué)閱讀 22,132評論 1 115
  • 西寺溝一日游 很早定好了座位,和一行陌生人開始了一天的旅途凡涩,韓姐棒搜,嬌嬌,壯壯活箕,亢亢力麸,六個人的行程,一堆人的旅行育韩,我...
    木西草丁閱讀 143評論 0 0