日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

阿里二面:要保證消息不丟失,又不重復(fù),消息隊列怎么選型?

來源: 責(zé)編: 時間:2024-01-16 10:14:42 244觀看
導(dǎo)讀大家好,我是君哥。在使用消息隊列時,有兩個經(jīng)常讓我們煩惱的問題,消息丟失和消息重復(fù)。那我們在做技術(shù)選型時,有沒有一個消息隊列能解決消息丟失和消息重復(fù)這兩個問題呢?消息丟失如上圖,從生產(chǎn)者發(fā)送消息,Broker 保存消息,消

N3o28資訊網(wǎng)——每日最新資訊28at.com

大家好,我是君哥。N3o28資訊網(wǎng)——每日最新資訊28at.com

在使用消息隊列時,有兩個經(jīng)常讓我們煩惱的問題,消息丟失和消息重復(fù)。那我們在做技術(shù)選型時,有沒有一個消息隊列能解決消息丟失和消息重復(fù)這兩個問題呢?N3o28資訊網(wǎng)——每日最新資訊28at.com

消息丟失

N3o28資訊網(wǎng)——每日最新資訊28at.com

如上圖,從生產(chǎn)者發(fā)送消息,Broker 保存消息,消費者消費消息,每一個環(huán)節(jié)都有可能丟失消息。N3o28資訊網(wǎng)——每日最新資訊28at.com

發(fā)送丟失

生產(chǎn)者發(fā)送消息時,如果處理不當(dāng),很可能會造成消息丟失。N3o28資訊網(wǎng)——每日最新資訊28at.com

生產(chǎn)者發(fā)送消息,主流消息隊列都支持同步發(fā)送和異步發(fā)送。如果使用同步發(fā)送,生產(chǎn)者發(fā)送消息后,會同步等待 Broker 返回的 ACK,收到 ACK 消息,就認(rèn)為消息發(fā)送成功。如果長時間沒有收到,則會認(rèn)為消息發(fā)送失敗,需要進(jìn)行重試。N3o28資訊網(wǎng)——每日最新資訊28at.com

同步發(fā)送可以保證消息不丟失,但是會有性能問題,所以多數(shù)情況會選擇異步發(fā)送。異步發(fā)送如何保證消息不丟失呢?主流消息隊列(比如 Kafka 和 RocketMQ)實現(xiàn)方法基本類似,使用回調(diào)函數(shù)來實現(xiàn)。下面看一下 Kafka 的異步發(fā)送代碼:N3o28資訊網(wǎng)——每日最新資訊28at.com

producer.send(record, new Callback() { public void onCompletion(RecordMetadata metadata, Exception exception) { if (exception != null) {  logger.error("發(fā)送消息失敗:", exception); } if (metadata != null) {     logger.info("消息發(fā)送成功");  } }});

消息存儲

生產(chǎn)者發(fā)送消息成功,也不能保證消息絕對不丟失。因為即使消息發(fā)送到 Broker,如果在消費者拉取到消息之前,Broker 宕機了,消息還沒有落盤,也會導(dǎo)致消息丟失。N3o28資訊網(wǎng)——每日最新資訊28at.com

在存儲階段要保證消息不丟失,可以考慮幾個方面:N3o28資訊網(wǎng)——每日最新資訊28at.com

同步刷盤

采用異步刷盤,如果在消息落盤之前 Broker 宕機了,就會造成消息丟失。而采用同步刷盤,等待消息落盤之后,再給 Sender 返回發(fā)送成功,可以從消息發(fā)送環(huán)節(jié)保證消息不丟失。N3o28資訊網(wǎng)——每日最新資訊28at.com

N3o28資訊網(wǎng)——每日最新資訊28at.com

在 RocketMQ 中,把 flushDiskType 參數(shù)配置為 SYNC_FLUSH 就可以開啟同步刷盤。N3o28資訊網(wǎng)——每日最新資訊28at.com

Broker 集群

如果 Broker 集群中只有一個節(jié)點,即使消息落盤成功了,Broker 發(fā)送故障,在 Broker 恢復(fù)以前消費者也會拉取不到消息。而且如果 Broker 磁盤故障不可恢復(fù),消息也會丟失。N3o28資訊網(wǎng)——每日最新資訊28at.com

采用 Broker 集群可以很好地解決這個問題。見下圖:N3o28資訊網(wǎng)——每日最新資訊28at.com

N3o28資訊網(wǎng)——每日最新資訊28at.com

在 Broker 集群時,可以等待 2 個以上的節(jié)點同步消息完成后再給 Producer 返回成功。這樣即使一個 Broker 掛了,也可以很容易找到替代的 Broker。N3o28資訊網(wǎng)——每日最新資訊28at.com

消息消費

消費者保證不丟失消息,需要消費完成后再給 Broker 返回 ACK。在主流的消息隊列中,如果 Broker 收不到 ACK,都會給消費者再次發(fā)送這條消息。N3o28資訊網(wǎng)——每日最新資訊28at.com

有時候為了解決消息積壓的問題,消費者拉取到消息后會直接返回 ACK,然后再異步執(zhí)行消息處理邏輯。這樣要保證消息不丟失,需要在返回 ACK 之前把消息保存到本地,比如持久化到數(shù)據(jù)庫,后面可以取數(shù)據(jù)庫保存的消息進(jìn)行處理。N3o28資訊網(wǎng)——每日最新資訊28at.com

消息重復(fù)

消息重復(fù)一般有兩個原因,一個是生產(chǎn)者發(fā)送消息后沒有收到 ACK,然后進(jìn)行重復(fù)發(fā)送,另一個原因是消費者消費完成后 Broker 沒有收到 ACK,導(dǎo)致消息重復(fù)推送給消費者。N3o28資訊網(wǎng)——每日最新資訊28at.com

