后台任务利器之Hangfire

后台任务利器之Hangfire

一.简述

Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库。在.net core的环境中,由Core自带的DI管理着生命周期,免去了在NF4.X环境中配置always running的麻烦,真正做到开箱即用。

二.安装

Hangfie官方支持是MsSql和redis,除此之外,可供选择的还有PostgreSqlMongo
在应用入口项目需要引用Hangfire.AspNetCore和特定持久库,比如使用了MsSql数据库的Hangfire.SqlServer
而在其他项目(比如bll层的项目),只需引用基础的Hangfire.Core就可以了。

三.Startup配置

1.注入Hnagfire服务

services.AddHangfire(x => x.UseSqlServerStorage("<connection string>"));

2.可选配置

启动Hangfire服务和对应的web面板如下:

 app.UseHangfireServer();//启动Hangfire服务
 app.UseHangfireDashboard();//启动hangfire面板

细心的观众可能会发现,这两个方法都有可选参数,可以提供更多的配置。

2.1 配置任务属性

var jobOptions = new BackgroundJobServerOptions
{
       Queues = new[] { "test","default" },//队列名称,只能为小写
       WorkerCount = Environment.ProcessorCount * 5, //并发任务数
       ServerName="hangfire1",//服务器名称
 };
app.UseHangfireServer(jobOptions);

Queues 要处理的队列列表
对于有多个服务器同时连接到数据库,Hangfire会认为他们是分布式中的一份子。现实中不同服务器往往存在着差异,这个时候就需要合理配置服务器(应用)的处理队列,举两个例子:
1.对于服务器性能差异的处理,有100个A任务和50个B任务需要处理,假设A服务器的性能是B服务器的两倍,如果不配置队列,那么会平分任务给两个服务器。如果我们只让B服务器处理B任务,而A服务器同时处理两种任务,这样B就能减少一些压力。

2.对于服务器能力差异的处理,假设A服务器能处理A和B两种任务,B服务器只能处理B任务(没有处理A任务的方法或对象),如果不配置队列,默认会让B也执行A任务,从而产生错误。反面一想,如果A服务器和B服务器都有共同的接口,B服务器不实现接口的方法,发起一个专属于A服务器队列的任务,而A服务器通过注入实现接口的方法,可以达到传递任务的效果。

WorkerCount 并发任务数,超出并发数将等待之前的任务完成
默认的并发任务数是线程(cpu)的5倍,如果IO密集型任务多而CPU密集型的任务少,可以考虑调高并发任务数。

以上是我用到的,当然还有其他配置参数等着你去开发。

2.2.配置访问权限

在实际生产中,我们可能不希望任何人都可以访问面板,或暂停执行某些任务,这时就需要重写面板的权限了。默认情况下,只有本地访问权限才能使用Hangfire仪表板。所以需要重写控制面板,以便远程访问。

 var options = new DashboardOptions
{
    Authorization = new[] { new HangfireAuthorizationFilter() }
};
app.UseHangfireDashboard("/hangfire", options);
public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
{
        //这里需要配置权限规则
        public bool Authorize(DashboardContext context)
        {
            return true;
        }
}

三.使用(文档)

任务类型

Fire-and-forget 直接将任务加入到待执行任务队列
Delayed 在当前时间后的某个时间将任务加入到待执行任务队列
Recurring 周期性任务,每一个周期就将任务加入到待执行任务队列
Continuations 顾名思义,继续执行任务

1.简单入门

using (var connection = JobStorage.Current.GetConnection())
 {
       var storageConnection = connection as JobStorageConnection;
       if (storageConnection != null)
        {
            //立即启动
           var jobId = BackgroundJob.Enqueue(()=>Console.WriteLine("Fire-and-forget!"));
       }
 }

当然,不仅仅只有静态方法可以执行,Hangfire的任务也是支持.net core的依赖注入的,会构造一个对象并执行对应的方法。

BackgroundJob.Enqueue<SomeClass>(i => i.SomeMethod(someParams))

2.进阶功能

2.1设置任务队列

[Queue("test")]
public void TestQueue()
{
}

对于非周期任务,只需要在执行的方法添加Queue的特性就能指定该任务让特定的队列服务器处理。
而周期任务,则需要先声明:

RecurringJob.AddOrUpdate(() => Console.WriteLine("Recurring!"),Cron.Daily,queue:"test");

2.2 使用日志过滤器(点我查看)

Hangfire支持自定义过滤器,可以对任务在创建时、执行中、执行后等等状态执行特定特定的操作。

//特定方法过滤器
[LogEverything]
public static void Send() {
}
//全局过滤器
GlobalJobFilters.Filters.Add(new LogEverythingAttribute());

四.中文翻译

hangfire是一个不错的开源后台任务组件,很奇怪的是没有中文文档。最近几天,简单地用谷歌机翻修改了部分章节,如果哪位同行看完后有兴趣翻译,可以联系一下我。

文档在github的地址:https://github.com/jonechenug/Hangfire-Chinese-Doc

docker运行并访问本地8080端口:

