HangFire進階

免費版有什麼限制

Hangfire 提供了兩個版本:Community 版本和商業版(Enterprise Edition)。其中,Community 版本是免費的,而商業版需要購買許可證。

免費版

  • 僅支持使用 SQL Server、PostgreSQL、MySQL 和 Redis 作爲存儲後端,無法使用 Oracle、MongoDB 等其他數據庫。
  • 不能使用商業版中的一些高級功能,如實時控制面板、批量作業以及持續性集合等。
  • 開源協議要求必須公開源代碼,無法閉源定製或二次開發。
  • 只能在開源協議下進行使用和分發,不能用於商業行爲或盈利。

hangfire 是如何傳遞方法與參數的

在 Hangfire 中,要將一個方法包裝成一個後臺作業,並添加到 Hangfire 的隊列中執行,有多種方式可以實現。下面是其中的兩種方式:
使用 Lambda 表達式最簡單的方式是直接將待執行的方法體寫在 Lambda 表達式中,並將該表達式作爲參數傳遞給 Hangfire
BackgroundJob.Enqueue(() => DoSomething());
其中,DoSomething() 是待執行的方法。Hangfire 會將該 Lambda 表達式封裝成一個後臺作業,並將其添加到 Hangfire 的隊列中等待執行。

另一種方式是使用反射來調用待執行的方法。這種方式需要指定方法名、類名和參數,如下所示:
BackgroundJob.Enqueue(() => MyClass.MyMethod("param1", 123));
其中,MyClass 是包含待執行方法的類名,MyMethod 是待執行方法的名稱,"param1" 和 123 則是方法的參數。Hangfire 會使用反射來調用指定的方法,並將其封裝成一個後臺作業添加到 Hangfire 隊列中等待執行。

無論使用哪種方式,Hangfire 都會將要執行的方法和參數序列化成 JSON 格式,並存儲到 Hangfire 的存儲中(如 SQL Server、Redis 等),以便在之後的某個時間點重新加載該數據,並根據其中的信息來執行作業。當作業開始執行時,Hangfire 會將該 JSON 數據反序列化成對應的方法和參數,並在獨立的線程中執行該方法。

任務數據存放在job

image
image

執行結果數據state

image

hangfire如何實現多負載

在不同的服務器上部署多個 Hangfire 服務,並將這些服務連接到同一個存儲後端(如 SQL Server、Redis 等)。這樣每個服務都會獨自運行,並從存儲後端中獲取待執行的作業信息並執行作業。由於所有服務連接到同一個存儲後端,因此它們可以共享作業的執行狀態以及作業執行日誌等信息。

BackgroundJobServerOptions比較重要的參數

image

SchedulePollingInterval

SchedulePollingInterval 時間間隔越短,掃描計劃作業隊列的頻率越高,可以更快地發現過期任務並執行,但也會增加後臺處理器的負擔和資源佔用。
SchedulePollingInterval 時間間隔越長,則意味着掃描計劃作業隊列的頻率越低,系統負擔和資源佔用也相應減少,但可能會導致過期任務無法及時執行。
需要注意的是,SchedulePollingInterval 參數僅控制計劃作業隊列的掃描間隔,即對那些尚未到期的計劃任務不會產生影響。而一旦檢測到計劃任務已到期,則 Hangfire 會立即將其添加到普通作業隊列中,等待後臺處理器執行。因此,SchedulePollingInterval 參數的合理設置,可以幫助您控制和優化 Hangfire 後臺任務處理的性能表現和資源消耗。

WorkerCount

WorkerCount 是 Hangfire 中 BackgroundJobServerOptions 類型的一個參數,表示該服務器允許同時處理的工作者數量。簡單來說,WorkerCount 參數指定了可以同時並行處理多少個作業任務,也就是可以同時運行多少個 Job。

Queues

Queues 是 Hangfire 中 BackgroundJobServerOptions 類型的一個參數,用於指定可以處理的作業隊列名稱。簡單來說,Queues 參數允許您將作業任務分配到不同的隊列中,以便使用不同的處理器來處理這些隊列,從而實現作業任務的優先級和分組管理。

//在 Enqueue 方法中,可以通過傳遞第二個參數 queueName 來指定要將作業添加到哪個隊列中。例如,以下代碼將發送電子郵件任務添加到名爲 "email" 的隊列
BackgroundJob.Enqueue(() => SendEmail("[email protected]"), "email");

GlobalJobFilters

//作業日誌
GlobalJobFilters.Filters.Add(new LogJobFilterAttribute());
//自動重試功能
GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute { Attempts = 0 });

hangFire server 如何優雅的關閉服務器

var server = new BackgroundJobServer();
// 做一些其它事情...
server.SendStop();

在上述示例中,首先創建了一個新的 BackgroundJobServer 實例,然後在該實例上執行了一些其它操作。最後,調用 SendStop() 方法來關閉服務器,它將等待所有正在運行的作業完成後纔會關閉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章