日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3.6.3 获取分区的读取偏移量

發布時間:2024/3/13 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 3.6.3 获取分区的读取偏移量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

3.6.3 獲取分區的讀取偏移量

讀取分區的偏移量涉及日志存儲,這里我們先給出一些簡單的結論(具體細節會在第6章詳細分析):一個分區有多個片段文件(Segment),每個片段文件都包含全局有序的片段基準偏移量(segmentBaseOffset)。客戶端調用getlastOffset()獲取的是每個片段文件的基準偏移量。

客戶端發送的偏移氈’請求(OffsetRequest)包含的數據是:分區偏移量的請求信息(PartitionOffsetinfo)。這個對象有兩個參數:whichTime表示拉取的時間戳,默認第一次拉取的時間戳為EarliestTime=-2,如果拉取響應的錯誤碼是OffsetOutofRange,則時間戳設置為LatestTime=-1;maxNuMOffsets表示需要獲取多少個片段文件的基準偏移量,消費者獲取最近的偏移量通常只需要一個偏移盤值,所以第二個參數值為1。相關代碼如下:

消費者發送的偏移量請求類型是LIST_OFFSETS,服務端使用handleOffsetRequest()處理請求,并返回分區的偏移量集合。存儲消息時除了存儲消息內容本身,還會存儲消息對應的偏移盞,但Li.stOffsets并不是要返回所有消息的偏移量,而是每個片段文件的基準偏移量。一個分區的片段文件數量并不會很多,相比有多少條消息就返回多少個偏移盤,后者的數據盤傳輸更少且更快。

消費者讀取分區的偏移雖有一個限制條件:不能超過服務端中這個分區的最高水位(HighWatermark,下文簡稱HW)。服務端只能保證HW之前的消息已經提交,而HW之后的消息沒有提交。fetchOffsets()返回的是按照偏移量降序排列的數組,如果偏移量比HW大,則會被丟棄。相關代碼如下:

fetchOffsetsBefore()方法獲取指定時間戳之前的偏移量,最后返回的是片段文件對應的基準偏移量。每個片段文件對應一個基準偏移盤,startindex表示片段文件的索引編號。讀取片段文件跟重置策略有關,如果重置策略是最早(EARLIEST_TImESTAmP),IQiJstart!ndex置為O(即第一個片段文件);如果是最近(LATEST_TImESTAmP),則是最后一個片段文件的索引編號。

offsetTimeArray數組會按照時間戳的升序,存儲所有片段文件的基準偏移量和最近修改的時間,這個修改時間就是用來和時間戳參數比較的依據:要返回指定時間戳之前的偏移盤,應該從后面的片段文件開始往前推;如果片段文件的最近修改時間比指定的時間戳小,貝iJ設置start!ndex為當前找到的片段文件。

片段文件的偏移盤和時間戳是成正比增加的。為了簡單起見,假設時間戳和偏移量是等價的,并假設我們要獲取時間戳為12之前的3個偏移盤。首先找到小于時間戳的最大值是l1,startindex就是位置ll,然后再往前找3個,假設allOffsets為[11,8,5],并且hw為10,則hw+:allOffsetsdropWhile(>hw)的結果為List(l0,8,5)。相關代碼如下:

注意:dropWhile的含義是將大于hw的刪掉。因為allOffsets是降序排列,如果allOffsets中第一個元素就比hw小,就不會丟棄任何元素,比如10+:List(8,5).dropWhile(>10)=List(10,8,5)。如果allOffsets中最小的都比hw要大,最后就只有hw,比如10+:Li.st(20,17,14).dropWhile(_>10)=List(10)。

客戶端有了分區,而且也知道要從分區的什么位置開始讀取消息,接下來就是向分區的主副本節點發送拉II~:請求以得到消息。


總結

以上是生活随笔為你收集整理的3.6.3 获取分区的读取偏移量的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。