重復(fù)消息會對業(yè)務(wù)造成影響,比如電商場景中的重復(fù)支付、賬務(wù)場景中的重復(fù)記賬,對業(yè)務(wù)造成的影響都比較嚴(yán)重。N3o28資訊網(wǎng)——每日最新資訊28at.com

從目前主流的消息隊列來看,并沒有一個消息隊列能解決消息重復(fù)消費的問題,只能在消費端做冪等處理。下面提供幾個思路作為參考。N3o28資訊網(wǎng)——每日最新資訊28at.com

數(shù)據(jù)庫唯一鍵約束

如果消息會落本地數(shù)據(jù)庫,可以采用消息 ID 作為唯一鍵。如果消息不落數(shù)據(jù)庫,可以將消息 ID 或者消息中其他唯一能標(biāo)識消息的屬性作為唯一鍵落業(yè)務(wù)數(shù)據(jù)表。N3o28資訊網(wǎng)——每日最新資訊28at.com

保存消費記錄

我們也可以將消息 ID 保存 Redis,消費消息前判斷消息 ID 是否已存在。N3o28資訊網(wǎng)——每日最新資訊28at.com

ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();Boolean result = valueOperations.setIfAbsent(messageId, messageId);if (result) { //消費邏輯;} else { logger.error("這條消息已經(jīng)消費,跳過,消息ID:{}", messageId);}

這里有一個注意點,如果消費失敗了,需要刪除 Redis 中保存的消息 ID。N3o28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

消息不丟失、不重復(fù)是消息隊列的基本要求,但這個基本要求還是很難滿足的。N3o28資訊網(wǎng)——每日最新資訊28at.com

消息丟失這個要求,主流消息隊列通過消息重試和消息持久化的方式可以滿足。N3o28資訊網(wǎng)——每日最新資訊28at.com

但消息重試也同時帶來了消息重復(fù)的可能性,主流消息隊列在解決重復(fù)消息的問題上并沒有現(xiàn)成的方案,對不允許重復(fù)消費的場景,需要開發(fā)人員在消費端做冪等處理。N3o28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-62355-0.html阿里二面:要保證消息不丟失,又不重復(fù),消息隊列怎么選型?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 部署過Vue項目嗎?遇到404如何解決?

下一篇: Android開發(fā)之漸變色,你學(xué)會了嗎?

標(biāo)簽:
  • 熱門焦點
  • Mate60手機殼曝光 致敬自己的經(jīng)典設(shè)計

    8月3日消息,今天下午博主數(shù)碼閑聊站帶來了華為Mate60的第三方手機殼圖,可以讓我們在真機發(fā)布之前看看這款華為全新旗艦的大致輪廓。從曝光的圖片看,Mate 60背后攝像頭面積依然
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學(xué)習(xí)反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進(jìn)行反混淆,尤其是使用自定義混淆器對其進(jìn)行混淆時。什么是混
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進(jìn)行協(xié)調(diào)和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現(xiàn)手段有以下幾種方式:Object 類下
  • 分布式系統(tǒng)中的CAP理論,面試必問,你理解了嘛?

    對于剛剛接觸分布式系統(tǒng)的小伙伴們來說,一提起分布式系統(tǒng),就感覺高大上,深不可測。而且看了很多書和視頻還是一臉懵逼。這篇文章主要使用大白話的方式,帶你理解一下分布式系統(tǒng)
  • 2023年,我眼中的字節(jié)跳動

    此時此刻(2023年7月),字節(jié)跳動從未上市,也從未公布過任何官方的上市計劃;但是這并不妨礙它成為中國最受關(guān)注的互聯(lián)網(wǎng)公司之一。從2016-17年的抖音強勢崛起,到2018年的&ldquo;頭騰
  • iQOO Neo8 Pro真機諜照曝光:天璣9200+和V1+旗艦雙芯加持

    去年10月,iQOO推出了iQOO Neo7系列機型,不僅搭載了天璣9000+,而且是同價位唯一一款天璣9000+直屏旗艦,一經(jīng)上市便受到了用戶的廣泛關(guān)注。在時隔半年后,
  • 回歸OPPO兩年,一加贏了銷量,輸了品牌

    成為OPPO旗下主打性能的先鋒品牌后,一加屢創(chuàng)佳績。今年618期間,一加手機全渠道銷量同比增長362%,憑借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
  • 引領(lǐng)旗艦級影像能力向中端機普及 OPPO K11 系列發(fā)布 1799 元起

    7月25日,OPPO正式發(fā)布K系列新品—— OPPO K11 。此次 K11 在中端手機市場長期被忽視的影像板塊發(fā)力,突破性地搭載索尼 IMX890 旗艦大底主攝,支持 OIS
  • 最薄的14英寸游戲筆記本電腦 Alienware X14已可以購買

    2022年1月份在國際消費電子展(CES2022)上首次亮相的Alienware新品——Alienware X14現(xiàn)在已經(jīng)可以購買了,這款筆記本電腦被譽為世界上最薄的 14 英寸游戲筆
Top 主站蜘蛛池模板: 德清县| 大埔区| 太湖县| 临高县| 平远县| 云安县| 大竹县| 偃师市| 建宁县| 兴义市| 霍山县| 东方市| 阿瓦提县| 钟山县| 宣威市| 潍坊市| 米易县| 三原县| 石柱| 寻甸| 清水河县| 万载县| 新安县| 方正县| 双城市| 沙田区| 合作市| 芒康县| 平江县| 西丰县| 泗水县| 伊春市| 渝北区| 庆云县| 清涧县| 无极县| 清新县| 湟中县| 出国| 宿松县| 汕尾市|