時鐘輪在RPC中的應用

2021-10-25 10:57:17 字數 1154 閱讀 6073

rpc中時鐘輪的應用

注意rpc中很多場景都會用到定時任務,比如呼叫端請求超時的處理邏輯,我們當時使用的是future去實現呼叫,如下

呼叫端在向伺服器傳送之前會建立乙個future,然後記錄下這個future建立時間和這個future的超時時間,並有乙個定時任務進行檢測,當future到達超時時間沒有被處理時,執行超時邏輯。

sleep

每建立乙個future,就啟動乙個執行緒,之後sleep,到達超時時間就觸發請求超時的處理邏輯。

弊端是:高併發場景下,請求超時時間5s的話,單機每秒一萬請求的話,將會有10萬的執行緒。

輪詢用乙個執行緒來處理所有定時任務,每隔一段時間掃瞄一下所有的超時任務,當發現有超時的,即執行超時任務。比如呼叫端剛好在1s內傳送了1萬次請求,5s後超時,掃瞄的執行緒會不停的掃瞄遍歷,總共掃瞄50次1萬個任務,本來只需要最後1s掃瞄即可,但是從頭開始掃的話額外掃瞄了40次。

高併發下輪詢同樣是一種很耗資源的操作,會帶來很大的cpu損耗

時鐘輪時鐘輪是一種可以減少額外掃瞄操作的一種技術。

時鐘輪的實現原理和生活中的時鐘跳動的原理很相似,有兩個概念

將任務放到時間槽中,每隔固定的時間,就會從乙個槽位跳到另外乙個槽位,相當於秒針轉動

時鐘輪分多層,下一層時鐘輪的每個槽位時間是當前時間輪整個週期的時間。

當時鐘輪將乙個週期的所有槽位都跳動完之後,就會從下一層時鐘輪中取出乙個槽位的任務,重新分配到當前的時鐘輪中。

兩個時鐘輪如下:

假設有3個任務,任務a 90ms後執行,任務b 610ms執行,任務c 1秒610ms執行,放入槽位,任務a在當前時鐘輪第0槽位,任務b在當前時鐘輪第6槽位,任務c在下一時鐘輪第1號槽位。如下:

當前時鐘輪走一輪之後,任務a和任務b都執行完畢,在下一層時鐘輪中取出任務c,放入當前時鐘輪,則放在第6槽位,繼續執行當前時鐘輪。

時間輪解決了過多的重複掃瞄問題,解決了cpu浪費的問題。

在裝置樹中時鐘的簡單使用

核心中關於時鐘的描述文件 documentation devicetree bindings clock clock bindings.txt documentation devicetree bindings clock samsung,s3c2410 clock.txt a.裝置樹中定義了各種時...

kafka中對時間輪的應用分析

kafka中存在著大量的延時操作,比如延遲生產,延遲拉取,延遲刪除等,這些延時操作並不是基於jdk 自帶的timer或者delayqueue 實現,而是基於時間輪的概念自己實現了乙個延時定時器,jdk中timer和delayqueue的插入和刪除操作的平均時間複雜度為o nlogn 並不能滿足kaf...

在AS3中實現時鐘

如下 的類為 time使用的話,可以隨便改。import flash.display.sprite import flash.events.timerevent import flash.utils.timer import flash.text.textfield import flash.dis...