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

JAVA面試題分享一百六十二:Kafka消息重復(fù)消費(fèi)問(wèn)題?

這篇具有很好參考價(jià)值的文章主要介紹了JAVA面試題分享一百六十二:Kafka消息重復(fù)消費(fèi)問(wèn)題?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、原因分析

消息重復(fù)消費(fèi)的根本原因都在于:已經(jīng)消費(fèi)了數(shù)據(jù),但是offset沒(méi)有成功提交。

其中很大一部分原因在于發(fā)生了再均衡。

1)消費(fèi)者宕機(jī)、重啟等。導(dǎo)致消息已經(jīng)消費(fèi)但是沒(méi)有提交offset。

2)消費(fèi)者使用自動(dòng)提交offset,但當(dāng)還沒(méi)有提交的時(shí)候,有新的消費(fèi)者加入或者移除,發(fā)生了rebalance(再平衡)。再次消費(fèi)的時(shí)候,消費(fèi)者會(huì)根據(jù)提交的偏移量來(lái),于是重復(fù)消費(fèi)了數(shù)據(jù)。

3)消息處理耗時(shí),或者消費(fèi)者拉取的消息量太多,處理耗時(shí),超過(guò)了max.poll.interval.ms的配置時(shí)間,導(dǎo)致認(rèn)為當(dāng)前消費(fèi)者已經(jīng)死掉,觸發(fā)再均衡。

4)? 每次拉取的消息記錄數(shù)max.poll.records為100,poll最大拉取間隔max.poll.interval.ms為 300s,消息處理過(guò)于耗時(shí)導(dǎo)致時(shí)長(zhǎng)大于了這個(gè)值,導(dǎo)致再均衡發(fā)生重復(fù)消費(fèi)

二、解決方案

由于網(wǎng)絡(luò)問(wèn)題,重復(fù)消費(fèi)不可避免,因此,消費(fèi)者需要實(shí)現(xiàn)消費(fèi)冪等。方案:

1、消息表

2、數(shù)據(jù)庫(kù)唯一索引

3、緩存消費(fèi)過(guò)的消息id

4、手動(dòng)提交office

5、減少每次拉取的消息記錄數(shù)和增大poll之間的時(shí)間間隔

6、拉取到消息之后異步處理(保證成功消費(fèi))

提高消費(fèi)者的處理速度。例如:對(duì)消息處理中比較耗時(shí)的步驟可通過(guò)異步的方式進(jìn)行處理、利用多線程處理等。在縮短單條消息消費(fèi)的同時(shí),根據(jù)實(shí)際場(chǎng)景可將max.poll.interval.ms值設(shè)置大一點(diǎn),避免不必要的Rebalance??筛鶕?jù)實(shí)際消息速率適當(dāng)調(diào)小max.poll.records的值。   

三、新版kafka的broker冪等性具體實(shí)現(xiàn)原理

kafka新版本已經(jīng)在broker中保證了接收消息的冪等性(比如2.4版本),只需在生產(chǎn)者加上參數(shù) props.put(“enable.idempotence”, true) 即可,默認(rèn)是false不開(kāi)啟。

kafka每次發(fā)送消息會(huì)生成PID和Sequence Number,并將這兩個(gè)屬性一起發(fā)送給broker,broker會(huì)將PID和Sequence Number跟消息綁定一起存起來(lái),下次如果生產(chǎn)者重發(fā)相同消息,broker會(huì)檢查PID和Sequence Number,如果相同不會(huì)再接收。

PID:每個(gè)新的 Producer 在初始化的時(shí)候會(huì)被分配一個(gè)唯一的 PID,這個(gè)PID對(duì)用戶完全是透明的。生產(chǎn)者如果重啟則會(huì)生成新的PID。

Sequence Number:對(duì)于每個(gè) PID,該 Producer 發(fā)送到每個(gè) Partition 的數(shù)據(jù)都有對(duì)應(yīng)的序列號(hào),這些序列號(hào)是從0開(kāi)始單調(diào)遞增的。

四、ACK可靠性保證

為保證producer發(fā)送的數(shù)據(jù),能可靠的發(fā)送到指定的topic,topic的每個(gè)partition收到producer發(fā)送的數(shù)據(jù)后,都需要向producer發(fā)送ack(acknowledgement確認(rèn)收到),如果producer收到ack,就會(huì)進(jìn)行下一輪的發(fā)送,否則重新發(fā)送數(shù)據(jù)。

1、ack應(yīng)答級(jí)別

