.NET Core Hangfire週期性作業排程問題

Jeffcky發表於2020-06-21

前言

四月中旬Hangfire團隊釋出了1.7.11版本,在使用週期性作業排程過程中發現一個問題,這個問題應該一直未解決,故做此記錄,希望遇到的童鞋根據專案業務而避開這個問題。

週期性作業排程

我們依然是在控制檯中進行測試,下載所需包請參考官方文件,這裡不再敘述,首先我們在記憶體中儲存資料,如下:

var storageOpts = new MemoryStorageOptions();

GlobalConfiguration.Configuration.UseMemoryStorage(storageOpts);

using var server = new BackgroundJobServer();

RecurringJob.AddOrUpdate("job1", () => Print1(), "*/10 * * * * *", TimeZoneInfo.Local);

RecurringJob.AddOrUpdate("job2", () => Print2(), "*/10 * * * * *", TimeZoneInfo.Local);

RecurringJob.AddOrUpdate("job3", () => Print3(), "*/10 * * * * *", TimeZoneInfo.Local);
public static void Print1()
{
    Console.WriteLine("start1");
}

public static void Print2()
{
    Console.WriteLine("start2");
}

public static void Print3()
{
    Console.WriteLine("start3");
}

Hangfire已支援秒級(1.7+)週期作業排程,如上程式碼,我們每隔10秒執行上述3個作業,列印如下:

 

基於記憶體儲存間隔10秒執行對應作業,根據上述列印結果來看沒有問題,接下來我們使用SQLite來儲存作業資料看看,首先下載Hangfire.SQLite包,針對控制檯需進行如下配置

GlobalConfiguration.Configuration.UseSQLiteStorage("Data Source=./hangfire.db;");

當我們啟動控制檯時一定會丟擲如下異常,其異常旨在表明需要SQLite驅動

我們去下載微軟官方針對SQLite的驅動(Microsoft.Data.Sqlite)

 接下來我們將發現對於每一個作業都會重複執行多次,如下:

猜測只會在SQLite資料庫中才會存在問題吧,為了解決這個問題,做了一點點嘗試,但還是無法從根本上完全解決,我們知道Hangfire服務的預設工作數量為當前機器的處理器數量乘以5即(Environment.ProcessorCount * 5),那麼我們嘗試給1是不是可以規避這個問題

var options = new BackgroundJobServerOptions()
{
    WorkerCount = 1
};

using var server = new BackgroundJobServer(options);

 

上述設定後,我們可以看到貌似只執行了一次,但是這種情況還是是隨機的並不靠譜,比如多執行幾次看看,會出現如下可能情況

 

沒招了,找了下官方issue列表,發現此問題(https://github.com/mobydi/Hangfire.Sqlite/issues/2)一直處於開啟狀態並未得到解決,所以要麼看看能否根據專案業務規避這個問題或者下載原始碼自行除錯解決

總結

本文是在使用Hangfire過程中發現SQLite資料庫出現的問題,因針對Hangfire的SQLite具體實現並不是官方團隊所提供,所以暫不能確定到底是Hangfire.SQLite包提供者的問題,根據issue描述大概率是Hangfire的一個bug,希望在SQLite儲存作業等資料存在的問題引起使用者注意。

相關文章