国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一文讀懂kafka消息丟失問題和解決方案

這篇具有很好參考價(jià)值的文章主要介紹了一文讀懂kafka消息丟失問題和解決方案。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

今天分享一下kafka的消息丟失問題,kafka的消息丟失是一個(gè)很值得關(guān)注的問題,根據(jù)消息的重要性,消息丟失的嚴(yán)重性也會(huì)進(jìn)行放大,如何從最大程度上保證消息不丟失,要從生產(chǎn)者,消費(fèi)者,broker幾個(gè)端來說。

消息發(fā)送和接收流程

kafka生產(chǎn)者生產(chǎn)好消息后,會(huì)將消息發(fā)送到broker節(jié)點(diǎn),broker對數(shù)據(jù)進(jìn)行存儲(chǔ),kafka的消息是順序存儲(chǔ)在磁盤上,以主題(topic),分區(qū)(partition)的邏輯進(jìn)行劃分,消息最終存儲(chǔ)在日志文件中,消費(fèi)者會(huì)循環(huán)從broker拉取消息。

一文讀懂kafka消息丟失問題和解決方案

那么從上圖的圖中可以看出kafka丟消息可能存在的三個(gè)地方分別為:

  • 生產(chǎn)者到broker
  • broker到磁盤
  • 消費(fèi)者

生產(chǎn)者到broker消息丟失

生產(chǎn)者發(fā)送消息到broker是會(huì)存在消息丟失的,大多可能是由于網(wǎng)絡(luò)原因引起的,消息中間件中一般都是通過ack來解決這個(gè)問題的,kafka中可以通過設(shè)置ack來解決這個(gè)問題。

acks有三種類型:

  • 0
  • 1
  • -1(all)

acks為0

acks設(shè)置為0,代表生產(chǎn)者發(fā)送消息后就不管不顧了,不用等待broker的任何響應(yīng),那么可能網(wǎng)絡(luò)異常或者其他原因?qū)е耣roker沒有處理到到這條消息,那么消息就丟失了。

一文讀懂kafka消息丟失問題和解決方案

acks為1

acks設(shè)置為1,代表生產(chǎn)者發(fā)送消息到broker后,只需要broker的leader副本確認(rèn)收到后就成功響應(yīng),不需要follower副本響應(yīng),就算follower副本崩潰了,也會(huì)成功響應(yīng)。

一文讀懂kafka消息丟失問題和解決方案

acks為-1(all)

acks設(shè)置為-1,或者為all,那么生產(chǎn)者發(fā)送消息需要leader和follower都收到并寫入消息才成功響應(yīng)生產(chǎn)者,也就是ISR集合要全部寫入,當(dāng)ISR集合中只要有一個(gè)沒有寫入成功,那么就收到失敗響應(yīng),所以acks=-1能夠在最大程度上保證消息的不丟失,但是也是有條件的,需要ISR集合中有兩個(gè)以上副本才能保證,如果只有一個(gè)副本,那么就是就只有一個(gè)leader,沒有follower,如果leader掛掉,就不能選舉出一個(gè)eader,消息自然也就丟失,這和acks=1是一樣的。

一文讀懂kafka消息丟失問題和解決方案

解決消息丟失

從上面三種類型的acks中我們可以看出,acks=-1是保證消息從生產(chǎn)者到broker不丟失的最佳設(shè)置方式,不過我們也能想到,它需要ISR每個(gè)副本都成功應(yīng)答,所以它的效率自然沒有前面兩個(gè)高,不過此篇我們討論的是保證消息不丟失問題,所以一切從不丟失層面區(qū)說。

如果消息發(fā)送失敗,那么生產(chǎn)者可以重試發(fā)送消息,可以手動(dòng)在代碼中編寫消息重發(fā)邏輯,也可以配置重試參數(shù)。

  • retries
  • retry.backoff.ms

retries表示重試次數(shù),retry.backoff.ms表示重試時(shí)間間隔,比如第一次重試依舊沒成功,那么隔多久再進(jìn)行重試,kafka重試的底層邏輯是將沒發(fā)送成功的消息重新入隊(duì),因?yàn)閗afka的生產(chǎn)者生產(chǎn)消息后,消息并非就直接發(fā)送到broker,而是保存在生產(chǎn)者端的收集器(RecordAccumulator),然后由Sender線程去獲取RecordAccumulator中的消息,然后再發(fā)送給broker,當(dāng)消息發(fā)送失敗后,會(huì)將消息重新放入RecordAccumulator中,具體邏輯可以看kafka的生產(chǎn)者端Sender的源碼。

