更新時(shí)間:2022年07月28日10時(shí)15分 來源:傳智教育 瀏覽次數(shù):
為什么需要時(shí)間輪?
在Dubbo中,為增強(qiáng)系統(tǒng)的容錯(cuò)能力,會(huì)有相應(yīng)的監(jiān)聽判斷處理機(jī)制。在Dubbo最開始的實(shí)現(xiàn)中,是將所有的返回結(jié)果(DefaultFuture)都放入集合中,并且通過定時(shí)任務(wù)掃描所有的 future,逐個(gè)判斷是否超時(shí)。
但這樣效率低下,Dubbo借鑒 Netty,引入了時(shí)間輪算法,減少無(wú)意義的輪詢判斷操作。
時(shí)間輪原理
時(shí)鐘輪的實(shí)質(zhì)上是參考了生活中的時(shí)鐘跳動(dòng)的原理。
在時(shí)鐘輪機(jī)制中,有時(shí)間槽和時(shí)鐘輪的概念,時(shí)間槽就相當(dāng)于時(shí)鐘的刻度;而時(shí)鐘輪就相當(dāng)于指針跳動(dòng)的一個(gè)周期。
如果時(shí)鐘輪有10個(gè)槽位,而時(shí)鐘輪一輪的周期是10秒,那么我們每個(gè)槽位的單位時(shí)間就是1秒,而下一層時(shí)間輪的周期就是100秒,每個(gè)槽位的單位時(shí)間也就是10秒。
假設(shè)現(xiàn)在我們有 3 個(gè)任務(wù),分別是任務(wù) A(0.9秒之后執(zhí)行)、任務(wù) B(2.1秒后執(zhí)行)與任務(wù) C(12.1秒之后執(zhí)行),我們將這 3 個(gè)任務(wù)添加到時(shí)鐘輪中,任務(wù) A 被放到第 0 槽位,任務(wù) B 被放到第 2槽位,任務(wù) C 被放到下一層時(shí)間輪的第2個(gè)槽位,如下圖所示:
通過這個(gè)場(chǎng)景我們可以了解到,每個(gè)任務(wù)會(huì)按要求只掃描執(zhí)行一次, 這樣就能夠很好的解決 CPU 浪費(fèi)的問題。
Dubbo中的時(shí)間輪原理是如何實(shí)現(xiàn)?
主要是通過 Timer,Timeout,TimerTask 幾個(gè)接口定義了一個(gè)定時(shí)器的模型,再通過 HashedWheelTimer 這個(gè)類實(shí)現(xiàn)了一個(gè)時(shí)間輪定時(shí)器。通過該定時(shí)器,Dubbo 實(shí)現(xiàn)了高效的任務(wù)調(diào)度。
時(shí)間輪在RPC的應(yīng)用
調(diào)用超時(shí): 在高并發(fā)、高訪問量的情況下,時(shí)鐘輪每次只輪詢一個(gè)時(shí)間槽位中的任務(wù),這樣會(huì)節(jié)省大量的 CPU。
啟動(dòng)加載:比如服務(wù)啟動(dòng)完成之后要去加載緩存,執(zhí)行定時(shí)任務(wù)等, 都可以放在時(shí)鐘輪里。
定時(shí)心跳檢測(cè):可以將心跳的邏輯封裝為一個(gè)心跳任務(wù),放到時(shí)鐘輪里。
北京校區(qū)