最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

滴滴二面之Kafka如何讀寫副本消息的

 更新時間:2022年01月21日 11:27:17   作者:JavaEdge.  
這篇文章主要給大家介紹了關(guān)于滴滴二面之Kafka如何讀寫副本消息的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

前言

無論是讀取副本還是寫入副本,都是通過底層的Partition對象完成的,而這些分區(qū)對象全部保存在上節(jié)課所學(xué)的allPartitions字段中??梢哉f,理解這些字段的用途,是后續(xù)我們探索副本管理器類功能的重要前提。

現(xiàn)在,我們就來學(xué)習(xí)下副本讀寫功能。整個Kafka的同步機(jī)制,本質(zhì)上就是副本讀取+副本寫入,搞懂了這兩個功能,你就知道了Follower副本是如何同步Leader副本數(shù)據(jù)的。

appendRecords-副本寫入

向副本底層日志寫入消息的邏輯就實現(xiàn)在ReplicaManager#appendRecords。

Kafka需副本寫入的場景:

  1. 生產(chǎn)者向Leader副本寫入消息
  2. Follower副本拉取消息后寫入副本
    僅該場景調(diào)用Partition對象的方法,其余3個都是調(diào)用appendRecords完成
  3. 消費者組寫入組信息
  4. 事務(wù)管理器寫入事務(wù)信息(包括事務(wù)標(biāo)記、事務(wù)元數(shù)據(jù)等)

appendRecords方法將給定的一組分區(qū)的消息寫入對應(yīng)Leader副本,并根據(jù)PRODUCE請求中acks的設(shè)置,有選擇地等待其他副本寫入完成。然后,調(diào)用指定回調(diào)邏輯。

appendRecords向副本日志寫入消息的過程:

執(zhí)行流程

可見,appendRecords:

實現(xiàn)消息寫入的方法是appendToLocalLog

判斷是否需要等待其他副本寫入的方法delayedProduceRequestRequired

appendToLocalLog寫入副本本地日志

利用Partition#appendRecordsToLeader寫入消息集合,就是利用appendAsLeader方法寫入本地日志的。

delayedProduceRequestRequired

判斷消息集合被寫入到日志之后,是否需要等待其它副本也寫入成功:

private def delayedProduceRequestRequired(
  requiredAcks: Short,
  entriesPerPartition: Map[TopicPartition, MemoryRecords],
  localProduceResults: Map[TopicPartition, LogAppendResult]): Boolean = {
  requiredAcks == -1 && entriesPerPartition.nonEmpty && 
    localProduceResults.values.count(_.exception.isDefined) < entriesPerPartition.size
}

若等待其他副本的寫入,須同時滿足:

  • requiredAcks==-1
  • 依然有數(shù)據(jù)尚未寫完
  • 至少有一個分區(qū)的消息,已成功被寫入本地日志

2和3可結(jié)合來看。若所有分區(qū)的數(shù)據(jù)寫入都不成功,則可能出現(xiàn)嚴(yán)重錯誤,此時應(yīng)不再等待,而是直接返回錯誤給發(fā)送方。

而有部分分區(qū)成功寫入,部分分區(qū)寫入失敗,則可能偶發(fā)的瞬時錯誤導(dǎo)致。此時,不妨將本次寫入請求放入Purgatory,給個重試機(jī)會。

副本讀?。篺etchMessages

ReplicaManager#fetchMessages負(fù)責(zé)讀取副本數(shù)據(jù)。無論:

  • Java消費者
  • APIFollower副本

拉取消息的主途徑都是向Broker發(fā)FETCH請求,Broker端接收到該請求后,調(diào)用fetchMessages從底層的Leader副本取出消息。

fetchMessages也可能會延時處理FETCH請求,因Broker端必須要累積足夠多數(shù)據(jù)后,才會返回Response給請求發(fā)送方。

整個方法分為:

讀取本地日志

首先判斷,讀取消息的請求方,就能確定可讀取的范圍了。

fetchIsolation,讀取隔離級別:

  • 對Follower副本,它能讀取到Leader副本LEO值以下的所有消息
  • 普通Consumer,只能“看到”Leader副本高水位值以下的消息

確定可讀取范圍后,調(diào)用readFromLog讀取本地日志上的消息數(shù)據(jù),并將結(jié)果賦給logReadResults變量。readFromLog調(diào)用readFromLocalLog,在待讀取分區(qū)上依次調(diào)用其日志對象的read方法執(zhí)行實際的消息讀取。

根據(jù)讀取結(jié)果確定Response

根據(jù)上一步讀取結(jié)果創(chuàng)建對應(yīng)Response:

根據(jù)上一步得到的讀取結(jié)果,統(tǒng)計可讀取的總字節(jié)數(shù),然后判斷此時是否能夠立即返回Reponse。

副本管理器讀寫副本的兩個方法appendRecords和fetchMessages本質(zhì)上在底層分別調(diào)用Log的append和read方法,以實現(xiàn)本地日志的讀寫操作。完成讀寫操作后,這兩個方法還定義了延時處理的條件。一旦滿足延時處理條件,就交給對應(yīng)Purgatory處理。

從這倆方法可見單個組件融合一起的趨勢。雖然我們學(xué)習(xí)單個源碼文件的順序是自上而下,但串聯(lián)Kafka主要組件功能的路徑卻是自下而上。

如副本寫入操作,日志對象append方法被上一層的Partition對象中的方法調(diào)用,而后者又進(jìn)一步被副本管理器中的方法調(diào)用。我們按自上而下閱讀了副本管理器、日志對象等單個組件的代碼,了解了各自的獨立功能。