一文讀懂kafka消息丟失問題和解決方案

消息重發(fā)引起的消息順序性問題

要注意,消息發(fā)送失敗進(jìn)行重發(fā)不能保證消息發(fā)送的順序性,這里的順序性是單分區(qū)順序性,如果服務(wù)對于消息的順序性有嚴(yán)格的要求,那么我們可以通過設(shè)置屬性max.in.flight.requests.per.connection=1來保證消息的順序性,這個(gè)配置對應(yīng)的是kafka中InFlightRequests,max.in.flight.requests.per.connection代表請求的個(gè)數(shù),kafka在創(chuàng)建Sender的時(shí)候會(huì)判斷,如果maxInflightRequests為1,那么guaranteeMessageOrder就為true,就能保證消息的順序性。

一文讀懂kafka消息丟失問題和解決方案

broker到磁盤丟消息

broker收到消息后,需要將消息寫入磁盤的log文件中,但是并不是馬上寫,因?yàn)槲覀冎?,生產(chǎn)者發(fā)送消息后,消費(fèi)者那邊需要馬上獲取,如果broker要寫入磁盤,那么消費(fèi)者拉取消息,broker還要從log文件中獲取消息,這顯然是不合理的,所以kafka引入了(page cache)頁緩存。

page cache是磁盤和broker之間的消息映射關(guān)系,它是基于內(nèi)存的,當(dāng)broker收到消息后,會(huì)將消息寫入page cache,然后由操作系統(tǒng)進(jìn)行刷盤,將page cache中的數(shù)據(jù)寫入磁盤。

如果broker發(fā)生故障,那么此時(shí)page cache的數(shù)據(jù)就會(huì)丟失,broker端可以設(shè)置刷盤的參數(shù),比如多久刷盤一次,不過這個(gè)參數(shù)不建議去修改,最好的方案還是設(shè)置多副本,一個(gè)分區(qū)設(shè)置幾個(gè)副本,當(dāng)broker故障的時(shí)候,如果還有其他副本,那么數(shù)據(jù)就不會(huì)丟失。

消費(fèi)者丟消息

kafka的消費(fèi)模式是拉模式,需要不斷地向broker拉取消息,拉取的消息消費(fèi)了以后需要提交offset,也就是提交offset這里可能會(huì)出現(xiàn)丟消息,kafka中提供了和offset相關(guān)的幾個(gè)配置項(xiàng)。

  • enable.auto.commit
  • auto.commit.interval.ms
  • auto.offset.reset

下面我們先了解一下kafka offset的提交和參數(shù)詳解。

enable.auto.commit代表是否自動(dòng)提交offset,默認(rèn)為true,auto.commit.interval.ms代表多久提交一次offset,默認(rèn)為5秒。

如下圖,當(dāng)前消費(fèi)者消費(fèi)到了分區(qū)中為3的消息。

一文讀懂kafka消息丟失問題和解決方案

那么下次當(dāng)消費(fèi)者讀取消息的時(shí)候是從哪里讀取呢,當(dāng)然從4開始讀取,因?yàn)槭菑纳洗巫x取的offset的下一位開始讀取,所以我們就說當(dāng)前消費(fèi)組的offset為4,,因?yàn)橄麓问菑?開始消費(fèi),如果5秒之內(nèi)又消費(fèi)了兩條消息然后自動(dòng)提交了offset,那么此時(shí)的offset如下:

一文讀懂kafka消息丟失問題和解決方案

enable.auto.commit如果為false,就代表不會(huì)自動(dòng)提交offset。

auto.offset.reset=latest代表從分區(qū)中最新的offset處開始讀取消息,比如某個(gè)消費(fèi)者組上次提交的偏移量為5,然后后面又生產(chǎn)了2條消息,再次讀取消息時(shí),讀取到的是6,7,8這個(gè)三個(gè)消息,如果enable.auto.commit設(shè)置為false,那么不管往分區(qū)中寫入多少消息,都是從6開始讀取消息。

一文讀懂kafka消息丟失問題和解決方案

此時(shí)如果一個(gè)新的的消費(fèi)組訂閱了這個(gè)分區(qū),因?yàn)檫@個(gè)消費(fèi)者組沒有在這個(gè)分區(qū)提交過offset,所以它獲取消息并不是從6開始獲取,而是從1開始獲取。

一文讀懂kafka消息丟失問題和解決方案

所以可知每個(gè)消費(fèi)者組在分區(qū)中的offset是獨(dú)立的。

auto.offset.reset還可以設(shè)置為earliestnone,使用earliest,如果此消費(fèi)組從來沒有提交過offset,那么就從頭開始消費(fèi),如果提交過offset,那么就從最新的offset處消費(fèi),就和latest一樣了,使用none,如果消費(fèi)組沒有提交過offset,在分區(qū)中找不到任何offset,那么就會(huì)拋出異常。

org.apache.kafka.clients.consumer.NoOffsetForPartitionException: Undefined offset with no reset policy for partitions: [stock1-0]
復(fù)制代碼

上面我們初步了解了offset的一些知識,對offset的提交和和讀取有一些了解,因?yàn)樯厦嫖覀冎惶峒皁ffset的自動(dòng)提交,而自動(dòng)提交的主動(dòng)權(quán)在kafka,而不在我們,所以可能因?yàn)橐恍┰蚨鴮?dǎo)致消息丟失。

消息處理異常

當(dāng)我們收到消息后對消息進(jìn)行處理,如果在處理的過程中發(fā)生異常,而又設(shè)置為自動(dòng)提交offset,那么消息沒有處理成功,offset已經(jīng)提交了,當(dāng)下次獲取消息的時(shí)候,由于已經(jīng)提交過ofset,所以之前的消息就獲取不到了,所以應(yīng)該改為手動(dòng)提交offset,當(dāng)消息處理成功后,再進(jìn)行手動(dòng)提交offset。

總結(jié)

關(guān)于kafka的消息丟失問題和解決方案就說到這里,我們分別從生產(chǎn)者到broker,broker到磁盤以及消費(fèi)者端進(jìn)行說明,也引申出一些知識點(diǎn),可能平時(shí)沒有遇到消息丟失的情況,那是因?yàn)榫W(wǎng)絡(luò)比較可靠,數(shù)據(jù)量可能不大,但是如果要真的實(shí)現(xiàn)高可用,高可靠,那么就需要對其進(jìn)行設(shè)計(jì)。文章來源地址http://www.zghlxwxcb.cn/news/detail-474714.html

