hangfire 是一款強大的.net開源後台任務利器,無需windows服務/任務計畫程式。可以使用於asp.net 應用也可以使用於控制台。hangfire 只需簡單幾句**即可建立新的不同種類的任務。與quartz.net相比,其整合了視覺化的ui管理與監視工具,不但可以檢視任務的執行頻率 ,還可以手動啟動或刪除任務。
在特來電系統中,hangfire作為定時任務排程的引擎,主要用於實現定時充電排程,plus會員過期提醒,各類狀態資訊的定時上報和各類定時處理排程(比如各類補償任務和檢查任務)等。
hangfire ui管理介面
由於hangfire的的任務執行依賴於輪詢redis或者sqlserver資料庫,如果它們發生宕機或者連線出現問題,hangfire的工作執行緒往往會掛掉,出現任務無法按時執行的問題,當然可以通過hangfire的ui介面發現問題,但是對於可用性要求高的網際網路應用,通過人工觀察是無法保證系統的可靠性。
所以為了及時了解hangfire的執行狀態,我們對hangfire的系統有如下的監控需求:
一、hangfire工作執行緒是否正常
hangfire工作原理如圖
服務端的功能主要是2塊
特來電使用的hangfire 任務主要是下面兩類:
上述兩種任務的分別有各自的輪詢功能。
hangfire執行邏輯
因此如果想確保delayed job和recurring job功能都是正常,可以通過建立心跳任務來確認,如果心跳任務正常,那麼就認為從建立任務到任務執行的通路是暢通的。
所以在除了業務任務外,在hangfire的任務佇列中新增了recurring job heartbeat和delayed job heartbeat兩類任務。這兩個任務都是用來上報監控資訊。recurring job heartbeat是非常簡單的recurring job,頻率為每分鐘執行一次。delayed job heartbeat稍微複雜,建立乙個每小時執行的recurring job,這個job處理為新增60個delayed job heartbeat監控任務,在下乙個小時中每分鐘執行乙個。 **實現如下:
//recurring job 每分鐘執行,上報一次心跳資訊,recurringjobid為任務idrecurringjob.addorupdate(recurringjobid, () => pro.reportmonitordata(recurringmonitometadata), "* * * * *");//delayed job 每小時執行一次,reportbackgrounddataid為任務idrecurringjob.addorupdate(reportbackgrounddataid, () => pro.reportschduleprocess(), "0 * * * *");
reportschduleprocess 即為建立delayed job heartbeat的任務
for (int i = 1; i <= 60; i++)
其中,reportmonitordata方法為上報監控的方法,引數為監控維度資訊。
這樣如果任務輪詢或者任務執行出現問題,那麼必然出現hangfire監控上報的空白。
正常情況監控
二、hangfire積壓任務數
hangfire的積壓任務數是指在執行佇列中任務數量,即已經到時間執行但是尚未執行的任務數,通常可以使用ui管理介面直接檢視,但是對於網際網路應用來說,這是無法滿足需求的,同樣還是需要對接監控系統。
對於積壓任務的數目,直接使用hangfire自己的監控api即可以獲得
jobstorage.current.getmonitoringapi().enqueuedcount("default")
其中「default」這個引數為執行佇列名,如果沒有特別指定,預設是「default」。
同時為了能夠定時上報,也把上報處理當成乙個每分鐘執行的job來處理。
recurringjob.addorupdate(reportmonitorextrusiondataid, () => pro.reportmonitorextrusiondata(), "* * * * *");
這樣的如果通過監控圖表可以實時的看到各個hangfire站點的任務積壓數
三、hangfire是否有內部異常
hangfire內部有完善的日誌機制,提供了trace,debug,info,warn,error,fatal等級的日誌。我們可以自己實現hangfire的日誌的處理實時監控hangfire的內部異常。
實現hangfire的日誌自定義處理,需要實現hangfire.logging.ilog和hangfire.logging.ilogprovider 介面。其中ilog介面是日誌的具體實現,ilogprovider負責提供日誌實現。
// // 摘要: // represents a way to get a hangfire.logging.ilog public inte***ce ilogprovider
ilogprovider定義
我們可以在自己實現的ilogprovider返回自己定義的ilog,然後在程式啟動時,設定logprovider
globalconfiguration.configuration.uselogprovider(new customerlogprovider())
在實現了ilog之後,當hangfire的內部處理呼叫 log處理時,如果傳入的
bool log(loglevel loglevel, funcmessagefunc, exception exception = null);
log方法定義
exception不為空,或者loglevel是error或者fatal時,就可以認為出現內部異常,需要上報異常監控資訊。
四、規劃和展望
hangfire排程框架是乙個優秀的計畫任務排程框架,其本身的監控非常重要,通過對其深入的監控埋點改造,特來電已經實現全面的智慧型監控和自動化運維,全面保障業務的連續性。未來,我們將繼續改造hangfire,根據業務的需求進行深度定製,將更多更好的特性貢獻到技術社群中,分享給大家。
特來電CMDB應用實踐
配置管理資料庫 configuration management database,以下簡稱cmdb 是乙個老生常談的話題,不同的人有不同的見解,實際應用時,因為企業成熟度以及軟硬體規模不同,別人的成功經驗很難直接複製,因此用好了會成為整個應用系統的基石,用不好就成了雞肋。特來電雲平台在規劃伊始,便...
h5學習筆記 UI庫
自從接觸了web開發以來,每天都會很糾結選什麼ui框架才是比較合適?擺在這個問題面前是乙個技術的選型。要想知道,web開發的坑實在太深。不斷地大廠推出開源框架,不斷地發現很多造輪子。或者看到乙個比較漂亮就會選。而採取vue開發,發現一大堆元件,vue的元件也是很多。vue元件式開發熟悉了其實開發也是...
H 後台UI框架,單擊按鈕增加新的選項卡
問題 使用h 時,發現單擊按鈕不能開啟新的選項卡,新頁面會直接替換掉原先的頁面 經查需要自己寫方法 一種是直接在頁面中增加js方法 我採用的 另一種是修改contabs.js檔案 參考 但我使用未實現 需求 如圖,單擊後方的檢視按鈕,檢視該行的資料對比詳情頁面。解決 在需要呼叫的頁面增加該js函式 ...