docker run --restart always  --name hangfire -d -p 8080:80 daocloud.io/koukouge/hangfirezhdoc
时间: 2024-10-29 10:45:58

后台任务利器之Hangfire的相关文章

Android UI开发神兵利器之Angrytools

最近很多人在问我,个人App开发者如何去设计UI. 其实这是个人开发者最头痛的问题,搞技术的人,确实没法做到面面俱到,不可能花大量的时间去切图,去做原型设计,去做美工. 当然,虽然我们设计不出那么复杂,精巧的UI,但是简单的东西,我们在没有美工的基础上,通过一些手段,也是可以做的不错的,从本文开始,我们将介绍一些关于Android界面开发的神兵利器,正是这些大神们开发的工具,让Coder也能做出一些不是那么见不得人的设计. Angrytools,我们今天的主角,我想当初作者也是被UI弄的Angr

Linux菜鸟升级利器之ansible

一.absible是什么? ansible是一款简单的.开源的自动化管理工具.它通过Openssh工作,没有服务器:并且被管理的客户端上面并不需要安装什么客户端软件或启动什么守护进程,没有客户端:扩展模块可以使用任何语言编写:命令自动传输到管理机执行,并返回结果: 二.安装ansible 安装ansible需要使用Fedora的EPEL源,所以要先配置好yum的epel源,在yum源文件中添加: [base1] name=epel baseurl=http://dl.fedoraproject.

web开发利器之grunt

伴随着项目的多样化和复杂化,前端的代码维护和管理(打包.压缩等等)也越来越难以维护,人为的疏忽往往会导致不可预期的错误,对于这样的错误给我们带来了很多的麻烦和多余的工作量:对于前端的项目携同开发来说,我们每个人均会负责不同板块,将JS.CSS拆解成各自个的模块单独开发,为了方便管理这些模块均为独立的文件,而为了页面加载速度(增加了文件个数这时也产生过多的Http请求,影响页面加载速度)我们又不得不将这些文件进行合并.压缩等等,早期我们会用YUI做这些事但如今我们需要的却更多(如项目的源代码做单元

Android UI开发神兵利器之Android Action Bar Style Generator

ActionBar是3.0后的UI设计规范,同时也是Google极力推荐使用的设计风格,如何快速设计一个入眼的ActionBar呢,更进一步,给我们搭好一个入眼的ActionBar的模板吧,于是Android Action Bar Style Generator就出来了:http://jgilfelt.github.io/android-actionbarstylegenerator/ 国际惯例,上图 一目了然,小清新加大方便:大家应该都知道怎么用了吧,so easy! Android UI开发

Android UI开发神兵利器之Icon

好的设计离不开Icon 话不多,介绍2个国外的网站,一个用来找Icon,一个用来搞页面设计 http://dryicons.com/free-icons/ http://www.webdesignshock.com/ 简单易用,纯干货 Android UI开发神兵利器之Icon

执行后台任务的利器&mdash;&mdash;Hangfire

今年1月31日,在微软的MVP 2015社区大讲堂上,我给大家分享了一个演讲:在ASP.NET应用中执行后台任务.其中介绍了三种技术的应用:QueueBackgroundWorkItem.Hangfire和Azure WebJobs.当时由于时间关系,对三者都是简要介绍.今天想和大家着重介绍下Hangfire. Hangfire是一个开源且商业免费使用的工具函数库.可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于Wind

Windows渗透利器之Pentest BOX使用详解(一)

内容概览:                                     知识科普                                    优缺点总结 功能参数详解翻译: 控制台参数详解翻译 setting各项功能参数翻译详解: 基本设置(含外观,字体,标签栏等设置) 启动设置(含任务栏其他等) 特征 综合参数 宏设置 文本管理器 基础信息 知识科普: Pentest Box在2015年发布,具体月份不详.Pentest Box开源项目的创始人是Aditya Agrawa

性能调优利器之strace

最近需要对一个自己开发的socket server的性能进行分析,刚开始还想了好长时间怎么来分析.后来才意识到其实使用strace就足够了. 观察到的现象是server单进程CPU使用率97,但磁盘i/o只有400MB/s,但这块磁盘可以达到>1GB/s的速度,于是在server开始跑之后直接用 strace -r -p pid -o outfile cat outfile |awk -F'(' '{print $1}'|awk '{print $1,$2}' >outfile.count 之

Android各组件/控件间通信利器之EventBus

实际项目开发过程中,经常遇到如下场景:不同的应用程序组件的控件间具有一定的相互关联性,其中用户对后者进行的某种操作会引起前者的相应改变.举一个具体的场景:以糗事百科为例,在糗事列表页和详情页页,对于每个糗事而言,布局基本一致,在详情页点击了个赞,赞的数量增加,同时赞的图标发生了变化,此时返回到列表页,此糗事上的赞图标以及数量与刚刚详情页的需要保持一致.在举一个例子,对于多个底部导航tab下的资讯类阅读app,在咨询详情页点击了收藏,然后收藏成功,此时回到底部tab中的个人中心,假如个人中心中有我