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