.NET Core/.NET5/.NET6 開源專案彙總2:任務排程元件

張傳寧發表於2021-06-21

開源專案是眾多組織與個人分享的元件或專案,作者付出的心血我們是無法體會的,所以首先大家要心存感激、尊重。請嚴格遵守每個專案的開源協議後再使用。尊重智慧財產權,共建和諧開源社群。

以下開源專案(含元件),從網路蒐集,後期會不斷補充。

FluentScheduler

FluentSchedule 是.NET平臺下的一款輕量級任務排程元件。介面豐富,功能強大,簡單易容。官網提供的豐富示例,讓開發者很容易上手。如果在專案中簡單的設定定時任務,優先使用該元件。

官網:https://fluentscheduler.github.io/

GitHub:https://github.com/fluentscheduler/FluentScheduler

ScheduleMaster

ScheduleMaster是一個開源的分散式任務排程系統,它基於.NET Core 3.1平臺構建,支援跨平臺多節點部署執行。

主要特性:

  •  簡易的Web UI操作;

  •  任務動態管理:建立、啟動、停止、暫停、恢復、刪除等;

  •  高可用支援,跨平臺多節點部署。

  •  資料安全性,不會出現多例項併發排程。

  •  支援自定義引數設定;

  •  支援 .NET Core 和 .NET Framework(4.6.1+);

  •  支援自定義配置檔案和熱更新;

  •  支援設定監護人,執行異常時郵件告警;

  •  支援設定任務依賴,自動觸發,共享任務結果;

  •  外掛式開發,任務執行環境隔離;

  •  全鏈路日誌系統,執行軌跡輕鬆掌控;

  •  使用者訪問控制;

  •  提供開放REST API,業務系統可以無縫整合;

  •  排程報表統計;

  •  任務分組管理;

  •  計劃表拆分實現複用;

  •  指定節點執行;

  •  支援http任務配置;

  •  支援延時任務;

  •  任務監控;

  •  資源監控;

  •  支援異常策略配置(失敗重試、超時控制等);

  •  接入redis快取;

  •  多資料庫型別支援;

  •  使用者許可權更加精細化;

  •  報表統計完善;

技術棧:

ASP.NET Core3.1、EntityFramework Core3.0、Mysql5.7、Quartz.Net、BeyondAdmin、Jquery...

Gitee:https://gitee.com/hey-hoho/ScheduleMasterCore

Quartz.NET
.NET Core/.NET5/.NET6 開源專案彙總2:任務排程元件
  Quartz.NET是.NET平臺下應用最早最廣泛的老牌定時任務任務排程元件。它是一個功能齊全的開源作業排程系統,從小的應用程式到大型企業系統都可以使用。它可以與任何其他軟體系統整合,也可以與任何其他軟體系統一起使用。它提供了簡單的操作,如排程/非排程作業、啟動/停止/暫停排程程式等。
  使用Quartz.NET可以定時輪詢資料庫同步、定時郵件通知、定時處理資料等。 Quartz.NET允許開發人員根據時間間隔(或天)來排程作業。它實現了作業和觸發器的多對多關係,還能把多個作業與不同的觸發器關聯。整合了 Quartz.NET的應用程式可以重用來自不同事件的作業,還可以為一個事件組合多個作業。

.NET Framework 通過 System.Timers.timer 類具有“內建”計時器功能。為什麼有人會使用Quartz而不是這些標準功能?
原因包括以下幾個方面:

  • 計時器沒有永續性機制。
  • 計時器的排程不靈活(只能設定開始時間和重複間隔,不能基於日期、時間等進行設定)。
  • 計時器不使用執行緒池(每個計時器一個執行緒)。
  • 計時器沒有真正的管理方案——你必須編寫自己的機制,以便能夠記住、組織和按名稱檢索任務等。

對於一些簡單的應用程式,這些功能可能並不重要,在這種情況下,不使用Quartz.NET可能是正確的決定。

官網:https://www.quartz-scheduler.net/

GitHub:https://github.com/quartznet/quartznet

Hangfire

Hangfire是一個開源框架,它幫助您建立、處理和管理後臺作業。

功能特徵:

  • 支援基於佇列的任務處理。任務執行不是同步的,而是放到一個持久化佇列中,以便馬上把請求控制權返回給呼叫者。使用方法:
BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));
  • 延遲任務(方法)執行。可以將方法的執行推遲一段指定的時間,而不是立即呼叫方法:
BackgroundJob.Schedule(() => Console.WriteLine("Hello, world!"), TimeSpan.FromMinutes(5));
  • 迴圈執行任務。只需簡單的一行程式碼就可以新增重複執行的任務,其內建了常見的時間迴圈模式,也可以基於CRON表示式來設定複雜的模式。使用方法:
