国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

回答面試官:如何保證消息不丟失

開發(fā) 前端
對于這個技術(shù)點不知道大家掌握的如何了,消息隊列現(xiàn)在應該是公司必備的技能之一了,無論是RabbitMQ還是rocketmq,或者支持大數(shù)量的kafka。

[[430419]]

rocketmq是阿里開源的一個性能很強大的消息隊列,很多公司都在用,而且經(jīng)歷了多次雙十一的洗禮,支持多種特性

對于這個技術(shù)點不知道大家掌握的如何了,消息隊列現(xiàn)在應該是公司必備的技能之一了,無論是RabbitMQ還是rocketmq,或者支持大數(shù)量的kafka

今天我們要說的一個問題,是rocketmq如何保證消息的不丟失??

不知道大家對于這個問題遇到過沒有,或者大家聽到這個問題的第一反應是什么,應該如何做,如何避免消息丟失,一起來看看

首先我們知道rocketmq的一個消息從生產(chǎn)到最終的消費過程需要經(jīng)歷總共三個階段,或者說會經(jīng)過三個地方,分別是producer的發(fā)送端、broker的持久化機制、以及consumer的消費端

從生產(chǎn)者producer的角度:消息生產(chǎn)之后傳遞到broker,如果消息未能正確的存儲到broker中,算作消息丟失

從broker的角度:消息默認保存到broker的內(nèi)存中,異步保存到磁盤上,如果發(fā)生宕機、磁盤崩潰會造成消息丟失

從消費者consumer的角度:消息完成了持久化之后,consumer拉取之后未能成功消費且未反饋給broker,這樣算作消息丟失,可能消費過程異常或者網(wǎng)絡抖動造成消息丟失

生產(chǎn)者角度:消費生產(chǎn)之后傳遞到broker,如果消息未能正確的保存到broker中,算作消息丟失

從生產(chǎn)者的角度,生產(chǎn)了消息就是要通過網(wǎng)絡發(fā)送到broker,其實只需要保證一點,就是確認這個消息已經(jīng)成功發(fā)送到broker上了

生產(chǎn)者只需要接收發(fā)送消息返回的確認響應即可,就可以代表消息發(fā)送成功

