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