到了這里,關(guān)于一文讀懂kafka消息丟失問題和解決方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 一文讀懂kafka消息拉取機(jī)制|線程拉取模型

    一文讀懂kafka消息拉取機(jī)制|線程拉取模型

    如果客戶端與待拉取消息的broker節(jié)點(diǎn)有待發(fā)送的網(wǎng)絡(luò)請求 (見代碼@4),則本次拉取任務(wù)將 不會(huì)再發(fā)起新的拉取請求 ,待已有的請求處理完畢后才會(huì)拉取新的消息。 拉取消息時(shí)需要指定拉取消息偏移量,來自隊(duì)列負(fù)載算法時(shí)指定,主要消費(fèi)組的最新消費(fèi)位點(diǎn)。 Step2:按Node依次構(gòu)

    2024年04月25日
    瀏覽(21)
  • 一文徹底搞懂Kafka如何保證消息不丟失

    一文徹底搞懂Kafka如何保證消息不丟失

    Producer:生產(chǎn)者,發(fā)送消息的一方。生產(chǎn)者負(fù)責(zé)創(chuàng)建消息,然后將其發(fā)送到 Kafka。 Consumer:消費(fèi)者,接受消息的一方。消費(fèi)者連接到 Kafka 上并接收消息,進(jìn)而進(jìn)行相應(yīng)的業(yè)務(wù)邏輯處理。 Consumer Group:將多個(gè)消費(fèi)者組成一個(gè)消費(fèi)者組,一個(gè)消費(fèi)者組可以包含一個(gè)或多個(gè)消費(fèi)者。

    2024年04月22日
    瀏覽(30)
  • RabbitMQ消息丟失的場景,MQ消息丟失解決方案

    RabbitMQ消息丟失的場景,MQ消息丟失解決方案

    第一種 : (生產(chǎn)者) 生產(chǎn)者弄丟了數(shù)據(jù)。生產(chǎn)者將數(shù)據(jù)發(fā)送到 RabbitMQ 的時(shí)候,可能數(shù)據(jù)就在半路給搞丟了,因?yàn)榫W(wǎng)絡(luò)問題啥的,都有可能。 第二種 : (服務(wù)端) RabbitMQ 弄丟了數(shù)據(jù)。MQ還沒有持久化自己掛了 第三種 : (消費(fèi)者) 消費(fèi)端弄丟了數(shù)據(jù)。剛消費(fèi)到,還沒處理

    2024年02月08日
    瀏覽(29)
  • kafka消息丟失面試題,RocketMQ消息丟失場景及解決辦法

    kafka消息丟失面試題,RocketMQ消息丟失場景及解決辦法

    互聯(lián)網(wǎng)行業(yè)更新?lián)Q代非???,行業(yè)常態(tài)便是不斷學(xué)習(xí),因此這些主流技術(shù)你一個(gè)都不能落下! ①并發(fā)編程 Java并發(fā)編程是整個(gè)Java開發(fā)體系中最難以理解,但也是最重要的知識點(diǎn)之一,因此學(xué)習(xí)起來比較費(fèi)勁,從而導(dǎo)致很多人望而卻步,但是無論是職場面試還是高并發(fā)高流量的

    2024年03月17日
    瀏覽(25)
  • RabbitMq消息丟失原因及其解決方案

    RabbitMq消息丟失原因及其解決方案

    我們首先了解下一條消息從生產(chǎn)到消費(fèi)的整個(gè)流程如下: 生產(chǎn)--MQ Broker -- 消費(fèi)。所以這三個(gè)環(huán)節(jié)都有丟失消息的可能。 1.1、生產(chǎn)者丟失消息 生產(chǎn)者將數(shù)據(jù)發(fā)送到rabbitmq的時(shí)候,可能因?yàn)榫W(wǎng)絡(luò)問題導(dǎo)致數(shù)據(jù)就在半路給搞丟了。 1.使用事務(wù)(性能差) ? RabbitMQ 客戶端中與事務(wù)機(jī)

    2024年02月08日
    瀏覽(22)
  • MQ消息丟失的可能原因與解決方案

    當(dāng)我們使用消息隊(duì)列(MQ)作為分布式系統(tǒng)中的核心組件時(shí),消息丟失是一個(gè)常見的問題。消息丟失可能導(dǎo)致數(shù)據(jù)不一致或功能故障,因此對于許多應(yīng)用程序來說是不可接受的。本文將介紹幾種常見的MQ消息丟失的原因,并提供相應(yīng)的解決方案。 生產(chǎn)者在發(fā)送消息時(shí)可能會(huì)遇

    2024年02月15日
    瀏覽(28)
  • Kafka數(shù)據(jù)丟失原因及解決方案

    Kafka包括Producer、Broker、Consumer,因此從這三個(gè)方面分析。 丟失原因:Kafka在Producer端的消息發(fā)送采用的是異步發(fā)送的方式(還有同步發(fā)送,但是同步發(fā)送會(huì)導(dǎo)致消息阻塞、需要等待),丟失數(shù)據(jù)是因?yàn)橄]有到達(dá)Broker端,原因可能是網(wǎng)絡(luò)波動(dòng)導(dǎo)致沒有回調(diào)和數(shù)據(jù)消息太大超出

    2024年02月14日
    瀏覽(14)
  • 帶你了解RabbitMQ:消息丟失、重復(fù)、積壓的原因及其解決方案

    前言 首先說一點(diǎn),企業(yè)中最常用的實(shí)際上既不是RocketMQ,也不是Kafka,而是RabbitMQ。 RocketMQ很強(qiáng)大,但主要是阿里推廣自己的云產(chǎn)品而開源出來的一款消息隊(duì)列,其實(shí)中小企業(yè)用RocketMQ的沒有想象中那么多。 深層次的原因在于兔寶在中小企業(yè)普及更早,經(jīng)受的考驗(yàn)也更久,很容

    2024年02月04日
    瀏覽(21)
  • 一文讀懂RabbitMQ消息隊(duì)列

    一文讀懂RabbitMQ消息隊(duì)列

    在介紹消息隊(duì)列之前,應(yīng)該先了解什么是 AMQP(Advanced Message Queuing Protocol, 高級消息隊(duì)列協(xié)議,點(diǎn)擊查看) 消息(Message) 是指在應(yīng)用間 傳送的數(shù)據(jù) ,消息可以非常簡單,比如只包含文本字符串,也可以更復(fù)雜,可能包含嵌入對象;而 消息隊(duì)列(Message Queue) 是一種 應(yīng)用間 的

    2024年02月02日
    瀏覽(12)
  • Kafka消息阻塞:拯救面試的八大終極解決方案!

    Kafka消息阻塞:拯救面試的八大終極解決方案!

    大家好,我是小米,一個(gè)對技術(shù)充滿熱情的90后程序員。最近在準(zhǔn)備社招面試的過程中,遇到了一個(gè)超級有挑戰(zhàn)性的問題:“Kafka消息阻塞怎么解決?”今天,我就來和大家一起深入剖析這個(gè)問題,分享我在解決過程中的心得和經(jīng)驗(yàn)。 首先,我們得了解一下Kafka消息阻塞是什么

    2024年01月16日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包