代碼示例:

  1. DefaultMQProducer mqProducer=new DefaultMQProducer("test"); 
  2. // 設置 nameSpace地址 
  3. mqProducer.setNamesrvAddr("namesrvAddr"); 
  4. mqProducer.start(); 
  5. Message msg = new Message("topic" /* Topic */, 
  6.         "Captain".getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */ 
  7. ); 
  8. // 發(fā)送消息到Broker 
  9. try { 
  10.     SendResult sendResult = mqProducer.send(msg); 
  11. } catch (Exception e) { 
  12.     e.printStackTrace(); 

當然,發(fā)送消息也分為同步和異步兩種,消息發(fā)送成功之后會返回下面這四種不同的響應狀態(tài)

SEND_OK

消息發(fā)送成功,但是也并不意味這完全代表不會丟失消息,這還要取決于broker的刷盤方式

這個下面在broker方面會說,需要啟動SYNC_MASTER或SYNC_FLUSH。(也就是同步)

FLUSH_DISK_TIMEOUT

如果Broker設置MessageStoreConfig的FlushDiskType = SYNC_FLUSH(默認為ASYNC_FLUSH),并且Broker沒有在MessageStoreConfig的syncFlushTimeout(默認為5秒)內(nèi)完成刷新磁盤,得到這個狀態(tài)

也就是此時刷盤超時,未能在規(guī)定時間內(nèi)落到硬盤上,檢查設置是否合理、硬盤大小等情況

FLUSH_SLAVE_TIMEOUT

如果Broker的角色是SYNC_MASTER(默認為ASYNC_MASTER),并且從屬Broker未在MessageStoreConfig的syncFlushTimeout(默認為5秒)內(nèi)完成與主服務器的同步,返回這個結(jié)果

主從同步時間默認也是5秒,需要完成主從同步,這個下面在說broker的時候也會說到,你想啊,要是master掛了或者磁盤崩潰了,這是不是也不能百分百保證消息不丟失

SLAVE_NOT_AVAILABLE

如果Broker的角色是SYNC_MASTER(默認為ASYNC_MASTER),但沒有配置slave Broker,返回這個狀態(tài)

這個在保證消息絕對不丟失的情況下是不允許存在的,這個狀態(tài)也是屬于需要處理的,沒有可靠的slave,也就意味著沒有可靠的備份數(shù)據(jù),所以這種情況也需要考慮

另外呢,上面還說了一種異步的消息發(fā)送方式,這種一般是用于鏈路較長,對于時間比較敏感的業(yè)務

這種情況下需要特別注意的就是我們需要設置消息發(fā)送完成的回調(diào),這樣才能更好的保證消息不丟失

采取事務消息的投遞方式,并不能保證消息100%投遞成功到了Broker,但是如果消息發(fā)送Ack失敗的話,此消息會存儲在CommitLog當中,但是對ConsumerQueue是不可見的

可以在日志中查看到這條異常的消息,嚴格意義上來講,也并沒有完全丟失

  • broker:消息默認保存到broker的內(nèi)存中,異步保存到磁盤上,如果發(fā)生宕機、磁盤崩潰會造成消息丟失

順序消費這個場景其實不是特別的常見,但是也是必不可少的,因為在某些業(yè)務場景下順序是很關(guān)鍵的,保證消息的消費順序也是很關(guān)鍵

消息到了broker之后,默認是優(yōu)先保存到broker的內(nèi)存中,然后立刻返回響應給生產(chǎn)者producer,然后broker自己定期將消息批量的異步的保存到硬盤上

有的小伙伴一小子就發(fā)現(xiàn)了問題不是那么簡單,消息來了之后還沒保存到硬盤,就直接返回了,broker直接宕機崩潰了,那這消息豈不無跡可尋了

這樣的優(yōu)點是提高交互的效率,同時減少IO的次數(shù),問題就是會造成消息丟失

如果我們想要保證消息不丟失,那就需要保證消息成功保存到broker之后才可以返回,只需要將消息的保存機制修改為同步刷盤的方式,也就是只有消息保存到broker的磁盤成功之后,才會返回響應

  1. ## 默認情況為 ASYNC_FLUSH  
  2. flushDiskType = SYNC_FLUSH 

如果broker未能在規(guī)定的同步時間(默認5秒)完成刷盤,將返回FLUSH_DISK_TIMEOUT給生產(chǎn)者

上面也介紹了這個了FLUSH_DISK_TIMEOUT了

一般在系統(tǒng)中為了保證可用性,broker通常采用的都是一主master多從slave的部署方式,屬于集群部署

為了保證消息不丟失,消息需要復制到slave節(jié)點,其實默認的情況下,消息寫入到broker之后就會返回成功

但是!如果master突然宕機或者磁盤崩潰了,那么這個消息就徹底丟失了,沒有備份,所以呢,這里還需要把master和slave的異步復制改成同步復制

  1. ## master 節(jié)點配置 
  2. flushDiskType = SYNC_FLUSH 
  3. brokerRole=SYNC_MASTER 
  4.  
  5. ## slave 節(jié)點配置 
  6. brokerRole=slave 
  7. flushDiskType = SYNC_FLUSH 

也就是只有slave也刷盤到磁盤成功之后,才會給producer返回成功

當然你要這里說,master和slave也可能同時宕機,同時磁盤崩潰,那最終還是無法滿足百分百保證消息的不丟失

這種問題啊,其實就像是TCP的三次交互一樣,三次交互之后一定保證客戶端和服務端通信成功了嗎,答案是不一定

我們只能在有限的資源下盡量的去滿足系統(tǒng)的穩(wěn)定性

  • consumer:消息完成了持久化之后,consumer拉取之后未能成功消費且未反饋給broker,這樣算作消息丟失,可能消費過程異常或者網(wǎng)絡抖動造成消息丟失

消費者從broker拉取消息,然后進行相應的業(yè)務的消費,消費成功會返回一個消費成功的狀態(tài)給broker,broker如果沒收到確認信息,消費者下次拉取重新拉取該消息

  1. // 注冊回調(diào)實現(xiàn)類來處理從broker拉取回來的消息 
  2. consumer.registerMessageListener(new MessageListenerConcurrently() { 
  3.     @Override 
  4.     public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { 
  5.         // 標記該消息已經(jīng)被成功消費 
  6.         return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; 
  7.     } 
  8. }); 

consumer自身可以維護一個持久化的offset,對應MessageQueue里面的min offset,標記已經(jīng)成功消費或者已經(jīng)成功發(fā)回到broker的消息下標

如果consumer消費失敗,會把這個消息發(fā)回給broker,發(fā)回成功后,更新自己的offset

如果發(fā)回給broker時,broker掛掉了,那么consumer也會定時重試這個操作

即使consumer和broker一起掛掉了,消息也不會丟失,因為consumer里面的offset會定時持久化,重啟之后,繼續(xù)拉取offset之前的消息到本地,重新消費

本文轉(zhuǎn)載自微信公眾號「Java賊船」

 

責任編輯:姜華 來源: Java賊船
相關(guān)推薦

2025-11-11 09:05:09

2022-08-26 05:24:04

中間件技術(shù)Kafka

2025-11-17 01:22:00

2024-08-06 09:55:25

2020-12-31 07:34:04

Redis數(shù)據(jù)宕機

2025-09-18 08:53:20

2025-09-22 08:26:37

2025-11-21 10:10:56

2024-02-28 10:14:47

Redis數(shù)據(jù)硬盤

2023-09-01 15:27:31

2021-03-08 10:19:59

MQ消息磁盤

2024-06-06 11:38:55

2024-06-18 08:26:22

2021-12-21 07:07:43

HashSet元素數(shù)量

2025-10-09 01:22:00

2019-11-26 08:24:13

TCP擁塞控制網(wǎng)絡協(xié)議

2024-11-11 07:05:00

Redis哨兵模式主從復制

2024-02-26 08:10:00

Redis數(shù)據(jù)數(shù)據(jù)庫

2025-07-21 09:02:45

2021-03-22 17:20:48

MYSQL開發(fā)數(shù)據(jù)庫
點贊
收藏

51CTO技術(shù)棧公眾號

精品电影一区| 亚洲综合激情小说| 在线播放豆国产99亚洲| 亚洲视频精选在线| 欧美大胆a人体大胆做受| 97在线视频免费| 欧美日韩国产欧| 视频一区二区在线播放| 久久精品国产sm调教网站演员| 91精品国产综合久久精品app| 日韩国产综合| 国产传媒在线| 久久久久久久成人| 亚洲第一中文字幕| 老司机免费视频久久| 欧美jizz19性欧美| 国产麻豆一区二区三区| mm视频在线视频| 欧美性爽视频| 二区在线播放| 免费观看在线黄色网| 99免费在线视频观看| 粉嫩av一区二区三区粉嫩| 理论视频在线| 国产精品一区av| 中文字幕在线免费不卡| 成人春色在线观看免费网站| 一个人看的www一区| 2020久久国产精品| 欧美精品在线观看| 日韩欧美一二三| 亚洲欧美一区二区三区国产精品| 无人区乱码一区二区三区| 国产69精品久久久久久久| 久久久在线免费观看| 亚洲国产精品成人精品| 香蕉久久一区| 国产小视频精品| 极品美女扒开粉嫩小泬| 毛片一区二区三区四区| 国内精品美女av在线播放| 欧美中文一区二区三区| 蜜桃视频在线观看一区二区| 怡红院成人在线| 黄色一级片在线观看| 国产成人福利夜色影视| 欧美久久久久中文字幕| 欧洲精品久久久久毛片完整版| 91在线视频一区| 99国产欧美另类久久久精品| caopen在线视频| 国产精品久久综合av爱欲tv| 国产毛片一区二区| 毛片激情在线观看| 国产精品免费视频xxxx| 久久久久九九视频| 日韩精品99| 久久精品人人做人人爽电影| 亚洲午夜av在线| 精品国模一区二区三区欧美 | 芒果视频成人app| 91亚洲永久免费精品| 国产三级一区二区| 欧美日韩尤物久久| 日韩激情视频| 在线国产亚洲欧美| 日韩在线综合| 成视人a免费观看视频| 九九九久久久久久| 国产精品一二三| av今日在线| 色阁综合av| 91精品国产91热久久久做人人| 欧美成人69av| 在线欧美成人| 成人写真福利网| 亚洲品质自拍视频| 蜜臀av一区| 91亚洲免费视频| 欧美大片免费观看| 972aa.com艺术欧美| 手机在线观看av| 婷婷视频在线播放| 亚洲电影天堂av| 久久男女视频| 免费电影网站在线视频观看福利| 精品乱码一区| 色婷婷av一区二区三区软件| 成人看的羞羞网站| 中文在线二区| 91精品久久久久久久久青青| 亚洲一二三四在线观看| 啪啪亚洲精品| 探花国产精品| 久久精品一区二区三区不卡牛牛| 免费的一级黄色片| 色噜噜国产精品视频一区二区| 国内一区二区视频| 韩国成人动漫| 草草久久久无码国产专区| 中文字幕亚洲欧美在线 | 国产91久久精品一区二区| 99re热在线观看| 91国内免费在线视频| 一区二区在线观看av| 欧洲乱码伦视频免费| 一本大道香蕉8中文在线视频| 亚洲r级在线观看| 一本色道a无线码一区v| 羞羞视频在线观看欧美| caoporn-草棚在线视频最| 亚洲色婷婷久久精品av蜜桃| 日韩在线视频中文字幕| 国产精品国产自产拍高清av| 精品日本12videosex| 国产小视频在线| 亚洲一区二区三区精品动漫| 一本色道久久88精品综合| 国产欧美日韩另类一区| 视频精品在线观看| 日本亚洲精品| 日韩视频一二三| 欧美丰满少妇xxxxx| 亚洲成人激情av| 午夜亚洲福利在线老司机| www.成人在线视频| 男女爱爱免费网站| 国产日韩欧美二区| 日韩av网站大全| 亚洲国产精品99久久久久久久久| 精品久久久久中文字幕小说 | av在线首页| 亚洲啪啪av| 久久亚洲电影天堂| 色综合欧美在线| 韩国精品一区二区| 亚洲图片久久| 欧美96在线| 任你操这里只有精品| 国产精品在线看| 亚洲四虎影院| 国产91xxx| 国产精品欧美激情在线播放| 日韩欧美www| 久久综合色婷婷| 1024成人| 亚洲一区二区av| 一级二级三级在线观看| 亚洲乱码日产精品bd在线观看| 91sa在线看| 亚洲成人av片在线观看| 国产精品蜜臀在线观看| 美女国产精品| 私拍精品福利视频在线一区| fc2ppv国产精品久久| 妞干网2018| 亚洲欧美日韩不卡一区二区三区| 欧美劲爆第一页| 91精品国产综合久久婷婷香蕉| 国产午夜精品一区二区三区嫩草 | 欧美日本一区二区高清播放视频| 金瓶狂野欧美性猛交xxxx| 亚洲免费av一区二区三区| 成人午夜电影在线播放| 色噜噜狠狠狠综合曰曰曰| 欧美日韩中文字幕日韩欧美| eeuss鲁片一区二区三区在线观看| 欧美精选一区二区三区| 国模套图日韩精品一区二区| 中文有码在线观看| 看av免费毛片手机播放| 久久亚洲综合网| 69av视频在线播放| 亚洲一区二区国产| 91国内精品野花午夜精品| 欧美激情一区二区三区四区| 亚洲欧美日韩一区在线观看| 美女毛片一区二区三区四区最新中文字幕亚洲| 在线电影福利片| 欧洲伦理片一区 二区 三区| 青青青国产在线视频| 二级片在线观看| 国模精品娜娜一二三区| 国产精品久久久久久久av电影| 最近2019中文字幕mv免费看 | 一级片免费看| 波多野结衣av一区二区全免费观看| 久草在线成人| 国产精品-区区久久久狼 | 久久99精品国产| 欧洲一区二区三区精品| 老司机99精品99| 免费福利影院| 成年人视频在线免费| 亚洲一区二区不卡视频| 久久99精品久久久久久水蜜桃| 91精品久久久久久久| 97在线观看视频国产| 色综合久久88色综合天天看泰| 亚洲欧美日韩直播|