溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何分析Kafka時(shí)間輪原理

發(fā)布時(shí)間:2021-12-03 18:26:26 來(lái)源:億速云 閱讀:140 作者:柒染 欄目:云計(jì)算

如何分析Kafka時(shí)間輪原理,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

 Kafka時(shí)間輪是Kafka實(shí)現(xiàn)高效的延時(shí)任務(wù)的基礎(chǔ),它模擬了現(xiàn)實(shí)生活中的鐘表對(duì)時(shí)間的表示方式,同時(shí),時(shí)間輪的方式并不僅限于Kafka,它是一種通用的時(shí)間表示方式,本文主要介紹Kafka中的時(shí)間輪原理。

Kafka中存在一些定時(shí)任務(wù)(DelayedOperation),如DelayedFetch、DelayedProduce、DelayedHeartbeat等,在Kafka中,定時(shí)任務(wù)的添加、輪轉(zhuǎn)、執(zhí)行、消亡等是通過(guò)時(shí)間輪來(lái)實(shí)現(xiàn)的。(時(shí)間輪并不是Kafka獨(dú)有的設(shè)計(jì),而是一種通用的實(shí)現(xiàn)方式,Netty中也有用到時(shí)間輪的方式)

1. 時(shí)間輪是什么

參考網(wǎng)上的兩張圖(摘自 https://blog.csdn.net/u013256816/article/details/80697456)

如何分析Kafka時(shí)間輪原理如何分析Kafka時(shí)間輪原理

這兩張圖就比較清楚的說(shuō)明了Kafka時(shí)間輪的結(jié)構(gòu)了:類似現(xiàn)實(shí)中的鐘表,由多個(gè)環(huán)形數(shù)組組成,每個(gè)環(huán)形數(shù)組包含20個(gè)時(shí)間單位,表示一個(gè)時(shí)間維度(一輪),如:第一層時(shí)間輪,數(shù)組中的每個(gè)元素代表1ms,一圈就是20ms,當(dāng)延遲時(shí)間大于20ms時(shí),就“進(jìn)位”到第二層時(shí)間輪,第二層中,每“一格”表示20ms,依此類推…

對(duì)于一個(gè)延遲任務(wù),大體包含三個(gè)過(guò)程:進(jìn)入時(shí)間輪、降級(jí)和到期執(zhí)行。

  • 進(jìn)入時(shí)間輪

1. 根據(jù)延遲時(shí)間計(jì)算對(duì)應(yīng)的時(shí)間輪“層次”(如鐘表中的“小時(shí)級(jí)”還是“分鐘級(jí)”還是“秒級(jí)”,實(shí)際上是一個(gè)不斷“升級(jí)”的過(guò)程,直到找到合適的“層次”)

2. 計(jì)算在該輪中的位置,并插入該位置(每個(gè)bucket是一個(gè)雙向鏈表,可能包含多個(gè)延遲任務(wù),這也是時(shí)間輪提高效率的一大原因,后面會(huì)提到)

3. 若該bucket是首次插入,需要將該bucket加入DelayQueue中(DelayQueue的引入是為了解決“空推進(jìn)”,后面會(huì)提到)

如何分析Kafka時(shí)間輪原理

  • 降級(jí)

1. 當(dāng)時(shí)間“推進(jìn)”到某個(gè)bucket時(shí),說(shuō)明該bucket中的任務(wù)在當(dāng)前時(shí)間輪中的時(shí)間已經(jīng)走完,需要進(jìn)行“降級(jí)”,即進(jìn)入更小粒度的時(shí)間輪中,reinsert的過(guò)程和進(jìn)入時(shí)間輪是類似的

如何分析Kafka時(shí)間輪原理

  • 到期執(zhí)行

1. 在reinsert的過(guò)程中,若發(fā)現(xiàn)已經(jīng)到期,則執(zhí)行這些任務(wù)

如何分析Kafka時(shí)間輪原理

整體過(guò)程大致如下:

如何分析Kafka時(shí)間輪原理

2. 時(shí)間的“推進(jìn)”

一種直觀的想法是,像現(xiàn)實(shí)中的鐘表一樣,“一格一格”地走,這樣就需要有一個(gè)線程一直不停的執(zhí)行,而大多數(shù)情況下,時(shí)間輪中的bucket大部分是空的,指針的“推進(jìn)”就沒(méi)有實(shí)質(zhì)作用,因此,為了減少這種“空推進(jìn)”,Kafka引入了DelayQueue,以bucket為單位入隊(duì),每當(dāng)有bucket到期,即queue.poll能拿到結(jié)果時(shí),才進(jìn)行時(shí)間的“推進(jìn)”,減少了 ExpiredOperationReaper 線程空轉(zhuǎn)的開銷。

如何分析Kafka時(shí)間輪原理

3. 為什么要用時(shí)間輪

用到延遲任務(wù)時(shí),比較直接的想法是DelayQueue、ScheduledThreadPoolExecutor 這些,而時(shí)間輪相比之下,最大的優(yōu)勢(shì)是在時(shí)間復(fù)雜度上:

時(shí)間復(fù)雜度對(duì)比:

如何分析Kafka時(shí)間輪原理

因此,理論上,當(dāng)任務(wù)較多時(shí),TimingWheel的時(shí)間性能優(yōu)勢(shì)會(huì)更明顯

總結(jié)一下Kafka時(shí)間輪性能高的幾個(gè)主要原因:

(1)時(shí)間輪的結(jié)構(gòu)+雙向列表bucket,使得插入操作可以達(dá)到O(1)的時(shí)間復(fù)雜度

(2)Bucket的設(shè)計(jì)讓多個(gè)任務(wù)“合并”,使得同一個(gè)bucket的多次插入只需要在delayQueue中入隊(duì)一次,同時(shí)減少了delayQueue中元素?cái)?shù)量,堆的深度也減小,delayqueue的插入和彈出操作開銷也更小

關(guān)于如何分析Kafka時(shí)間輪原理問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI