1. 程式人生 > >go任務調度11(分布式crontab架構分析)

go任務調度11(分布式crontab架構分析)

技術分享 策略 fff 完全 監聽 防止 ado 掃描 一份

crontab是單機工具
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
(所有worker都在調度,如果有1000個任務,所有worker都在調用者1000個任務。對於編譯型語言來說,排序一個一千萬的數組只需要一秒,對於一千一萬的調度,無需擔心性能)
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
(相當於完成一個到worker集群的通知,通知它們殺死任務)
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
(
1.etcd中的任務會實時同步給worker,worker的調度協程會更新內存中維護的任務列表。etcd在內存中會鏡像一份和etcd完全一樣的任務清單,通過監聽機制實現。
2.調度協程會周期性檢查所有任務的cron任務表達式,掃描到期任務,到期任務會交給執行協程去執行。
3.同時,調度協程還會監聽一個任務控制事件(想要殺死某個任務),收到後,多個協程會強制中斷執行中的子進程(shell命令)。
4.執行協程返回結果給調度協程,調度協程可以更新內存中任務狀態,當任務調度給執行協程的時候,任務的狀態就被更新為執行中了。任務結果返回就將狀態改為執行完成。然後將執行結果投遞給日誌協程。
)
技術分享圖片
(worker是個集群,每個workder任務清單都是從etcd中全量同步的,所以大家都按照每個任務的調度周期,在同時調度,對於同一個任務,比如每秒執行的任務,所有worker每隔一秒都會去執行這個任務。如果不做並發控制,所有worker會同一時刻全部執行一次這個任務。我們希望一個任務同一時刻只被執行一次,不允許任務並發調度。如何防止並發呢?去etcd中搶鎖,大家都要調度,誰搶到誰調度,其他人等待下次過期,下次接著搶,搶到我就執行。這種很依賴各個時間節點的同步,校時不同會讓有些機器老是先搶到鎖。我們需要時間校準保障一致,還可以做些小策略,比如隨機睡眠n-m毫秒)
技術分享圖片

go任務調度11(分布式crontab架構分析)