Kafka-14.實(shí)現(xiàn)-日志

有兩個(gè)分區(qū)的名為“my_topic”的主題的日志包含兩個(gè)目錄(即my_topic_0和my_topic_1),其中填充了包含該主題的消息的數(shù)據(jù)文件。日志文件的格式是一系列“日志條目”;每個(gè)日志條目是一個(gè)4字節(jié)整型變量N,存儲(chǔ)消息長(zhǎng)度,后跟N個(gè)消息字節(jié)。每條消息由64位整數(shù)偏移量給出消息在這個(gè)分去中所有發(fā)送到這個(gè)主題的消息的流中開始的字節(jié)位置。每個(gè)日志文件都以其包含的第一條消息的便宜量命名,因此創(chuàng)建的第一個(gè)文件都將是00000000000.kafka,并且每個(gè)附加文件將具有一個(gè)整數(shù)名稱,大約是從前一個(gè)文件中的S個(gè)字節(jié),其中S是配置中給出的最大日志文件的大小。

record的確切二進(jìn)制格式被版本化并維護(hù)為標(biāo)準(zhǔn)接口,因此record批次可以在生產(chǎn)者,broker,和客戶端之間傳輸,而無需進(jìn)行重新復(fù)制或轉(zhuǎn)換。上一節(jié)包含了有關(guān)磁盤上對(duì)record進(jìn)行格式化的詳細(xì)信息。

使用消息偏移量作為消息ID是不常見的。我們最初的想法是使用生產(chǎn)者生成的GUID,并在每個(gè)broker上維護(hù)從GUID到偏移的映射。但由于消費(fèi)者必須為每個(gè)服務(wù)器維護(hù)一個(gè)ID,因此GUID的全局唯一性不提供任何價(jià)值。此外,保持從隨機(jī)id到偏移的映射的復(fù)雜性需要heavy的索引結(jié)構(gòu),其必須與磁盤同步,基本上需要完全持久的隨機(jī)訪問數(shù)據(jù)結(jié)構(gòu)。 因此,為了簡(jiǎn)化查找結(jié)構(gòu),我們決定使用一個(gè)簡(jiǎn)單的per-partition原子計(jì)數(shù)器,它可以由分區(qū)id和節(jié)點(diǎn)id組成來唯一的標(biāo)識(shí)消息;這使得查找的結(jié)構(gòu)更加簡(jiǎn)單,盡管仍然可能針對(duì)每個(gè)消費(fèi)者請(qǐng)求進(jìn)行多次搜索。但是,一旦我們確定了一個(gè)計(jì)數(shù)器,直接使用偏移的跳轉(zhuǎn)看起來就很自然了——畢竟這之后都是在分區(qū)中單調(diào)地增加整型。由于偏移量是從消費(fèi)者API隱藏的,因此這個(gè)決定最終是一個(gè)實(shí)現(xiàn)細(xì)節(jié),我們采用了更加有效的方法。

Kafka 日志實(shí)現(xiàn)

寫入

日志允許串行追加始終去到最后一個(gè)文件。當(dāng)文件達(dá)到可配置的大?。ɡ?GB)時(shí),改文件將轉(zhuǎn)移到一個(gè)新文件中。該日志有兩個(gè)配置參數(shù):M,它給出了在強(qiáng)制操作系統(tǒng)把文件flush到硬盤之前寫入的消息數(shù),以及S,它給出了強(qiáng)制刷新的秒數(shù)。這提供了在系統(tǒng)崩潰時(shí)最多丟失M個(gè)消息或S秒數(shù)據(jù)的持久性保證。

讀取

通過給出消息的64位邏輯偏移量和S字節(jié)的最大塊大小來完成讀取。這將返回包含著唉S字節(jié)緩沖區(qū)中的消息的迭代器。S旨在比任何單個(gè)消息都大,但是如果消息異常的大,則可以多次重試讀取,每次將緩沖區(qū)大小加倍,直到消息被成功讀取??梢灾付ㄗ畲笙⒑途彌_區(qū)大小,以使服務(wù)器拒絕大于某個(gè)大小的消息,并在需要讀取的最大值上為客戶端提供綁定以獲得完整的消息。讀緩沖區(qū)很可能以部分消息結(jié)束,這很容易通過大小分隔來實(shí)現(xiàn)。

從偏移量讀取數(shù)據(jù)的實(shí)際過程需要首先定位存儲(chǔ)數(shù)據(jù)的日志段文件,從全局偏移量計(jì)算文件特定的偏移量,然后從該文件偏移量中讀取。搜索值針對(duì)每個(gè)文件維護(hù)的內(nèi)存范圍的簡(jiǎn)單二進(jìn)制搜索變體來完成的。

日志提供了獲取最近編寫信息的功能,以允許客戶端“立即”開始訂閱。在消費(fèi)者未能在其SLA-specified的天數(shù)內(nèi)使用其數(shù)據(jù)的情況下,這很有用。在這種情況下,當(dāng)客戶端嘗試使用不存在的偏移量時(shí),會(huì)給出OutOfRangeException,并且可以自行重置或根據(jù)用例進(jìn)行失敗。

以下是發(fā)送給消費(fèi)者的結(jié)果格式:

MessageSetSend (fetch result)
 
total length     : 4 bytes
error code       : 2 bytes
message 1        : x bytes
...
message n        : x bytes
1
2
3
4
5
6
7
MultiMessageSetSend (multiFetch result)
 
total length       : 4 bytes
error code         : 2 bytes
messageSetSend 1
...
messageSetSend n
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,936評(píng)論 0 9
  • kafka生產(chǎn)者生產(chǎn)的消息需要存儲(chǔ)在服務(wù)端,那么服務(wù)端就需要保證消息的健壯性,需要保證其線性擴(kuò)展,負(fù)載均衡,故障容...
    紹圣閱讀 531評(píng)論 0 0
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 12,321評(píng)論 6 13
  • iPhone的標(biāo)準(zhǔn)推薦是CFNetwork 庫(kù)編程,其封裝好的開源庫(kù)是 cocoa AsyncSocket庫(kù),用它...
    Ethan_Struggle閱讀 2,357評(píng)論 2 12
  • Design 1. Motivation 我們?cè)O(shè)計(jì)Kafka用來作為統(tǒng)一的平臺(tái)來處理大公司可能擁有的所有實(shí)時(shí)數(shù)據(jù)源...
    BlackManba_24閱讀 1,640評(píng)論 0 8

友情鏈接更多精彩內(nèi)容