對(duì)于某些不太重要的數(shù)據(jù),對(duì)數(shù)據(jù)的可靠性要求不是很高,能夠容忍數(shù)據(jù)的少量丟失,沒(méi)必要等ISR中的follower全部接收成功。所以Kafka為用戶提供了三種可靠性級(jí)別,用戶根據(jù)對(duì)可靠性和延遲的要求進(jìn)行權(quán)衡,選擇以下的配置。

acks參數(shù)配置

  • 0:這一操作提供了一個(gè)最低的延遲,partition的leader接收到消息還沒(méi)有寫入磁盤就已經(jīng)返回ack,當(dāng)leader故障時(shí)有可能丟失數(shù)據(jù);
  • 1: partition的leader落盤成功后返回ack,如果在follower同步成功之前l(fā)eader故障,那么將會(huì)丟失數(shù)據(jù);
  • -1(all): partition的leader和follower全部落盤成功后才返回ack。但是如果在follower同步完成后,broker發(fā)送ack之前,leader發(fā)生故障,那么會(huì)造成數(shù)據(jù)重復(fù)。

2、常見(jiàn)配置

  • fetch.min.byte:配置Consumer一次拉取請(qǐng)求中能從Kafka中拉取的最小數(shù)據(jù)量,默認(rèn)為1B,如果小于這個(gè)參數(shù)配置的值,就需要進(jìn)行等待,直到數(shù)據(jù)量滿足這個(gè)參數(shù)的配置大小。調(diào)大可以提交吞吐量,但也會(huì)造成延遲
  • fetch.max.bytes,一次拉取數(shù)據(jù)的最大數(shù)據(jù)量,默認(rèn)為52428800B,也就是50M,但是如果設(shè)置的值過(guò)小,甚至小于每條消息的值,實(shí)際上也是能消費(fèi)成功的
  • fetch.wait.max.ms,若是不滿足fetch.min.bytes時(shí),等待消費(fèi)端請(qǐng)求的最長(zhǎng)等待時(shí)間,默認(rèn)是500ms
  • max.poll.records,單次poll調(diào)用返回的最大消息記錄數(shù),如果處理邏輯很輕量,可以適當(dāng)提高該值。一次從kafka中poll出來(lái)的數(shù)據(jù)條數(shù),max.poll.records條數(shù)據(jù)需要在在session.timeout.ms這個(gè)時(shí)間內(nèi)處理完,默認(rèn)值為500
  • consumer.poll(100)?,100 毫秒是一個(gè)超時(shí)時(shí)間,一旦拿到足夠多的數(shù)據(jù)(fetch.min.bytes 參數(shù)設(shè)置),consumer.poll(100)會(huì)立即返回 ConsumerRecords<String, String> records。如果沒(méi)有拿到足夠多的數(shù)據(jù),會(huì)阻塞100ms,但不會(huì)超過(guò)100ms就會(huì)返回
  • max.poll.interval.ms,兩次拉取消息的間隔,默認(rèn)5分鐘;通過(guò)消費(fèi)組管理消費(fèi)者時(shí),該配置指定拉取消息線程最長(zhǎng)空閑時(shí)間,若超過(guò)這個(gè)時(shí)間間隔沒(méi)有發(fā)起poll操作,則消費(fèi)組認(rèn)為該消費(fèi)者已離開(kāi)了消費(fèi)組,將進(jìn)行再均衡操作(將分區(qū)分配給組內(nèi)其他消費(fèi)者成員)

若超過(guò)這個(gè)時(shí)間則報(bào)如下異常:

org.apache.kafka.clients.consumer.CommitFailedException: Commit cannot be completed since the group has already
 rebalanced and assigned the partitions to another member. This means that the time between subsequent calls 
to poll() was longer than the configured max.poll.interval.ms, which typically implies that the poll loop is 
spending too much time message processing. You can address this either by increasing the session timeout or by
 reducing the maximum size of batches returned in poll() with max.poll.records. 

即:無(wú)法完成提交,因?yàn)榻M已經(jīng)重新平衡并將分區(qū)分配給另一個(gè)成員。這意味著對(duì)poll()的后續(xù)調(diào)用之間的時(shí)間比配置的max.poll.interval.ms長(zhǎng),這通常意味著poll循環(huán)花費(fèi)了太多的時(shí)間來(lái)處理消息。

可以通過(guò)增加max.poll.interval.ms來(lái)解決這個(gè)問(wèn)題,也可以通過(guò)減少在poll()中使用max.poll.records返回的批的最大大小來(lái)解決這個(gè)問(wèn)題

