golang,告警業務,每個告警源都有不同的分發頻率,告警源可能新增or刪除,該如何設計?

時間 2021-05-10 04:31:34

1樓:周曉軍

看題主的需求就是需要一系列的定時跑批任務,題主的方案是用協程 + sleep 的方式,怎麼看都不是很優雅,而且即使協程很輕量級,占用資源少,也不能這麼隨意吧。這裡我根據自己的一些經驗提幾個方案:

方案一:K8s 的 CronJob

利用 K8s 的 CronJob,類似於 Linux 中的 Linux crontab;你只要負責實現對應的業務邏輯,並設定具體的排程規則,例如`0 * */1 * *`,K8s 會負責具體任務的排程工作;CronJob 還有其他配置可以設定,例如重複次數,失敗重啟策略等等:

方案二:jobrunner 庫

如果覺得用 K8s 太重了,這邊推薦乙個 golang 的開源任務框架庫:jobrunner,jobrunner 在初始化的時候可以設定任務池大小,超過任務池會進入佇列;它還封裝了幾個好用的任務操作介面:

Now:立即啟動乙個任務

In:在給定時間之後,執行一次任務

Every:每隔給定時間,重複執行任務

Schedule:根據給定的排程規則,執行相應的任務

另外,結合 Gin,可以實時獲取任務的排程狀態資訊,詳見 README。

方案三:robfig/cron 庫

cron 是乙個實現了 Linux crontab 功能的開源庫,jobrunner 就是基於它實現的,你可以通過它來實現任務的定時排程。

.spec.startingDeadlineSeconds 域是可選的。

它表示任務如果由於某種原因錯過了排程時間,開始該任務的截止時間的秒數。過了截止時間,CronJob 就不會開始任務。 不滿足這種最後期限的任務會被統計為失敗任務。

如果該域沒有宣告,那任務就沒有最後期限。

CronJob 控制器會統計錯過了多少次排程。如果錯過了100次以上的排程,CronJob 就不再排程了。 當沒有設定 .

spec.startingDeadlineSeconds 時,CronJob 控制器統計從 status.lastScheduleTime 到當前的排程錯過次數。

例如乙個 CronJob 期望每分鐘執行一次,status.lastScheduleTime是 5:00am, 但現在是 7:

00am。那意味著 120 次排程被錯過了,所以 CronJob 將不再被排程。 如果設定了 .

spec.startingDeadlineSeconds 域(非空),CronJob 控制器統計從 .spec.

startingDeadlineSeconds 到當前時間錯過了多少次任務。 例如設定了 200,它會統計過去 200 秒內錯過了多少次排程。 在那種情況下,如果過去 200 秒內錯過了超過 100 次的排程,CronJob 就不再排程。

怎麼學習 Golang?

yuyoung 許式偉 go語言程式設計,這本書入門即可。深入就看下這個,https 靜水流深 學習go的最好方法就是看一些高質量的開源專案,可以試試這個軟體,他把go模組之間struct的依賴以圖形化的方式展示出來,對於快速了解專案的結構有很大的幫助。有了他,閱讀大型專案也不是啥大問題了 有只貓 ...

如何學習golang?

張繼瑀 基礎 Go語言程式設計 許式偉 web Go web程式設計 謝孟軍 提公升 Go語言學習筆記 雨痕 然後去擼Go原始碼當中runtime的原始碼就可以了 大傑哥 入門 Go語言聖經 https docs.hacknode.org gopl zh index.html 高階 Go語言高階程式...

如何評價golang 1 7?

DamonChen 1 ssa新增進去了。2 編譯時間變短了 比1.4還是長 3 生成檔案變小了 4 可以生成二進位制的庫了 實驗 5 vendor機制預設了 6 把x net context修改到標準庫了,看了下介面實現,有一部分改變了,所以如果你自己的介面有依賴,可能編譯不過了 7 修改了不少的...