標籤:
前言
前端時間剛開始接觸Hangfire就翻譯了一篇官方的教程[翻譯+山寨]Hangfire Highlighter Tutorial,後來在工作中需要實現一個非同步和定時執行的任務管理平台,就結合bootstrap ace模板和hangfire實現了一下。如下:
遇到的坑
1.Hangfire的任務持久化很耗效能
生產環境部署時資料庫Hangfire相關表已經手動建立好,可能忽略了哪些東西,網站運行時還是要建立,因為DBA給的許可權沒有Create所以報錯了。最好的方案是給個大點的許可權讓Hangfire自己去建立管理表。
由於許可權不夠所以想改用(localdb)\v11 存取任務持久化資料,接著問題又來了,怎麼運行localdb?這裡有個方案LocalDB在IIS上如何成功配置,需要許可權,果斷放棄。實在不行就把任務資料持久化到記憶體吧,順利上線了。少量測試時沒發現問題,當我建立了68W個任務時,發現記憶體佔用了2.6G,cpu也一直在80%以上。本來以為這麼大記憶體是我的Job導致的,首先想到如果IIS重啟了任務資訊不能繼續是個大問題,所以不得不找營運商量一下把這個任務相關表建立到另外一個我們自己管理的資料庫上(另外一台機器)。等配置好資料庫連接重新添加68W個任務時發現,應用伺服器的記憶體才300多M,任務儲存資料庫的物理檔案有2G多,資料庫的cpu佔用也上升了不少。這才意識到Hangfire的任務持久化是很耗效能的,同時也慶幸沒有和應用資料放在一個資料庫中。
2.Hangfire Dashboard 遠端存取
預設情況下Hangfire 只允許本機訪問Dashboard ,所以部署在伺服器上之後就不能像本地一樣即時查看任務狀態了。解決方案 關於 hangfire 的許可權問題
3.修改Hangfire的重試次數和並發個數
//設定Hangfire執行Job失敗後的嘗試次數,預設值是10 GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute(){Attempts = 3}); //設定Hangfire並發處理Job的個數,預設值是 cpu個數*5 var options = new BackgroundJobServerOptions {WorkerCount = 10}; app.UseHangfireServer(options);
4.如何刪除未執行的任務
還沒找到方法
Hangfire的流弊只處
0.遠程查看任務執行狀態
1.代碼異常直接可以從Dashboard面板中查看堆棧
2.任務可以有傳回值,在Dashboard的面板中也可以看到
3.hangfire支援多個server,還沒研究怎麼用,以後用到再補充
有用的連結:
使用 Hangfire 如何知道那個 Job 執行了多久呢使用 Hangfire 來處理非同步的工作關於 hangfire 的許可權問題
hangfire+bootstrap ace 模板實現背景工作管理平台