RecurringJob.AddOrUpdate(() => Console.Write("Easy!"), Cron.Daily);
RecurringJob.AddOrUpdate(() => Console.Write("Powerful!"), "0 12 * */2");
  • SQL Server 與 Redis 持久化支援。Hangfire使用永續性儲存來儲存作業、佇列和統計資訊,並讓它們在應用程式重啟後繼續存在。儲存子系統的抽象程度足以支援經典的SQL Server和快速的Redis。
    • SQLServer提供了簡化的安裝和常規的維護計劃。
    • Redis提供了驚人的速度,尤其是與sqlserver相比,但需要更多的知識。
  • 自動重試機制。如果你的方法遇到了一個暫時的異常,不用擔心——它會在幾秒鐘內自動重試。如果所有重試嘗試都已用盡,則可以從整合的web介面手動重新啟動。還可以使用AutomaticRetryAttribute類控制重試行為。只需將其應用於您的方法,告訴Hangfire重試次數:
    [AutomaticRetry(Attempts = 100)]
    public static void GenerateStatistics() { }
    
    BackgroundJob.Enqueue(() => GenerateStatistics());
  • 保證執行任務。Hangfire是在知道託管環境可以殺死每行上的所有執行緒的情況下製作的。因此,它在成功完成之前不會刪除作業,並且包含不同的隱式重試邏輯以在其處理中止時執行該作業。
  • 例項方法呼叫。Hangfire除了支援靜態方法呼叫,還支援呼叫例項方法。當worker看到給定的方法是例項方法時,它將首先啟用它的類。預設情況下,使用Activator.CreateInstance方法,因此預設情況下僅支援具有預設建構函式的類。但是您可以插入IoC容器並通過建構函式傳遞依賴項。
public class EmailService
{
    public void Send() { }
}

BackgroundJob.Enqueue<EmailService>(x => x.Send());
  • 文化捕捉。當您將方法呼叫編組到另一個執行上下文中時,您應該能夠保留一些環境設定。他們中有些人-Thread.CurrentCulture以及Thread.CurrentUICulture將自動為您拍攝。PreserveCultureAttribute預設情況下,它由應用於所有方法的類完成。
  • 支援任務取消。Hangfire可以告訴方法由於shutdown事件而被中止或取消,因此可以使用類似於常規CancellationToken類的作業取消令牌來優雅地停止它們。
public void Method(IJobCancellationToken token)
{
    for (var i = 0; i < Int32.MaxValue; i++)
    {
        token.ThrowIfCancellationRequested();
        Thread.Sleep(1000);
    }
}
  • 支援IOC容器。目前支援Ninject和Autofac。
  • 支援日誌記錄。Hangfire使用Common.Logging庫來記錄其所有事件。
  • 友好的Web支援。可以在相同或不同的機器上執行多個 Hangfire 例項。它使用分散式鎖定來防止競爭條件。每個 Hangfire 例項都是冗餘的,可以無縫新增或刪除例項(但要控制它們偵聽的佇列)。
  • 支援多佇列處理。同一個Hangfire例項可以支援多個佇列,以便更好的控制任務的執行方式。
  • 併發級別的控制。Hangfire使用自己的固定工作執行緒池來消耗排隊的作業。預設工作程式計數設定為 Environment.ProcessorCount*5,即CPU數量的5倍。此數字針對CPU密集型和I/O密集型任務進行了優化。如果遇到過多的等待或上下文切換,可以手動配置工作程式的數量:
app.UseHangfire(config =>
{
    config.UseServer(100);
});

// or
var server = new BackgroundJobServer(100);
  • 多環境處理任務。預設情況下,作業處理是在 ASP.NET 應用程式中進行的。但是您可以在控制檯應用程式、Windows 服務或其他任何地方處理作業。
  • 可擴充套件性。Hangfire 旨在儘可能通用。您可以擴充套件以下部分:
    • 儲存實現
    • 狀態子系統(包括建立新狀態)
    • 創造就業的過程
    • 工作績效流程
    • 狀態變化過程
    • 工作啟用過程

一些核心元件作為擴充套件:QueueAttribute、PreserveCultureAttribute、AutomaticRetryAttribute、SqlServerStorage、RedisStorage、NinjectJobActivator、AutofacJobActivator、ScheduledState。

官網:https://www.hangfire.io/

MVP 2015社群大講堂之:在ASP.NET應用中執行後臺任務

PPT:http://pan.baidu.com/s/1eQpKURK


參考文獻:

  • https://www.cnblogs.com/redmoon/p/4394962.html

相關文章