Kafka科普系列 | 輕松理解Kafka中的延時(shí)操作

本文起源于之前去面試的一道面試題,面試題大致上是這樣的:消費(fèi)者去Kafka里拉去消息,但是目前Kafka中又沒(méi)有新的消息可以提供,那么Kafka會(huì)如何處理?

如下圖所示,兩個(gè)follower副本都已經(jīng)拉取到了leader副本的最新位置,此時(shí)又向leader副本發(fā)送拉取請(qǐng)求,而leader副本并沒(méi)有新的消息寫(xiě)入,那么此時(shí)leader副本該如何處理呢?可以直接返回空的拉取結(jié)果給follower副本,不過(guò)在leader副本一直沒(méi)有新消息寫(xiě)入的情況下,follower副本會(huì)一直發(fā)送拉取請(qǐng)求,并且總收到空的拉取結(jié)果,這樣徒耗資源,顯然不太合理。

image

這里就涉及到了Kafka延遲操作的概念。Kafka在處理拉取請(qǐng)求時(shí),會(huì)先讀取一次日志文件,如果收集不到足夠多(fetchMinBytes,由參數(shù)fetch.min.bytes配置,默認(rèn)值為1)的消息,那么就會(huì)創(chuàng)建一個(gè)延時(shí)拉取操作(DelayedFetch)以等待拉取到足夠數(shù)量的消息。當(dāng)延時(shí)拉取操作執(zhí)行時(shí),會(huì)再讀取一次日志文件,然后將拉取結(jié)果返回給follower副本。

延遲操作不只是拉取消息時(shí)的特有操作,在Kafka中有多種延時(shí)操作,比如延時(shí)數(shù)據(jù)刪除、延時(shí)生產(chǎn)等。

對(duì)于延時(shí)生產(chǎn)(消息)而言,如果在使用生產(chǎn)者客戶端發(fā)送消息的時(shí)候?qū)cks參數(shù)設(shè)置為-1,那么就意味著需要等待ISR集合中的所有副本都確認(rèn)收到消息之后才能正確地收到響應(yīng)的結(jié)果,或者捕獲超時(shí)異常。

image

假設(shè)某個(gè)分區(qū)有3個(gè)副本:leader、follower1和follower2,它們都在分區(qū)的ISR集合中。為了簡(jiǎn)化說(shuō)明,這里我們不考慮ISR集合伸縮的情況。Kafka在收到客戶端的生產(chǎn)請(qǐng)求后,將消息3和消息4寫(xiě)入leader副本的本地日志文件,如上圖所示。

由于客戶端設(shè)置了acks為-1,那么需要等到follower1和follower2兩個(gè)副本都收到消息3和消息4后才能告知客戶端正確地接收了所發(fā)送的消息。如果在一定的時(shí)間內(nèi),follower1副本或follower2副本沒(méi)能夠完全拉取到消息3和消息4,那么就需要返回超時(shí)異常給客戶端。生產(chǎn)請(qǐng)求的超時(shí)時(shí)間由參數(shù)request.timeout.ms配置,默認(rèn)值為30000,即30s。

image
image

那么這里等待消息3和消息4寫(xiě)入follower1副本和follower2副本,并返回相應(yīng)的響應(yīng)結(jié)果給客戶端的動(dòng)作是由誰(shuí)來(lái)執(zhí)行的呢?在將消息寫(xiě)入leader副本的本地日志文件之后,Kafka會(huì)創(chuàng)建一個(gè)延時(shí)的生產(chǎn)操作(DelayedProduce),用來(lái)處理消息正常寫(xiě)入所有副本或超時(shí)的情況,以返回相應(yīng)的響應(yīng)結(jié)果給客戶端。

延時(shí)操作需要延時(shí)返回響應(yīng)的結(jié)果,首先它必須有一個(gè)超時(shí)時(shí)間(delayMs),如果在這個(gè)超時(shí)時(shí)間內(nèi)沒(méi)有完成既定的任務(wù),那么就需要強(qiáng)制完成以返回響應(yīng)結(jié)果給客戶端。其次,延時(shí)操作不同于定時(shí)操作,定時(shí)操作是指在特定時(shí)間之后執(zhí)行的操作,而延時(shí)操作可以在所設(shè)定的超時(shí)時(shí)間之前完成,所以延時(shí)操作能夠支持外部事件的觸發(fā)。

就延時(shí)生產(chǎn)操作而言,它的外部事件是所要寫(xiě)入消息的某個(gè)分區(qū)的HW(高水位)發(fā)生增長(zhǎng)。也就是說(shuō),隨著follower副本不斷地與leader副本進(jìn)行消息同步,進(jìn)而促使HW進(jìn)一步增長(zhǎng),HW每增長(zhǎng)一次都會(huì)檢測(cè)是否能夠完成此次延時(shí)生產(chǎn)操作,如果可以就執(zhí)行以此返回響應(yīng)結(jié)果給客戶端;如果在超時(shí)時(shí)間內(nèi)始終無(wú)法完成,則強(qiáng)制執(zhí)行。

回顧一下文中開(kāi)頭的延時(shí)拉取操作,它也同樣如此,也是由超時(shí)觸發(fā)或外部事件觸發(fā)而被執(zhí)行的。超時(shí)觸發(fā)很好理解,就是等到超時(shí)時(shí)間之后觸發(fā)第二次讀取日志文件的操作。外部事件觸發(fā)就稍復(fù)雜了一些,因?yàn)槔≌?qǐng)求不單單由follower副本發(fā)起,也可以由消費(fèi)者客戶端發(fā)起,兩種情況所對(duì)應(yīng)的外部事件也是不同的。如果是follower副本的延時(shí)拉取,它的外部事件就是消息追加到了leader副本的本地日志文件中;如果是消費(fèi)者客戶端的延時(shí)拉取,它的外部事件可以簡(jiǎn)單地理解為HW的增長(zhǎng)。

人過(guò)留名,雁過(guò)留聲,路過(guò)記得點(diǎn)個(gè)贊。

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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