天天看點

對于時間輪算法的一些思考

最近一直在使用當當的分布式任務調用架構,但是由于zk叢集是依賴别人的一直想換一套耦合性較低的,偶然的機會在看完許大神開源的xxl-job後萌生了自研的想法。在查詢了一些資料後發現大部分的延遲算都是基于時間輪,例如kafka的延遲隊列。

對于時間輪算法的一些思考

一、為什麼使用時間輪算法

時間輪是一種高效來利用線程資源來進行批量化排程的一種排程模型。把大批量的排程任務全部都綁定到同一個的排程器上面,使用這一個排程器來進行所有任務的管理(manager),觸發(trigger)以及運作(runnable)。能夠高效的管理各種延時任務,周期任務,通知任務等等。

二、時間輪缺點

時間輪的精度取決于每一格精度,精度越小誤差越小,且時間輪無法備份,當伺服器當機時會丢失所有任務。

三、複合時間輪

有時候有些任務會是幾小時、幾天甚至幾月一次,單個時間輪無法窮舉所有可能性,這時可以按照時鐘的方式,通過多層時間輪來實作,例如:定義一個時間輪為60秒每秒跳一次,使用60+60+60+60+60的五層時間輪可以表示出長達24年的時間。

對于高層的時間輪如果遇到過期任務時,隻需要将任務再重新放入下一層時間輪中就可以達到繼續定時的效果了。

四、最後的一些想法

這個提議最終還是沒有落地各種原因就不說了心累,以目前的想法對于中小型系統使用時間輪可以達到延時和高可用的目的,如果全公司統一使用還有一些挑戰,例如:

1、各任務耗費的調試資源不一,有些任務可能幾天一次,有些任務可能一秒一次,如何更好的均勻這些任務達到資源最大使用率。

2、單伺服器的排程吞吐量是有限的,同時一個任務做高可用往往也隻需要二台左右的伺服器即可,那麼整個大叢集中,如何更好的分發任務達到整個叢集最大吞吐量。