現(xiàn)在開始慢慢地把它們?nèi)诤弦黄穑瑯?gòu)建Kafka操作分區(qū)副本日志對象的完整調(diào)用路徑。同時采用這兩種方式來閱讀源碼,就能更高效弄懂Kafka原理。

總結(jié)

Kafka副本狀態(tài)機(jī)類ReplicaManager讀寫副本的核心方法:

  • appendRecords:向副本寫入消息,利用Log#append方法和Purgatory機(jī)制實現(xiàn)Follower副本向Leader副本獲取消息后的數(shù)據(jù)同步操作
  • fetchMessages:從副本讀取消息,為普通Consumer和Follower副本所使用。當(dāng)它們向Broker發(fā)送FETCH請求時,Broker上的副本管理器調(diào)用該方法從本地日志中獲取指定消息

到此這篇關(guān)于滴滴二面之Kafka如何讀寫副本消息的文章就介紹到這了,更多相關(guān)Kafka讀寫副本消息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • try-with-resource優(yōu)雅關(guān)閉io流的方法

    try-with-resource優(yōu)雅關(guān)閉io流的方法

    這篇文章主要給大家介紹了關(guān)于try-with-resource優(yōu)雅關(guān)閉io流的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • spark中使用groupByKey進(jìn)行分組排序的示例代碼

    spark中使用groupByKey進(jìn)行分組排序的示例代碼

    這篇文章主要介紹了spark中使用groupByKey進(jìn)行分組排序的實例代碼,本文通過實例代碼給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Java的MD5工具類和客戶端測試類

    Java的MD5工具類和客戶端測試類

    這篇文章主要介紹了Java的MD5工具類和客戶端測試類,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-12-12
  • SpringBoot使用easy-captcha 實現(xiàn)驗證碼登錄功能(解決思路)

    SpringBoot使用easy-captcha 實現(xiàn)驗證碼登錄功能(解決思路)

    文章介紹了如何使用Spring Boot和Easy-Captcha實現(xiàn)驗證碼登錄功能,后端通過Easy-Captcha生成驗證碼并存儲在Redis中,前端獲取驗證碼并顯示給用戶,登錄時,前端將用戶輸入的驗證碼和標(biāo)識符發(fā)送到后端進(jìn)行驗證,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • springboot tomcat的maxHttpFormPostSize參數(shù)示例解析

    springboot tomcat的maxHttpFormPostSize參數(shù)示例解析

    這篇文章主要介紹了springboot tomcat的maxHttpFormPostSize參數(shù)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Springboot集成OpenFeign Demo詳解

    Springboot集成OpenFeign Demo詳解

    這篇文章主要為大家詳細(xì)介紹了Springboot集成OpenFeign Demo以及參數(shù)的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • 初探Java內(nèi)部類的使用

    初探Java內(nèi)部類的使用

    Java內(nèi)部類一般可以分為以下三種:成員內(nèi)部類、靜態(tài)內(nèi)部類和匿名內(nèi)部類。這篇文章主要帶大家初探一下Java內(nèi)部類的使用,感興趣的可以了解一下
    2022-09-09
  • JAVA學(xué)習(xí)進(jìn)階篇之時間與日期相關(guān)類

    JAVA學(xué)習(xí)進(jìn)階篇之時間與日期相關(guān)類

    在日常的開發(fā)工作當(dāng)中,我們經(jīng)常需要用到日期相關(guān)的類,下面這篇文章主要給大家介紹了關(guān)于JAVA學(xué)習(xí)進(jìn)階篇之時間與日期相關(guān)類的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • IDEA連接Mysql數(shù)據(jù)庫的詳細(xì)圖文教程

    IDEA連接Mysql數(shù)據(jù)庫的詳細(xì)圖文教程

    項目開發(fā)時使用Intellij IDEA連接本地數(shù)據(jù)庫,將數(shù)據(jù)庫可視化,還可對數(shù)據(jù)庫表直接進(jìn)行增刪改查操作,方便快捷又清晰,下面這篇文章主要給大家介紹了關(guān)于IDEA連接Mysql數(shù)據(jù)庫的詳細(xì)圖文教程,需要的朋友可以參考下
    2023-03-03
  • SpringBoot異步實現(xiàn) 的8種方式

    SpringBoot異步實現(xiàn) 的8種方式

    在同步操作中,執(zhí)行到?發(fā)送短信?的時候,我們必須等待這個方法徹底執(zhí)行完才能執(zhí)行?贈送積分?這個操作,如果?贈送積分?這個動作執(zhí)行時間較長,發(fā)送短信需要等待,這就是典型的同步場景,這篇文章主要介紹了SpringBoot異步實現(xiàn) 的8種方式,需要的朋友可以參考下
    2023-11-11

最新評論

措勤县| 清镇市| 昌平区| 宝山区| 邯郸县| 西宁市| 丹东市| 吴堡县| 奉化市| 玉山县| 石台县| 册亨县| 襄城县| 彭阳县| 汤原县| 治县。| 灵武市| 仁化县| 上栗县| 望都县| 乐清市| 永善县| 上蔡县| 缙云县| 嵊州市| 洛川县| 宜章县| 西吉县| 徐州市| 拜城县| 枣阳市| 安顺市| 顺义区| 虎林市| 福建省| 南皮县| 礼泉县| 视频| 山阳县| 绥德县| 杂多县|