使用 Hangfire 如何知道那個 Job 執行了多久呢?
當我們將原本同步執行的Job,放到了 Hangfire 之中,
我們要如何知道那個Job到底在 Hangfire 之中等了多久,
而透過 Hangfire 去執行時,實際上是執行多久呢?
參考「Duration and latency metrics for succeeded jobs」這篇可以得知,
在Job的詳細資料中,Succeeded時,裡面有2個時間,Latency 及 Duration 。
Latency:表示這個 Job 在 Hangfire 之中等了多久,才被執行。
Duration:表示這個 Job 透過 Hangfire 執行到成功,花了多少時間。
也可以查詢 Hangfire DB中 State 的資料表,如下,
select J.Arguments, S.Data
from [HangFire].[Job] J inner join [HangFire].[State] S
on J.Id = S.JobId
where S.Name = 'Succeeded'
因為 State.Data 裡面是 JSON 字串,如果要解析它的話,可以拿「Consuming JSON Strings in SQL Server」裡面的Function,
然後取出相關的資訊,如下,
select J.Id, J.Arguments, SD.NAME, SD.StringValue as ExecMS
from [HangFire].[Job] J inner join [HangFire].[State] S
on J.Id = S.JobId
cross apply dbo.parseJSON(S.Data) SD
where S.Name = 'Succeeded'
and SD.NAME IN ('PerformanceDuration', 'Latency');
所以可以依這2個值來調整 Hangfire 的 WorkerCount 哦! 程式片斷如下,
var options = new BackgroundJobServerOptions
{
//設定 Hangfire 同一時間,可以處理多少的 Job
WorkerCount = DegreeOfParallelism,
};
//設定 Retry 的次數
GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute { Attempts = RetryTimes });
_backgroundJobServer = new BackgroundJobServer(options);
參考資料
Duration and latency metrics for succeeded jobs
Consuming JSON Strings in SQL Server
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^