精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Kafka中改進的二分查找算法

系統 算法 Kafka
最近有學習些Kafak的源碼,想給大家分享下Kafak中改進的二分查找算法。二分查找,是每個程序員都應掌握的基礎算法,而Kafka是如何改進二分查找來應用于自己的場景中,這很值得我們了解學習。

[[356205]]

最近有學習些Kafak的源碼,想給大家分享下Kafak中改進的二分查找算法。二分查找,是每個程序員都應掌握的基礎算法,而Kafka是如何改進二分查找來應用于自己的場景中,這很值得我們了解學習。

由于Kafak把二分查找應用于索引查找的場景中,所以本文會先對Kafka的日志結構和索引進行簡單的介紹。在Kafak中,消息以日志的形式保存,每個日志其實就是一個文件夾,且存有多個日志段,一個日志段指的是文件名(起始偏移)相同的消息日志文件和4個索引文件,如下圖所示。

在消息日志文件中以追加的方式存儲著消息,每條消息都有著唯一的偏移量。在查找消息時,會借助索引文件進行查找。如果根據偏移量來查詢,則會借助位移索引文件來定位消息的位置。為了便于討論索引查詢,下文都將基于位移索引這一背景。位移索引的本質是一個字節數組,其中存儲著偏移量和相應的磁盤物理位置,這里偏移量和磁盤物理位置都固定用4個字節,可以看做是每8個字節一個key-value對,如下圖:

索引的結構已經清楚了,下面就能正式進入本文的主題“二分查找”。給定索引項的數組和target偏移量,可寫出如下代碼:

  1. private def indexSlotRangeFor(idx: ByteBuffer, target: Long, searchEntity: IndexSearchEntity): (IntInt) = { 
  2.   // _entries表示索引項的數量 
  3.   // 1. 如果當前索引為空,直接返回(-1,-1)表示沒找到 
  4.   if (_entries == 0) 
  5.     return (-1, -1) 
  6.  
  7.   // 2. 確保查找的偏移量不小于當前最小偏移量 
  8.   if (compareIndexEntry(parseEntry(idx, 0), target, searchEntity) > 0) 
  9.     return (-1, 0) 
  10.    
  11.   // 3. 執行二分查找算法,找出target 
  12.   var lo = 0 
  13.   var hi = _entries - 1 
  14.   while (lo < hi) { 
  15.     val mid = ceil(hi / 2.0 + lo / 2.0).toInt 
  16.     val found = parseEntry(idx, mid) 
  17.     val compareResult = compareIndexEntry(found, target, searchEntity) 
  18.     if (compareResult > 0) 
  19.       hi = mid - 1 
  20.     else if (compareResult < 0) 
  21.       lo = mid 
  22.     else 
  23.       return (mid, mid) 
  24.   } 
  25.    
  26.   (lo, if (lo == _entries - 1) -1 else lo + 1) 

上述代碼使用了普通的二分查找,下面我們看下這樣會存在什么問題。雖然每個索引項的大小是4B,但操作系統訪問內存時的最小單元是頁,一般是4KB,即4096B,會包含了512個索引項。而找出在索引中的指定偏移量,對于操作系統訪問內存時則變成了找出指定偏移量所在的頁。假設索引的大小有13個頁,如下圖所示:

由于Kafka讀取消息,一般都是讀取最新的偏移量,所以要查詢的頁就集中在尾部,即第12號頁上。下面我們結合上述的代碼,看下查詢最新偏移量,會訪問哪些頁。根據二分查找,將依次訪問6、9、11、12號頁。

當隨著Kafka接收消息的增加,索引文件也會增加至第13號頁,這時根據二分查找,將依次訪問7、10、12、13號頁。

可以看出訪問的頁和上一次的頁完全不同。之前在只有12號頁的時候,Kafak讀取索引時會頻繁訪問6、9、11、12號頁,而由于Kafka使用了mmap來提高速度,即讀寫操作都將通過操作系統的page cache,所以6、9、11、12號頁會被緩存到page cache中,避免磁盤加載。但是當增至13號頁時,則需要訪問7、10、12、13號頁,而由于7、10號頁長時間沒有被訪問(現代操作系統都是使用LRU或其變體來管理page cache),很可能已經不在page cache中了,那么就會造成缺頁中斷(線程被阻塞等待從磁盤加載沒有被緩存到page cache的數據)。在Kafka的官方測試中,這種情況會造成幾毫秒至1秒的延遲。

鑒于以上情況,Kafka對二分查找進行了改進。既然一般讀取數據集中在索引的尾部。那么將索引中最后的8192B(8KB)劃分為“熱區”,其余部分劃分為“冷區”,分別進行二分查找。代碼實現如下:

  1. private def indexSlotRangeFor(idx: ByteBuffer, target: Long, searchEntity: IndexSearchType): (IntInt) = { 
  2.   // 1. 如果當前索引為空,直接返回(-1,-1)表示沒找到 
  3.   if(_entries == 0) 
  4.     return (-1, -1) 
  5.  
  6.  // 二分查找封裝成方法 
  7.   def binarySearch(beginIntendInt) : (IntInt) = { 
  8.     var lo = begin 
  9.     var hi = end 
  10.     while(lo < hi) { 
  11.       val mid = (lo + hi + 1) >>> 1 
  12.       val found = parseEntry(idx, mid) 
  13.       val compareResult = compareIndexEntry(found, target, searchEntity) 
  14.       if(compareResult > 0) 
  15.         hi = mid - 1 
  16.       else if(compareResult < 0) 
  17.         lo = mid 
  18.       else 
  19.         return (mid, mid) 
  20.     } 
  21.     (lo, if (lo == _entries - 1) -1 else lo + 1) 
  22.   } 
  23.  
  24.   /** 
  25.    * 2. 確認熱區首個索引項位。_warmEntries就是所謂的分割線,目前固定為8192字節處 
  26.    * 對于OffsetIndex,_warmEntries = 8192 / 8 = 1024,即第1024個索引項 
  27.    * 大部分查詢集中在索引項的尾部,所以把尾部的8192字節設置為熱區 
  28.    * 如果查詢target在熱區索引項范圍,直接查熱區,避免頁中斷 
  29.    */ 
  30.   val firstHotEntry = Math.max(0, _entries - 1 - _warmEntries) 
  31.   // 3. 判斷target偏移值在熱區還是冷區 
  32.   if(compareIndexEntry(parseEntry(idx, firstHotEntry), target, searchEntity) < 0) { 
  33.     // 如果在熱區,搜索熱區 
  34.     return binarySearch(firstHotEntry, _entries - 1) 
  35.   } 
  36.  
  37.   // 4. 確保要查找的位移值不能小于當前最小位移值 
  38.   if(compareIndexEntry(parseEntry(idx, 0), target, searchEntity) > 0) 
  39.     return (-1, 0) 
  40.  
  41.   // 5. 如果在冷區,搜索冷區 
  42.   binarySearch(0, firstHotEntry) 

這樣做的好處是,在頻繁查詢尾部的情況下,尾部的頁基本都能在page cahce中,從而避免缺頁中斷。

下面我們還是用之前的例子來看下。由于每個頁最多包含512個索引項,而最后的1024個索引項所在頁會被認為是熱區。那么當12號頁未滿時,則10、11、12會被判定是熱區;而當12號頁剛好滿了的時候,則11、12被判定為熱區;當增至13號頁且未滿時,11、12、13被判定為熱區。假設我們讀取的是最新的消息,則在熱區中進行二分查找的情況如下:

當12號頁未滿時,依次訪問11、12號頁,當12號頁滿時,訪問頁的情況相同。當13號頁出現的時候,依次訪問12、13號頁,不會出現訪問長時間未訪問的頁,則能有效避免缺頁中斷。

關于為什么設置熱區大小為8192字節,官方給出的解釋,這是一個合適的值:

足夠小,能保證熱區的頁數小于等于3,那么當二分查找時的頁面都很大可能在page cache中。也就是說如果設置的太大了,那么可能出現熱區中的頁不在page cache中的情況。

足夠大,8192個字節,對于位移索引,則為1024個索引項,可以覆蓋4MB的消息數據,足夠讓大部分在in-sync內的節點在熱區查詢。

最后一句話總結下:在Kafka索引中使用普通二分搜索會出現缺頁中斷的現象,造成延遲,且結合查詢大多集中在尾部的情況,通過將索引區域劃分為熱區和冷區,分別搜索,將盡可能保證熱區中的頁在page cache中,從而避免缺頁中斷。

 

責任編輯:武曉燕 來源: 草捏子
相關推薦

2021-11-01 12:55:43

網絡

2022-03-28 10:03:58

二分查找算法

2022-03-29 07:52:21

運用技巧二分查找

2021-04-23 09:12:09

Java數據結構算法

2022-03-18 08:37:12

二分查找算法元素

2021-04-27 06:21:29

Java數據結構算法

2023-12-22 09:37:13

二分查找數組數據庫

2022-12-05 09:42:14

C++Python算法

2022-02-15 08:25:22

hash表快排二分查找

2020-12-04 10:13:09

算法二分法效率

2023-09-16 18:35:53

二分查找算法

2022-06-28 09:31:00

電影票兌換券券面值

2021-10-14 07:55:20

二分查找面試

2021-05-09 20:22:41

順序查找二叉查找數據結構

2021-05-21 08:31:09

數據結構二叉樹

2022-04-13 09:30:00

C++二分圖圖著色

2021-02-24 07:46:20

數據結構二叉樹

2022-06-26 00:29:26

分布式系統Redis

2023-12-27 23:30:50

2021-12-26 00:10:39

二分法排查版本
點贊
收藏

51CTO技術棧公眾號

欧美一乱一性一交一视频| 精品捆绑美女sm三区| 亚洲午夜精品国产| 国产视频在线观看视频| 黄色亚洲在线| 亚洲欧美日韩一区二区在线| 日韩一级免费片| 国产丝袜在线播放| 欧美激情综合五月色丁香小说| 成人淫片在线看| 久久国产视频播放| 一区二区日韩欧美| 精品爽片免费看久久| 不卡中文字幕在线观看| 日本不卡网站| 亚洲欧美视频在线观看视频| 免费日韩电影在线观看| av网站在线免费看| 日韩电影在线免费看| 久久夜色精品国产| 亚洲无人区码一码二码三码的含义| 精品视频在线观看免费观看| 色狠狠av一区二区三区| 9色porny| yellow91字幕网在线| 国产日韩欧美综合一区| 国产麻豆乱码精品一区二区三区 | 国产精品一二三区在线观看| 麻豆精品久久| 欧美三级电影精品| 虎白女粉嫩尤物福利视频| 欧美xxx黑人xxx水蜜桃| 亚洲视频你懂的| 亚洲 日韩 国产第一区| 日本啊v在线| 成人精品一区二区三区四区| 成人免费福利在线| 在线观看国产精品视频| 久久婷婷一区| 日韩av电影国产| 日韩三级av在线| 在线国产欧美| 欧美激情一级精品国产| 农村妇女精品一区二区| 一本一道久久a久久精品蜜桃| 一区二区三区视频免费| 在线免费看黄视频| 亚洲va久久久噜噜噜久久| 亚洲黄色免费三级| 中国免费黄色片| 成人黄色av网址| 精品国产污网站| 免费看91视频| 国产精品午夜av| 欧美精品一区二区久久婷婷| 潘金莲一级淫片aaaaa| 日韩最新av| 精品国产一区二区三区忘忧草| 日本成人在线免费观看| 涩涩屋成人免费视频软件| 日韩欧美视频一区| 国产清纯白嫩初高中在线观看性色| 日本成人精品| 精品国产欧美一区二区| 亚洲高清无码久久| 亚洲丁香日韩| 亚洲性无码av在线| av资源在线免费观看| 五月天久久777| 欧美国产视频日韩| 日韩av综合在线| 久久国产精品毛片| 国产精品一区二区三区免费视频 | 免费无码毛片一区二区app| 欧美欧美天天天天操| 久久久久久国产精品美女| 日本免费在线播放| 久久青草久久| 成人看片人aa| 你懂的网站在线| 久久午夜免费电影| 一区二区在线观| 欧美理论片在线播放| 第一福利永久视频精品| 一区二区三区免费播放| 日韩精品成人| 亚洲美女激情视频| 多男操一女视频| 国产精品av一区二区| 91豆花精品一区| 中文字幕 人妻熟女| 国产一区欧美一区| 久久99精品久久久久久久青青日本| 精品一二三区视频| 亚洲天堂2014| 日韩精品无码一区二区三区免费| 青青青国产精品| 精品一区电影国产| 日韩在线视频网址| 午夜亚洲性色视频| 91在线网站视频| 黄色在线小视频| 一区二区三区四区蜜桃| 久草在在线视频| 亚洲精品国产九九九| 亚洲视频专区在线| 久久高清免费视频| 久久99精品国产麻豆婷婷洗澡| 国产日韩精品久久| 麻豆网站在线观看| 在线免费观看成人短视频| 国产伦精品一区二区三区妓女下载| 亚洲aaa级| 久久久久久一区二区三区| 最近中文字幕免费观看| 成人午夜私人影院| 宅男av一区二区三区| 日韩国产激情| 亚洲福利视频免费观看| 深夜福利影院在线观看| 美女脱光内衣内裤视频久久影院| 久久99久久精品国产| 先锋影音在线资源站91| 欧美日韩一二三| 日韩精品电影一区二区| 亚洲国产精品第一区二区三区| 成人网在线免费观看| 国产在线观看免费网站| 欧美视频中文字幕在线| 中文在线永久免费观看| 激情欧美国产欧美| av资源一区二区| 国产黄色在线观看| 欧美日本一道本| 国产欧美小视频| 久久精品九九| 久久久久久久久久久久久久一区| 国产91足控脚交在线观看| 欧美一区二区久久| 希岛爱理中文字幕| 国内久久精品视频| 日韩video| 日韩欧美中文在线观看| 久久成人一区二区| 国产不卡av在线播放| 亚洲女厕所小便bbb| 善良的小姨在线| 一本一道久久a久久精品蜜桃| 成人网址在线观看| 麻豆传媒在线免费| 91精品国产日韩91久久久久久| 老司机深夜福利网站| 久久97超碰国产精品超碰| 亚洲欧美国产精品桃花| 青青伊人久久| 欧美久久精品一级黑人c片| 国产视频第二页| 姑娘第5集在线观看免费好剧| 秋霞欧美视频| 国产精品视频最多的网站| 成人在线免费看| 欧美日韩中文一区| 日本 欧美 国产| 国模一区二区三区白浆| 日韩人妻一区二区三区蜜桃视频| 欧美三级一区| 97精品久久久| 成人福利在线| 欧美一级片在线看| 日本少妇在线观看| 国产视频一区不卡| 国产无遮挡猛进猛出免费软件 | 老熟妇一区二区三区| 国产精品视频在线看| 三区视频在线观看| 亚洲精品护士| 日韩av电影免费播放| 日本在线一区二区| 午夜精品久久久久久久男人的天堂 | 日韩免费福利电影在线观看| 日韩精品一区二区av| 欧美极品另类videosde| 中文字幕55页| 国产精品腿扒开做爽爽爽挤奶网站| 天堂√在线观看一区二区 | 久久久久久毛片免费看| 午夜精品久久久久久久99热| 精品电影在线| 91精品免费观看| 国产精品theporn动漫| 国产午夜精品在线观看| 99999精品| 久久久久久久欧美精品| 国产经典久久久| 台湾色综合娱乐中文网| 国产在线精品播放| 天堂av在线| 久久精品国产精品| 免费a在线观看| 欧美成人精品福利| 中文字幕在线观看免费| 亚洲成人在线免费| 欧美三级黄色大片| 久久久久久久免费视频了| 波多野结衣在线免费观看| 久久精品观看| 91免费黄视频| 亚洲精品成人| 日本免费高清一区二区| 成人在线视频你懂的| 91精品免费看| 88xx成人永久免费观看| 久久久久亚洲精品成人网小说| www黄在线观看| 亚洲精品成a人在线观看| 99久久一区二区| 91成人网在线| 国产三级av片| 亚洲一区二区三区激情| 手机在线免费看毛片| 国产拍欧美日韩视频二区| 国产精品日韩欧美一区二区三区| 国产精品第56页| 亚洲色图欧美偷拍| 女教师淫辱の教室蜜臀av软件| 久久综合九色欧美综合狠狠| 亚洲精品久久一区二区三区777| 精品一区二区在线看| 国产福利影院在线观看| 麻豆成人在线| 久久久久人妻精品一区三寸| 日韩一级免费| 91免费黄视频| 亚洲精品在线二区| 人妻无码久久一区二区三区免费| 欧美精品97| 无码人妻精品一区二区蜜桃百度| 亚洲澳门在线| 免费观看黄色大片| 国产精品久久久久蜜臀| 亚洲va久久久噜噜噜久久狠狠| 国产精品一区二区av日韩在线| 精品国产一区二区三区日日嗨| 红杏一区二区三区| 久久av免费一区| 亚洲午夜久久| 日本在线观看一区二区| 日韩av在线中文字幕| 亚洲国产高清国产精品| 国产亚洲欧美日韩在线观看一区二区| 免费试看一区| 人人狠狠综合久久亚洲婷| 亚洲高清123| 亚洲第一偷拍| 日本中文字幕亚洲| 一区免费视频| 亚洲色欲综合一区二区三区| 三级欧美在线一区| 色悠悠久久综合网| 韩国欧美一区二区| 欧美激情一区二区三区p站| 99久久精品国产一区| 少妇毛片一区二区三区| 国产日韩综合av| 网爆门在线观看| 亚洲男人天堂av网| 国产奶水涨喷在线播放| 欧美性猛交xxxx黑人| 最新在线中文字幕| 欧美一级片在线看| 欧日韩在线视频| 亚洲天堂av图片| 精产国品自在线www| 欧美二区在线播放| 黑人巨大精品| 成人性生交大片免费看视频直播| 18国产精品| 免费毛片一区二区三区久久久| 日韩三级在线| 老太脱裤让老头玩ⅹxxxx| 久久综合狠狠| 精产国品一区二区三区| 91视频免费播放| 色欲一区二区三区精品a片| 偷拍亚洲欧洲综合| 亚洲图片小说视频| 精品精品国产高清a毛片牛牛 | 久久久国产精品x99av| 久草在线视频网站| 国产精品久久久久久久久久久久久久| www.91精品| 另类小说综合网| 一区二区三区午夜视频| 国产91美女视频| 精品一区二区三区香蕉蜜桃| 国产激情第一页| 亚洲日本青草视频在线怡红院| 日韩av女优在线观看| 欧美日韩国产另类一区| 欧美一级淫片免费视频魅影视频| 最新的欧美黄色| 亚洲国产福利| 亚洲综合精品一区二区| av一区二区在线播放| 国产免费一区二区视频| 久久精品国产秦先生| 极品人妻一区二区三区| 亚洲男人的天堂一区二区 | 奇米色777欧美一区二区| 日本久久久久久久久久| 中文字幕中文字幕一区二区| 全部毛片永久免费看| 欧美大片国产精品| 色的视频在线免费看| 国产97色在线| 红杏aⅴ成人免费视频| 男同互操gay射视频在线看| 日韩电影在线观看电影| theav精尽人亡av| 亚洲国产精品一区二区尤物区| 91禁在线观看| 中文字幕精品网| 婷婷综合六月| 欧美aaaaa喷水| 国产亚洲在线观看| 亚洲女则毛耸耸bbw| 亚洲激情校园春色| 国产一区二区三区中文字幕| 夜夜嗨av色综合久久久综合网| 性国裸体高清亚洲| 国产精品一区二区三区不卡| 欧美精品福利| 中文字幕avav| 一区二区三区国产| 精品国产伦一区二区三| 久久久国产精彩视频美女艺术照福利 | 日韩av福利在线观看| |精品福利一区二区三区| 在线观看黄色网| xvideos亚洲人网站| 97精品资源在线观看| 做爰高潮hd色即是空| 久久精品国产精品青草| 亚洲欧美精品久久| 欧美精品国产精品| 人人干在线视频| 成人妇女淫片aaaa视频| 亚洲91精品| 下面一进一出好爽视频| 一区二区在线看| 亚洲精品成人电影| 97超碰色婷婷| 精品中文一区| 亚洲综合色在线观看| 国产精品久久影院| 国产色在线视频| 久久久久久亚洲| 先锋影音国产精品| 日韩免费高清在线| 中文字幕一区三区| 亚洲第一页视频| 91成人福利在线| 成人亚洲一区| 乳色吐息在线观看| 亚洲第一在线综合网站| 青春有你2免费观看完整版在线播放高清| 欧美尤物巨大精品爽| 不卡一区综合视频| 久久久久久久高清| 亚洲国产另类av| 高清在线观看av| 91精品国产91久久久久青草| 最新亚洲激情| 国产三级在线观看完整版| 欧美一区二区福利在线| 91九色国产在线播放| 日本一区二区三区免费看| 精东粉嫩av免费一区二区三区| 久草国产在线视频| 亚洲欧美日韩天堂| 韩国一区二区三区视频| 自拍日韩亚洲一区在线| 中文字幕第一区| www.香蕉视频| 国产成人97精品免费看片| 91精品国产自产拍在线观看蜜| 免费a v网站| 欧美久久久久久久久| av成人 com a| 一级二级三级欧美| 99久久99久久久精品齐齐| 中文在线观看免费高清| 国内免费精品永久在线视频| 成人情趣视频| 熟妇人妻久久中文字幕| 欧美高清视频在线高清观看mv色露露十八 | 一区二区三区在线视频播放| 肉丝一区二区| 亚洲影院色无极综合| 日韩精品欧美成人高清一区二区|