.NET Core开源组件:后台任务利器之Hangfire
一.簡(jiǎn)述
Hangfire作為一款高人氣且容易上手的分布式后臺(tái)執(zhí)行服務(wù),支持多種數(shù)據(jù)庫(kù)。在.net core的環(huán)境中,由Core自帶的DI管理著生命周期,免去了在NF4.X環(huán)境中配置always running的麻煩,真正做到開(kāi)箱即用。
二.安裝
Hangfie官方支持是MsSql和redis,除此之外,可供選擇的還有PostgreSql和Mongo。
在應(yīng)用入口項(xiàng)目需要引用Hangfire.AspNetCore和特定持久庫(kù),比如使用了MsSql數(shù)據(jù)庫(kù)的Hangfire.SqlServer。
而在其他項(xiàng)目(比如bll層的項(xiàng)目),只需引用基礎(chǔ)的Hangfire.Core就可以了。
三.Startup配置
1.注入Hnagfire服務(wù)
services.AddHangfire(x => x.UseSqlServerStorage("<connection string>"));2.可選配置
啟動(dòng)Hangfire服務(wù)和對(duì)應(yīng)的web面板如下:
app.UseHangfireServer();//啟動(dòng)Hangfire服務(wù) app.UseHangfireDashboard();//啟動(dòng)hangfire面板細(xì)心的觀眾可能會(huì)發(fā)現(xiàn),這兩個(gè)方法都有可選參數(shù),可以提供更多的配置。
2.1 配置任務(wù)屬性
var jobOptions = new BackgroundJobServerOptions { ? ? ? Queues = new[] { "test","default" },//隊(duì)列名稱,只能為小寫 ? ? ? WorkerCount = Environment.ProcessorCount * 5, //并發(fā)任務(wù)數(shù) ? ? ? ServerName="hangfire1",//服務(wù)器名稱 }; app.UseHangfireServer(jobOptions);Queues?要處理的隊(duì)列列表
對(duì)于有多個(gè)服務(wù)器同時(shí)連接到數(shù)據(jù)庫(kù),Hangfire會(huì)認(rèn)為他們是分布式中的一份子。現(xiàn)實(shí)中不同服務(wù)器往往存在著差異,這個(gè)時(shí)候就需要合理配置服務(wù)器(應(yīng)用)的處理隊(duì)列,舉兩個(gè)例子:
1.對(duì)于服務(wù)器性能差異的處理,有100個(gè)A任務(wù)和50個(gè)B任務(wù)需要處理,假設(shè)A服務(wù)器的性能是B服務(wù)器的兩倍,如果不配置隊(duì)列,那么會(huì)平分任務(wù)給兩個(gè)服務(wù)器。如果我們只讓B服務(wù)器處理B任務(wù),而A服務(wù)器同時(shí)處理兩種任務(wù),這樣B就能減少一些壓力。
2.對(duì)于服務(wù)器能力差異的處理,假設(shè)A服務(wù)器能處理A和B兩種任務(wù),B服務(wù)器只能處理B任務(wù)(沒(méi)有處理A任務(wù)的方法或?qū)ο?#xff09;,如果不配置隊(duì)列,默認(rèn)會(huì)讓B也執(zhí)行A任務(wù),從而產(chǎn)生錯(cuò)誤。反面一想,如果A服務(wù)器和B服務(wù)器都有共同的接口,B服務(wù)器不實(shí)現(xiàn)接口的方法,發(fā)起一個(gè)專屬于A服務(wù)器隊(duì)列的任務(wù),而A服務(wù)器通過(guò)注入實(shí)現(xiàn)接口的方法,可以達(dá)到傳遞任務(wù)的效果。
WorkerCount?并發(fā)任務(wù)數(shù),超出并發(fā)數(shù)將等待之前的任務(wù)完成
默認(rèn)的并發(fā)任務(wù)數(shù)是線程(cpu)的5倍,如果IO密集型任務(wù)多而CPU密集型的任務(wù)少,可以考慮調(diào)高并發(fā)任務(wù)數(shù)。
以上是我用到的,當(dāng)然還有其他配置參數(shù)等著你去開(kāi)發(fā)。
2.2.配置訪問(wèn)權(quán)限
在實(shí)際生產(chǎn)中,我們可能不希望任何人都可以訪問(wèn)面板,或暫停執(zhí)行某些任務(wù),這時(shí)就需要重寫面板的權(quán)限了。默認(rèn)情況下,只有本地訪問(wèn)權(quán)限才能使用Hangfire儀表板。所以需要重寫控制面板,以便遠(yuǎn)程訪問(wèn)。
var options = new DashboardOptions { ? ?Authorization = new[] { new HangfireAuthorizationFilter() } }; app.UseHangfireDashboard("/hangfire", options); public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter { ? ? ? ?//這里需要配置權(quán)限規(guī)則 ? ? ? ?public bool Authorize(DashboardContext context) ? ? ? ?{ ? ? ? ? ? ?return true; ? ? ? ?} }三.使用(文檔)
frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 701px; height: 482px;">
任務(wù)類型
Fire-and-forget?直接將任務(wù)加入到待執(zhí)行任務(wù)隊(duì)列
Delayed?在當(dāng)前時(shí)間后的某個(gè)時(shí)間將任務(wù)加入到待執(zhí)行任務(wù)隊(duì)列
Recurring?周期性任務(wù),每一個(gè)周期就將任務(wù)加入到待執(zhí)行任務(wù)隊(duì)列
Continuations?顧名思義,繼續(xù)執(zhí)行任務(wù)
1.簡(jiǎn)單入門
using (var connection = JobStorage.Current.GetConnection()) { ? ? ? var storageConnection = connection as JobStorageConnection; ? ? ? if (storageConnection != null) ? ? ? ?{ ? ? ? ? ? ?//立即啟動(dòng) ? ? ? ? ? var jobId = BackgroundJob.Enqueue(()=>Console.WriteLine("Fire-and-forget!")); ? ? ? } }當(dāng)然,不僅僅只有靜態(tài)方法可以執(zhí)行,Hangfire的任務(wù)也是支持.net core的依賴注入的,會(huì)構(gòu)造一個(gè)對(duì)象并執(zhí)行對(duì)應(yīng)的方法。
BackgroundJob.Enqueue<SomeClass>(i => i.SomeMethod(someParams))2.進(jìn)階功能
2.1設(shè)置任務(wù)隊(duì)列
[Queue("test")]public void TestQueue() { }對(duì)于非周期任務(wù),只需要在執(zhí)行的方法添加Queue的特性就能指定該任務(wù)讓特定的隊(duì)列服務(wù)器處理。
而周期任務(wù),則需要先聲明:
2.2 使用日志過(guò)濾器(點(diǎn)我查看)
Hangfire支持自定義過(guò)濾器,可以對(duì)任務(wù)在創(chuàng)建時(shí)、執(zhí)行中、執(zhí)行后等等狀態(tài)執(zhí)行特定特定的操作。
//特定方法過(guò)濾器 [LogEverything]public static void Send() { }//全局過(guò)濾器 GlobalJobFilters.Filters.Add(new LogEverythingAttribute());四.中文翻譯
hangfire是一個(gè)不錯(cuò)的開(kāi)源后臺(tái)任務(wù)組件,很奇怪的是沒(méi)有中文文檔。最近幾天,簡(jiǎn)單地用谷歌機(jī)翻修改了部分章節(jié),如果哪位同行看完后有興趣翻譯,可以聯(lián)系一下我。
文檔在github的地址:https://github.com/jonechenug/Hangfire-Chinese-Doc
docker運(yùn)行并訪問(wèn)本地8080端口:
docker run --restart always ?--name hangfire -d -p 8080:80 daocloud.io/koukouge/hangfirezhdoc相關(guān)文章
ASP.NET 執(zhí)行后臺(tái)任務(wù)的利器——Hangfire
Hangfire項(xiàng)目實(shí)踐分享
原文地址: http://www.cnblogs.com/chenug/p/6655636.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的.NET Core开源组件:后台任务利器之Hangfire的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微软宣布12月15日关闭开源软件托管平台
- 下一篇: 在ASP.NET Core中使用Apwo