max.partition.fetch.bytes:該屬性指定了服務(wù)器從每個(gè)分區(qū)返回給消費(fèi)者的最大字節(jié)數(shù),默認(rèn)為 1MB。

session.timeout.ms:消費(fèi)者在被認(rèn)為死亡之前可以與服務(wù)器斷開(kāi)連接的時(shí)間,默認(rèn)是 3s,將觸發(fā)再均衡操作,對(duì)于每一個(gè)Consumer Group,Kafka集群為其從Broker集群中選擇一個(gè)Broker作為其Coordinator。Coordinator主要做兩件事:

  1. 維持Group成員的組成。這包括加入新的成員,檢測(cè)成員的存活性,清除不再存活的成員。

  2. 協(xié)調(diào)Group成員的行為。

3、poll機(jī)制

①:每次poll的消息處理完成之后再進(jìn)行下一次poll,是同步操作

②:每次poll之前檢查是否可以進(jìn)行位移提交,如果可以,那么就會(huì)提交上一次輪詢的位移

③:每次poll時(shí),consumer都將嘗試使用上次消費(fèi)的offset作為起始o(jì)ffset,然后依次拉取消息

④:poll(long timeout),timeout指等待輪詢緩沖區(qū)的數(shù)據(jù)所花費(fèi)的時(shí)間,單位是毫秒文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-772596.html

到了這里,關(guān)于JAVA面試題分享一百六十二:Kafka消息重復(fù)消費(fèi)問(wèn)題?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 每天一個(gè)數(shù)據(jù)分析題(一百六十)

    以下關(guān)于代碼片段(使用sklearn)的使用和PCA(主成分分析)的描述中,哪項(xiàng)是正確的? A. preprocessing.scale(data)用于對(duì)數(shù)據(jù)進(jìn)行歸一化處理,確保PCA分析前各特征處于同一量級(jí)。 B. PCA(n_components=9)將數(shù)據(jù)降維了9個(gè)主成分。 C. pca.explained_variance_輸出的是降維后各主成分的方差。

    2024年02月20日
    瀏覽(23)
  • 第一百六十四回 如何實(shí)現(xiàn)NumberPicker

    第一百六十四回 如何實(shí)現(xiàn)NumberPicker

    我們?cè)谏弦徽禄刂薪榻B了\\\"如何在任意位置顯示PopupMenu\\\"相關(guān)的內(nèi)容,本章回中將介紹 如何實(shí)現(xiàn)NumberPicker .閑話休提,讓我們一起Talk Flutter吧。 我們?cè)诒菊禄刂薪榻B的 NumberPicker 主要用來(lái)實(shí)現(xiàn)數(shù)字選擇功能,比如選擇年月日,當(dāng)然也可以使用 YearPicker 實(shí)現(xiàn),不過(guò)YearPicer是把年月

    2024年02月07日
    瀏覽(27)
  • 每天一個(gè)數(shù)據(jù)分析題(一百六十四)

    關(guān)于OLAP系統(tǒng),下列選項(xiàng)不正確的是() A. 是基于數(shù)據(jù)倉(cāng)庫(kù)的信息進(jìn)行分析處理過(guò)程 B. 用戶數(shù)量相對(duì)較少,其用戶主要是業(yè)務(wù)決策人員與管理人員 C. 對(duì)響應(yīng)時(shí)間要求非常高。 D. 基礎(chǔ)數(shù)據(jù)來(lái)源于生產(chǎn)系統(tǒng)的操作數(shù)據(jù),也就是說(shuō),OLAP系統(tǒng)的數(shù)據(jù)來(lái)源與OLTP系統(tǒng)。 題目來(lái)源于CDA模

    2024年02月22日
    瀏覽(24)
  • PCL點(diǎn)云處理之多種體素濾波方法大匯總(一百六十四)

    對(duì)PCL中的基于八叉樹(shù)體素濾波方法,以及在此基礎(chǔ)上,自己進(jìn)一步實(shí)現(xiàn)的新濾波方法,進(jìn)行一個(gè)匯總,列出各自的效果和,具體的實(shí)現(xiàn)代碼 PCL中自帶的濾波方法,也是最常用的濾波方法,應(yīng)該是體素中的點(diǎn)云重心取代原始點(diǎn),但使用時(shí)要注意體素不可過(guò)小,

    2024年02月05日
    瀏覽(85)
  • 一百六十九、Hadoop——Hadoop退出NameNode安全模式與查看磁盤空間詳情(踩坑,附截圖)

    一百六十九、Hadoop——Hadoop退出NameNode安全模式與查看磁盤空間詳情(踩坑,附截圖)

    在海豚跑定時(shí)跑kettle的從Kafka到HDFS的任務(wù)時(shí),由于Linux服務(wù)器的某個(gè)文件磁盤空間滿了,導(dǎo)致Hadoop的NodeName進(jìn)入安全模式,此時(shí)光執(zhí)行 hdfs dfsadmin -safemode leave命令語(yǔ)句沒(méi)有效果( 雖然顯示Safe mode is OFF,但沒(méi)效果,一旦執(zhí)行還是報(bào)錯(cuò) ) Caused by: org.apache.hadoop.ipc.RemoteException(org

    2024年02月10日
    瀏覽(21)
  • 一百六十、Kettle——Linux上安裝的Kettle9.2.0連接Hive3.1.2

    一百六十、Kettle——Linux上安裝的Kettle9.2.0連接Hive3.1.2

    Kettle9.2.0在Linux上安裝好后,需要與Hive3.1.2數(shù)據(jù)庫(kù)建立連接 之前已經(jīng)在本地上用kettle9.2.0連上Hive3.1.2 kettle9.2.0安裝包網(wǎng)盤鏈接 鏈接:https://pan.baidu.com/s/15Zq9wNDwyMnc3qFVxYOMXw?pwd=zwae? 提取碼:zwae 1、Hive312的lib里面MySQL驅(qū)動(dòng)包的版本是mysql-connector-java-5.1.37.jar 2、Kettle9.2里MySQL驅(qū)動(dòng)包的

    2024年02月12日
    瀏覽(25)
  • 一百六十五、Kettle——用海豚調(diào)度器調(diào)度Linux資源庫(kù)中的kettle任務(wù)腳本(親測(cè)、附流程截圖)

    一百六十五、Kettle——用海豚調(diào)度器調(diào)度Linux資源庫(kù)中的kettle任務(wù)腳本(親測(cè)、附流程截圖)

    在Linux上腳本運(yùn)行kettle的轉(zhuǎn)換任務(wù)、無(wú)論是Linux本地還是Linux資源庫(kù)都成功后,接下來(lái)就是用海豚調(diào)度Linux上kettle任務(wù) 尤其是團(tuán)隊(duì)開(kāi)發(fā)中,基本都要使用共享資源庫(kù),所以我直接使用海豚調(diào)度Linux資源庫(kù)的kettle任務(wù)腳本 1、先開(kāi)啟zookeeper服務(wù) 2、再開(kāi)啟海豚調(diào)度器服務(wù) 3、開(kāi)啟服

    2024年02月11日
    瀏覽(54)
  • 第二百六十四回

    我們?cè)谏弦徽禄刂薪榻B了SliverPadding組件相關(guān)的內(nèi)容,本章回中將介紹Sliver綜合示例.閑話休提,讓我們一起Talk Flutter吧。 我們?cè)谇懊娴恼禄刂薪榻B了各種Sliver相關(guān)的組件:SliverList,SliverGrid,SliverAppBar和SliverPadding,本章回將綜合使用它們。下面是示例程序的 運(yùn)行效果圖。不過(guò)

    2024年01月18日
    瀏覽(19)
  • 第二百六十九回

    第二百六十九回

    我們?cè)谏弦徽禄刂薪榻B了Card Widget相關(guān)的內(nèi)容,本章回中將介紹國(guó)際化設(shè)置.閑話休提,讓我們一起Talk Flutter吧。 我們?cè)谶@里說(shuō)的國(guó)際化設(shè)置是指在App設(shè)置相關(guān)操作,這樣可以讓不同國(guó)家的用戶使用App時(shí)呈現(xiàn)不同的語(yǔ)言??傊?,就是通過(guò)相關(guān)的操作,讓App支持多個(gè)國(guó)家的語(yǔ)言。

    2024年01月18日
    瀏覽(22)
  • 冥想第九百六十二天

    1.周二,太忙了,來(lái)補(bǔ)日記,被客戶批了,因?yàn)橐粋€(gè)case沒(méi)有測(cè)到,不過(guò)度譴責(zé)自己,提高就好。 2.下班跑了6公里很舒服。毫無(wú)壓力。心率平穩(wěn)并且低。 3.感謝父母,感謝朋友,感謝家人,感謝不斷進(jìn)步的自己。

    2024年02月06日
    瀏覽(18)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包